changeset 0:076a724d9ae3

Initial commit
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 25 Feb 2012 20:22:16 +0100
parents
children 31f9a48ed4e2
files mhrok.png mhrok.py
diffstat 2 files changed, 168 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file mhrok.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mhrok.py	Sat Feb 25 20:22:16 2012 +0100
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import pygame
+from pygame import locals as pg
+
+
+class Shadow(pygame.sprite.Sprite):
+    def __init__(self, frames, owner):
+        super(Shadow, self).__init__()
+        self.image = frames[20].copy()
+        self.image.set_alpha(128)
+        self.owner = owner
+        self.rect = self.owner.rect.copy()
+
+    def update(self):
+        self.rect = self.owner.rect.copy()
+
+
+class Mob(pygame.sprite.Sprite):
+    animations = [[0]]
+    movements = [[(0, 0)]]
+
+    def __init__(self, frames, x, y):
+        super(Mob, self).__init__()
+        self.animation = 0
+        self.frames = frames
+        self.image = self.frames[0]
+        self.rect = self.image.get_rect()
+        self.frame = 0
+        self.rect.move_ip(6 + 16 * x, 12 * y)
+
+    def update(self):
+        self.rect.move_ip(*self.movements[self.animation])
+        self.frame = (self.frame + 1) % len(self.animations[self.animation])
+        self.image = self.frames[self.animations[self.animation][self.frame]]
+
+
+class Bat(Mob):
+    animations = [
+        [25, 26]
+    ]
+
+
+class Chest(Mob):
+    animations = [
+        [30],
+        [31],
+    ]
+
+
+class PlayerCharacter(Mob):
+    animations = [
+        [0, 0, 1, 1, 0, 0, 2, 2],
+        [5, 5, 6, 6, 5, 5, 7, 7],
+        [10, 10, 11, 11, 10, 10, 12, 12],
+        [15, 15, 16, 16, 15, 15, 16, 16],
+        [0],
+        [5],
+        [10],
+        [15],
+    ]
+    movements = [
+        (0, 3),
+        (-5, 0),
+        (0, -3),
+        (5, 0),
+        (0, 0),
+        (0, 0),
+        (0, 0),
+        (0, 0),
+    ]
+
+    def control(self):
+        keys = pygame.key.get_pressed()
+        if keys[pg.K_UP]:
+            self.animation = 2
+        elif keys[pg.K_LEFT]:
+            self.animation = 1
+        elif keys[pg.K_DOWN]:
+            self.animation = 0
+        elif keys[pg.K_RIGHT]:
+            self.animation = 3
+        else:
+            self.animation = 4 + self.animation % 4
+
+
+class Level(object):
+    def __init__(self, tiles, (width, height), pc):
+        self.sprites = pygame.sprite.RenderUpdates()
+        self.shadows = pygame.sprite.RenderUpdates()
+        self.sprites.add(pc)
+        self.shadows.add(Shadow(pc.frames, pc))
+
+        bat = Bat(pc.frames, 2, 3)
+        self.sprites.add(bat)
+        self.shadows.add(Shadow(pc.frames, bat))
+
+        chest = Chest(pc.frames, 4, 2)
+        self.sprites.add(chest)
+        self.shadows.add(Shadow(pc.frames, chest))
+
+
+        self.tiles = tiles
+        self.background = pygame.Surface((width * 20 + 28, height * 12 + 36))
+        for y in range(height):
+            for x in range(width):
+                self.background.blit(self.tiles[23], (x * 20 + 6, y * 12))
+        for x in range(width):
+            self.background.blit(self.tiles[4], (x * 20 + 6, 0))
+            self.background.blit(self.tiles[14], (x * 20 + 6, height * 12 - 12))
+        for y in range(height):
+            if y != 3:
+                self.background.blit(self.tiles[9], (6, y * 12))
+            self.background.blit(self.tiles[19], (width * 20 - 14, y * 12))
+        self.first_draw = True
+
+    def draw(self, screen):
+        if self.first_draw:
+            screen.blit(self.background, (0, 0))
+            self.shadows.draw(screen)
+            self.sprites.draw(screen)
+            self.first_draw = False
+            return self.background.get_rect()
+        self.sprites.clear(screen, self.background)
+        self.shadows.draw(screen)
+        dirty = self.sprites.draw(screen)
+        self.sprites.update()
+        self.shadows.update()
+        return dirty
+
+
+class Game(object):
+    def __init__(self):
+        pygame.display.init()
+        self.screen = pygame.display.set_mode((640, 400))
+        pygame.display.set_caption('Mhrok')
+        self.tiles = load_tiles('mhrok.png', 32, 32)
+        self.clock = pygame.time.Clock()
+        self.game_over = False
+        self.pc = PlayerCharacter(self.tiles, 0, 0)
+        self.level = Level(self.tiles, (5, 5), self.pc)
+
+    def main(self):
+        while not self.game_over:
+            self.pc.control()
+            dirty = self.level.draw(self.screen)
+            pygame.display.update(dirty)
+            self.clock.tick(15)
+            for event in pygame.event.get():
+                if event.type == pg.QUIT or (
+                        event.type == pg.KEYDOWN and
+                        event.key == pg.K_ESCAPE):
+                    self.game_over = True
+
+
+def load_tiles(filename, width, height):
+    image = pygame.image.load(filename).convert()
+    image_width, image_height = image.get_size()
+    tiles = []
+    for x in range(image_width/width):
+        for y in range(image_height/height):
+            rect = (x * width, y * height, width, height)
+            tiles.append(image.subsurface(rect))
+    return tiles
+
+if __name__ == '__main__':
+    Game().main()