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
Binary file box.png has changed
Binary file corridor.png has changed
Binary file player.png has changed
--- /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()
Binary file skeleton.png has changed