Mercurial > mhrok
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
--- /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()
