Skip to main content

A library of classes and helper functions to support game development in Pygame

Project description

PygamePal

A library of classes and functions to support game development in Pygame.

  • Simple, beginner-friendly interface.
  • Choose the bits you want to use, and continue to use Pygame for everything else!

Usage

  • Install: pip install pygamepal, or
  • Install from local source: pip install -e [repo path]

Add suggestions and bugs here!

Getting started

Licence

Distributed under the MIT License. See LICENSE for more information.

Contents

Game (create a game with minimal setup) -- Template // Example

# create new game subclass and instance
class MyGame(pygamepal.Game):
    # add init(), update() and draw() methods
myGame = MyGame()
myGame.run()
myGame.quit()

# properties
self.size = (x, y)
self.caption = 'text'
self.icon = pygame.image.load('imageURL')
self.fps = x
self.screen
self.gameTime
self.currentScene
self.input
self.events

# methods to create in subclass
self.init()
self.update(gameTime)
self.draw()

# optional other methods
self.addSprite(sprite)
self.removeSprite(sprite)

Scene -- Scene Example

# class structure
class MyScene(pygamepal.Scene):
    def init(self):
        pass
    def update(self):
        pass
    def draw(self):
        pass
    def onActive(self):
        pass
    def onInactive(self):
        pass

# create instance, passing in game object
myScene = MyScene(game)
# optional methods
myScene.addSprite(sprite)
myScene.removeSprite(sprite)

# properties
myScene.sortKey = [myScene.sortByZ | myScene.sortByLeft | myScene.sortByRight | myScene.sortByTop | myScene.sortByBottom]

Sprite -- Sprite Example

# class structure
# (pygamepal.Sprite inherits from pygame.Sprite)
class MySprite(pygamepal.Sprite):
    def init(self):
        pass
    def update(self):
        pass
    def onAddedToScene(self):
        pass
    def onRemovedFromScene(self):
        pass

# create instance
mysprite = MySprite(imageName=None, texture=None, position=(0, 0), size=(0, 0), z=0, collider=None, scaleImage=False)
# optional methods
mySprite.getCenter()
mySprite.touching(sprite)
mySprite.getCollidingSprites(newPosition)
# if using sprites without scenes:
mySprite.updateWithoutParentScene(deltaTime=1)
mySprite.drawWithoutParentScene(surface)

# properties
self.position
self.z
self.size
self.collider
self.spriteImage
self.currentScene

Input -- Key Example // Mouse Example

# create new instance
input = pygamepal.Input(longPressDuration=60, doublePressTimeout=30)

# update() must be called once per frame
input.update(deltaTime=1)
# key press methods
input.isKeyDown(keycode)
input.isKeyPressed(keycode)
input.isKeyDoublePressed(keycode)
input.isKeyReleased(keycode)
input.getKeyDownDuration(keycode)
input.isKeyLongDown(keycode)
input.isKeyLongPressed(keycode)
input.getKeyLongPressPercentage(keycode)
# mouse button methods
input.isMouseButtonDown(mouseButton)
input.isMouseButtonPressed(mouseButton)
input.isMouseButtonDoublePressed(mouseButton)
input.isMouseButtonReleased(mouseButton)
input.getMouseButtonDownDuration(mouseButton)
input.isMouseButtonLongDown(mouseButton)
input.isMouseButtonLongPressed(mouseButton)
input.getMouseButtonLongPressPercentage(mouseButton)

SpriteImage -- Example // Showcase

# create new instance
spriteImage = pygamepal.spriteImage()

# add one or more sprites, associated with a state
spriteImage.addTextures(firstTexture, *moreTextures, state=None, animationDelay=12, loop=True, hFlip=False, vFlip=False)

# update() must be called once per frame
spriteImage.update()

# draw the current image/animation frame
spriteImage.draw()

# change the current image/animation state
# (does not need to be called for sprite with single state)
spriteImage.setState(state)

# resets the current animation
spriteImage.reset()

spriteImage.pause

Camera -- Example

# creates a new camera instance
camera = pygamepal.Camera(
    self, position = (0, 0), size = (640, 480),
    target = (0, 0),
    # follow delay is a (clamped) value between
    # 0 (instant snap to target) and 1 (no movement)
    lazyFollow = 0,
    # passed value for 'zoom' will be clamped
    # between 'minZoom' and 'maxZoom' values
    zoom = 1, minZoom = 0.1, maxZoom = 10,
    # zoom follow delay is a (clamped) value between
    # 0 (instant zoom) and 1 (no zoom)
    lazyZoom = 0,
    backgroundColor = 'gray30',
    borderColor='black', borderThickness = 2, 
    clamp = False, clampRect = (0, 0, 1000, 1000)
    # camera shake
    # oscillate speed (0 = no movement, 1 = fast)
    oscillateSpeed = 0.2,
    # amount of movement
    shakeMagnitude = 30,
    # movement vector
    shakeDirection = (1, 0),
    # shake dampening (0 = none, 1 = lots)
    shakeDampening = 0.4,
    # shake noise (0 = none, 10 = lots)
    shakeNoise = 0.8
)

# update() must be called once per frame
camera.update(deltaTime=1)

# draws surface to the destinationSurface, using camera attributes
camera.draw(surface, destinationSurface)

# shakes the camera
camera.shake(direction=(1, 0))

Particles -- Example

# creates a new particle emitter
particles = pygamepal.particles(
    # emitter attributes
    emitterPosition=(0,0), emitterSize=(0,0),
    emitterLifetime=100,
    emitterVelocity=(0,0), emitterAcceleration=(0,0),
    emitterParticleDelay=5,
    # particle attributes
    particleVelocityMin=(-1,-1), particleVelocityMax=(1,1),
    particleAccelerationMin=(0,0), particleAccelerationMax=(0,0),
    particleLifetime=100,
    particleSize=20,
    particleSizeDecay=0.2,
    particleColors=None
)

# update() must be called once per frame
particles.update(deltaTime=1)

# call draw() once per frame to draw all particles
particles.draw(surface)

Transitions -- Example // Showcase

Transition types:

  • TransitionFade
  • TransitionFadeToBlack
  • TransitionWipeLeft
  • TransitionWipeRight
  • TransitionWipeUp
  • TransitionWipeDown
  • TransitionMoveLeft
  • TransitionMoveRight
  • TransitionMoveUp
  • TransitionMoveDown

Easing functions

  • linear
  • bounceEaseOut
# creates a new transition instance
transition = pygamepal.TransitionFade(fromSurface=None, toSurface=None, duration=100, easingFunction=linear)

# update() and draw() should be called each game loop frame
transition.update(deltaTime=1)
transition.draw(surface)

# transition properties
transition.duration = x # number of frames (default) / game time in ms
transition.easingFunction = pygampal.bounceEaseOut

Triggers -- Example

# creates a new trigger
# -- onCollide is executed every frame that this trigger collides with another
# -- onEnter is executed once on collision
# -- onExit is executed once when triggers are no longer colliding
# -- these functions should be of the form, e.g.:
# -- def onEnter(thisTrigger, otherTrigger):
# --     [add code here]
trigger = pygamepal.Trigger(x=0, y=0, w=10, h=10, onEnter=None, onCollide=None, onExit=None)

# update() must be called once per frame
trigger.update(deltaTime=1)

# you can call draw() to see triggers
trigger.draw(screen)

Buttons -- Example

# create a new button
button = pygamepal.Button(
    # input is not optional
    input,
    position = (0,0), size = (100,50),
    label = None,
    fgColor = 'white', bgColor = 'black',
    borderWidth = 1,
    borderColor = 'white',
    image = None,
    # this method called when highlighted
    onHighlighted = None,
    # this method is called when selected
    onSelected = None,
    # updateMethod and drawMethod give the ability
    # to override default button befaviour
    updateMethod = None,
    drawMethod = None,
    # a keycode can also be associated with a button
    # (only works if pygamepal.input is specified)
    keyCode = None
)

# call update() and draw() each frame
button.update(deltaTime = 1)
button.draw(screen)

# if creating your own update method, you
# may want to use the following methods
# to set the button state
self.setHighlighted()
self.setSelected()

# if creating your own draw method, you
# may want to use the following methods
# to draw the button components
self.drawBackground(screen)
self.drawImage(screen)
self.drawText(screen)
self.drawBorder(screen)

Animator -- Example

# create a new animator
animator = Animator()

# add an animation to the animator
animator.addAnimation(object, parameter, newValue, duration=1, easingFunction=easeLinear, type=float)

# update the animator each frame
animator.update(deltaTime=1)

Utility functions

# draws text with minimal required parameters
drawText(screen, text, x, y, font=None, antialias=True, color='white', background=None)
# minimal example:
drawText(screen, 'Hello, world!')

# returns a list of sub-textures from a large spritesheet/texture
# the list has the same dimensions as the original texture, but
# can be flattened using flatten(2dList).
splitTexture(texture, newTextureWidth, newTextureHeight)
# simple example, splitting a single 96x32 spritesheet into 4 separate textures:
textureList = splitTexture(texture, 32, 32)
firstTexture = textureList[0][0] # or firstTexture = flatten(textureList)[0]

# flattens a 2d list into a single list
newList = flatten(2dList)
# see above for example

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pygamepal-0.8.0.tar.gz (23.4 MB view details)

Uploaded Source

Built Distribution

pygamepal-0.8.0-py3-none-any.whl (45.4 kB view details)

Uploaded Python 3

File details

Details for the file pygamepal-0.8.0.tar.gz.

File metadata

  • Download URL: pygamepal-0.8.0.tar.gz
  • Upload date:
  • Size: 23.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.3

File hashes

Hashes for pygamepal-0.8.0.tar.gz
Algorithm Hash digest
SHA256 e0f29e1d80ca38c73b04714159a2005b9f0e4dcd45af5b0c366961dd4265025d
MD5 580a1e049eb3b2f9b7db73249d60e989
BLAKE2b-256 f872e6ed990750cfe40f42e0fa025f6f5e93cb4ebc11678301d73b8ad0667f00

See more details on using hashes here.

File details

Details for the file pygamepal-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: pygamepal-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 45.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.3

File hashes

Hashes for pygamepal-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5c583b666104f42d63f7ae622bf2276b50b25a0247217ce8a291a21b66f8c7bb
MD5 a3bb7586a5369ac1fa456f3b018ff6ac
BLAKE2b-256 94e4458a00c47f05f9e26092e6d66c57d40bf36551c943b3f097a1f27b955c86

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page