Mercurial > mhrok
changeset 8:d958026f72b5
Add a Display object
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 26 Feb 2012 11:19:22 +0100 |
| parents | c8ec5029a5f9 |
| children | f1b43f6480c5 |
| files | mhrok.png mhrok.py |
| diffstat | 2 files changed, 75 insertions(+), 61 deletions(-) [+] |
line wrap: on
line diff
--- a/mhrok.py Sun Feb 26 10:33:26 2012 +0100 +++ b/mhrok.py Sun Feb 26 11:19:22 2012 +0100 @@ -21,7 +21,7 @@ animations = [[0]] movements = [[(0, 0)]] - def __init__(self, frames, x, y): + def __init__(self, frames, (x, y)): super(Mob, self).__init__() self.animation = 0 self.frames = frames @@ -63,7 +63,7 @@ ] -class PlayerCharacter(Mob): +class Player(Mob): animations = [ [0, 0, 1, 1, 0, 0, 2, 2], [5, 5, 6, 6, 5, 5, 7, 7], @@ -106,73 +106,77 @@ return sorted(self.spritedict.keys(), key=lambda sprite: getattr(sprite, "depth", 0)) + def move(self, (dx, dy)): + for sprite in self.sprites(): + sprite.rect.move_ip(dx, dy) + class Level(object): - def __init__(self, tiles, (width, height), pc): - self.tiles = tiles - self.background = pygame.Surface((width * 20 + 28, height * 12 + 36)) - blood = self.tiles[21].copy() - blood.set_alpha(220) - for y in range(height): - for x in range(width): - self.background.blit(self.tiles[23], (x * 20 + 6, y * 12)) - if (9*x + 5*y + 2) % (y+3) == 3: - self.background.blit(blood, (x * 20 + 6, y * 12)) - for x in range(width): - if x != 3: - self.background.blit(self.tiles[4], (x * 20 + 6, 0)) - self.background.blit(self.tiles[14], (x * 20 + 6, height * 12 - 12)) - else: - self.background.blit(self.tiles[24], (x * 20 + 6, 0)) - self.background.blit(self.tiles[34], (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)) - else: - self.background.blit(self.tiles[29], (6, y * 12)) - self.background.blit(self.tiles[39], (width * 20 - 14, y * 12)) + def __init__(self, (width, height)): + self.mobs = {} + self.width = width + self.height = height + + self.mobs[2, 3] = Bat + self.mobs[4, 2] = Chest + self.mobs[6, 3] = Skeleton + self.mobs[9, 10] = Teddybear + def render_background(self, tiles): + background = pygame.Surface((self.width * 20 + 28, self.height * 12 + 36)) + blood = tiles[21].copy() + blood.set_alpha(220) + blood2 = tiles[22].copy() + blood2.set_alpha(220) + for y in range(self.height): + for x in range(self.width): + background.blit(tiles[23], (x * 20 + 6, y * 12)) + if (9*x + 5*y + 2) % (y+3) == 3: + background.blit(blood, (x * 20 + 6, y * 12)) + if (13*x + 5*y + 2) % (y+4) == 2: + background.blit(blood2, (x * 20 + 6, y * 12)) + for x in range(self.width): + if x != 3: + background.blit(tiles[4], (x * 20 + 6, 0)) + background.blit(tiles[14], (x * 20 + 6, self.height * 12 - 12)) + else: + background.blit(tiles[24], (x * 20 + 6, 0)) + background.blit(tiles[34], (x * 20 + 6, self.height * 12 - 12)) + for y in range(self.height): + if y != 3: + background.blit(tiles[9], (6, y * 12)) + background.blit(tiles[19], (self.width * 20 - 14, y * 12)) + else: + background.blit(tiles[29], (6, y * 12)) + background.blit(tiles[39], (self.width * 20 - 14, y * 12)) + return background -class Game(object): + def render_sprites(self, tiles, pc): + sprites = SortedUpdates() + shadows = pygame.sprite.RenderUpdates() + for (x, y), Mob in self.mobs.iteritems(): + mob = Mob(tiles, (x, y)) + sprites.add(mob) + shadows.add(Shadow(tiles, mob)) + sprites.add(pc) + shadows.add(Shadow(tiles, pc)) + return sprites, shadows + + +class Display(object): def __init__(self): pygame.display.init() - self.screen = pygame.display.set_mode((320, 200)) + self.screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption('Mhrok') - self.tiles = load_tiles('mhrok.png', 32, 32) - self.clock = pygame.time.Clock() - self.game_over = False self.first_draw = True - - pc = PlayerCharacter(self.tiles, 0, 0) - self.pc = pc - self.level = Level(self.tiles, (15, 14), self.pc) - + self.tiles = load_tiles('mhrok.png', 32, 32) self.background = pygame.Surface(self.screen.get_size()) - self.background.blit(self.level.background, (0, 0)) - self.sprites = SortedUpdates() - self.shadows = pygame.sprite.RenderUpdates() - self.sprites.add(pc) - self.shadows.add(Shadow(self.tiles, pc)) - - bat = Bat(self.tiles, 2, 3) - self.sprites.add(bat) - self.shadows.add(Shadow(self.tiles, bat)) - - chest = Chest(self.tiles, 4, 2) - self.sprites.add(chest) - self.shadows.add(Shadow(self.tiles, chest)) - - skeleton = Skeleton(self.tiles, 6, 3) - self.sprites.add(skeleton) - self.shadows.add(Shadow(self.tiles, skeleton)) - - teddy = Teddybear(self.tiles, 9, 10) - self.sprites.add(teddy) - self.shadows.add(Shadow(self.tiles, teddy)) - + def render_level(self, level, pc): + self.sprites, self.shadows = level.render_sprites(self.tiles, pc) + self.background.blit(level.render_background(self.tiles), (160, 140)) + self.sprites.move((160, 140)) def draw(self): if self.first_draw: @@ -186,14 +190,24 @@ self.shadows.draw(self.screen) dirty = self.sprites.draw(self.screen) pygame.display.update(dirty) + self.sprites.update() + self.shadows.update() +class Game(object): + def __init__(self): + self.display = Display() + self.clock = pygame.time.Clock() + self.game_over = False + + self.pc = Player(self.display.tiles, (0, 0)) + self.level = Level((15, 14)) + self.display.render_level(self.level, self.pc) + def main(self): while not self.game_over: self.pc.control() - self.draw() - self.sprites.update() - self.shadows.update() + self.display.draw() self.clock.tick(15) for event in pygame.event.get(): if event.type == pg.QUIT or (
