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
pip install pygamepal
orpip install --upgrade pygamepal
- Full example, using lots of pygamepal functionality
Add suggestions and bugs here!
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)
# 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,
backgroundColour = 'gray30',
borderColour='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)
# 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
Release history Release notifications | RSS feed
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.6.1.tar.gz
(20.3 MB
view details)
Built Distribution
pygamepal-0.6.1-py3-none-any.whl
(21.5 kB
view details)
File details
Details for the file pygamepal-0.6.1.tar.gz
.
File metadata
- Download URL: pygamepal-0.6.1.tar.gz
- Upload date:
- Size: 20.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bff3118e263d25329c9e10cdc241b0a58e7b08568a693cfc98fca5ffccaadd11 |
|
MD5 | 050872e8791e24504efcb4e436cedbca |
|
BLAKE2b-256 | 099dd7ab4efd1f9e4381f4c14414fa22f0413a33f81832b7e5c815745dbb21a5 |
File details
Details for the file pygamepal-0.6.1-py3-none-any.whl
.
File metadata
- Download URL: pygamepal-0.6.1-py3-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | eb643fb7d9d94b65722b201f1f6e00e4ec56483d7c335fb926f70d849be59a6d |
|
MD5 | bd2eb23eba3534796dc60bcb349b23ef |
|
BLAKE2b-256 | aef56e6534fd09f4b4232906e4b0f2e14d76830fe15f824de42a624ae86882fc |