[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[pygame] spritesheets and animation
Hi I've just started using pygame and python in general as of a week ago and I'm probably trying to get up the mountain too soon. In the following program I've frankensteined in order to simply repeat a 4 frame walk cycle animation, I can't get the sprite to display, all I see is black. If anyone can point me to what I'm doing wrong I'd appreciate it.
Thanks,
Devon
import os, pygame
from pygame.locals import *
SCREENRECT = Rect(0, 0, 320, 240)
class Spritesheet:
def __init__(self, filename):
self.sheet = pygame.image.load(os.path.join('data', filename)).convert()
def imgat(self, rect, colorkey = None):
rect = Rect(rect)
image = pygame.Surface(rect.size).convert()
image.blit(self.sheet, (0, 0),
rect)
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0, 0))
image.set_colorkey(colorkey, RLEACCEL)
return image
#def imgsat(self, rects, colorkey = None):
# imgs = []
# for rect in rects:
# imgs.append(self.imgat(rect, colorkey))
# return imgs
def geneimages():
spritesheet = Spritesheet('sprite_gene.png')
return [spritesheet.imgat((0, 0, 16, 32), -1),
spritesheet.imgat((17, 0, 16, 32), -1),
spritesheet.imgat((33, 0, 16, 32), -1),
spritesheet.imgat((49, 0, 16, 32), -1)]
class Gene(pygame.sprite.Sprite):
def __init__(self, fps = 10):
pygame.sprite.Sprite.__init__(self)
# Track the time we started, and the time between updates.
# Then we can figure out when we have to switch the image.
self._frame = 0
self.image = self._images[self._frame]
self.rect =
self.image.get_rect()
self._start = pygame.time.get_ticks()
self._delay = 1000 / fps
self._last_update = 0
# Call update to set our first image.
self.update(pygame.time.get_ticks())
def update(self, t):
# Note that this doesn't work if it's been more that self._delay
# time between calls to update(); we only update the image once
# then, but it really should be updated twice.
if t - self._last_update > self._delay:
self._frame +=
1
if self._frame >= len(self._images): self._frame = 0
self.image = self._images[self._frame]
self._last_update = t
def main():
pygame.init()
screen = pygame.display.set_mode(SCREENRECT.size)
Gene._images = geneimages()
gene = Gene()
genesprite = pygame.sprite.RenderUpdates()
# Set-up background surface
global background
background = "">
background = "">
# keep track of time
clock = pygame.time.Clock()
# Blit everything to the screen
screen.blit(background, (0, 0))
pygame.display.flip()
# game loop
while 1:
# maintain frame rate
clock.tick(30)
# get input
for event in pygame.event.get():
if event.type == QUIT \
or (event.type == KEYDOWN and
\
event.key == K_ESCAPE):
return
# clear sprites
genesprite.clear(screen, background)
# update sprites
genesprite.update(4)
# redraw sprites
genesprite.draw(screen)
pygame.display.flip()
if __name__ == '__main__': main()
Never miss a thing. Make Yahoo your homepage.