Mercurial > qq-kill
changeset 0:7b368da3f205
Initial commit
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Sat, 23 Aug 2008 00:06:18 +0200 |
| parents | |
| children | 5bbe81708710 |
| files | box.png corridor.png player.png qq.py skeleton.png |
| diffstat | 5 files changed, 167 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qq.py Sat Aug 23 00:06:18 2008 +0200 @@ -0,0 +1,167 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import pygame +from pygame.locals import * + +# Motion offsets for particular directions +# N E S W +DX = [0, 1, 0, -1] +DY = [-1, 0, 1, 0] + +def load_tiles(filename, width=32, height=None): + if height is None: + height = width + image = pygame.image.load(filename).convert() + image_width, image_height = image.get_size() + tiles = [] + for x in range(0, image_width/width): + line = [] + tiles.append(line) + for y in range(0, image_height/height): + line.append(image.subsurface((x*width, y*height, width, height))) + return tiles + + +class SortedUpdates(pygame.sprite.RenderUpdates): + def sprites(self): + sprites = self.spritedict.keys() + sprites.sort(lambda a, b: a.depth - b.depth) + return sprites + + +class Sprite(pygame.sprite.Sprite): + def __init__(self): + pygame.sprite.Sprite.__init__(self) + self.image = self.frames[0][0] + self.rect = self.image.get_rect() + self.animation = self.stand_animation() + + def get_pos(self): + return self.rect.midbottom + def set_pos(self, pos): + self.rect.midbottom = pos + self.depth = pos[1] + pos = property(get_pos, set_pos) + + def move(self, dx, dy): + self.rect.move_ip(dx, dy) + self.depth = self.pos[1] + + def stand_animation(self): + while True: + for frame in range(2): + self.image = self.frames[frame][0] + yield None + yield None + yield None + + def update(self): + self.animation.next() + + +class Level: + width = 15 + height = 15 + + def __init__(self): + tile_image = pygame.image.load("corridor.png").convert() + tile_width, tile_height = tile_image.get_size() + self.image = pygame.Surface((self.width*tile_width, + self.height*tile_height)) + for y in range(15): + for x in range(15): + self.image.blit(tile_image, (x*tile_width, y*tile_height)) + + def draw(self, surface): + surface.blit(self.image, (0, 0)) + + +class Skeleton(Sprite): + frames = load_tiles("skeleton.png") + + def __init__(self): + Sprite.__init__(self) + self.pos = (160, 64) # XXX Temporary, will be set on creation later + + +class Player(Sprite): + frames = load_tiles("player.png") + + def __init__(self): + Sprite.__init__(self) + self.direction = 2 + self.animation = None + self.image = self.frames[self.direction][0] + self.pos = (16, 32) # XXX Temporary, will be set on creation later + + def walk_animation(self): + for frame in range(4): + self.image = self.frames[self.direction][frame] + yield None + self.move(3*DX[self.direction], 2*DY[self.direction]) + yield None + self.move(3*DX[self.direction], 2*DY[self.direction]) + + def update(self): + if self.animation is None: + self.image = self.frames[self.direction][0] + else: + try: + self.animation.next() + except StopIteration: + self.animation = None + +class Game: + def __init__(self): + self.screen = pygame.display.get_surface() + self.pressed_key = None + self.game_over = False + self.sprites = SortedUpdates() + self.level = Level() + self.background = self.level.image.copy() + self.player = Player() + self.sprites.add(self.player) + self.sprites.add(Skeleton()) + + def control(self): + keys = pygame.key.get_pressed() + def pressed(key): + return self.pressed_key == key or keys[key] + if pressed(K_UP): + self.player.direction = 0 + self.player.animation = self.player.walk_animation() + elif pressed(K_DOWN): + self.player.direction = 2 + self.player.animation = self.player.walk_animation() + elif pressed(K_LEFT): + self.player.direction = 3 + self.player.animation = self.player.walk_animation() + elif pressed(K_RIGHT): + self.player.direction = 1 + self.player.animation = self.player.walk_animation() + self.pressed_key = None + + def main(self): + clock = pygame.time.Clock() + self.screen.blit(self.background, (0, 0)) + pygame.display.flip() + while not self.game_over: + self.sprites.clear(self.screen, self.background) + self.sprites.update() + if self.player.animation is None: + self.control() + self.player.update() + dirty = self.sprites.draw(self.screen) + pygame.display.update(dirty) + clock.tick(15) + for event in pygame.event.get(): + if event.type == QUIT: + self.game_over = True + elif event.type == KEYDOWN: + self.pressed_key = event.key + +if __name__ == "__main__": + pygame.init() + pygame.display.set_mode((360, 240)) + Game().main()
