Mercurial > fhrl
changeset 0:48ee162b624d
Initial commit
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 10 Mar 2013 23:14:17 +0100 |
| parents | |
| children | e289d18ee9fa |
| files | .hgignore fhrl/__init__.py fhrl/__main__.py fhrl/grass.png fhrl/mobs.png |
| diffstat | 4 files changed, 138 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sun Mar 10 23:14:17 2013 +0100 @@ -0,0 +1,4 @@ +syntax: glob + +.*.swp +*.pyc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fhrl/__main__.py Sun Mar 10 23:14:17 2013 +0100 @@ -0,0 +1,134 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import pygame +import StringIO +import pkgutil +import random + + +DX = [0, 1, 0, -1] +DY = [-1, 0, 1, 0] + + +def load_image(filename): + f = StringIO.StringIO(pkgutil.get_data('fhrl', filename)) + return pygame.image.load(f, filename) + + +def load_atlas(filename, width=32, height=None): + image = load_image(filename) + image_width, image_height = image.get_size() + w, h = width, height or width + return [ + image.subsurface((x * w, y * h, w, h)) + for y in xrange(0, image_height // h) + for x in xrange(0, image_width // w) + ] + + +class SortedUpdates(pygame.sprite.RenderUpdates): + def sprites(self): + return sorted(self.spritedict.keys(), key=lambda s: s.rect.top) + + +class Level(object): + def __init__(self, (width, height)): + self.width = width + self.height = height + self.grid = [ + [0] * width for y in xrange(height) + ] + for y in xrange(self.height): + self.grid[y][0] = 1 + self.grid[y][-1] = 1 + for x in xrange(self.width): + self.grid[0][x] = 1 + self.grid[-1][x] = 1 + for i in xrange(100): + x = random.randrange(1, self.width) + y = random.randrange(1, self.height) + self.grid[y][x] = 1 + + def __iter__(self): + return iter(self.grid) + + def render(self, surf, tiles): + nrows = iter(self.grid) + nrows.next() + for y, (row, nrow) in enumerate(zip(self.grid, nrows)): + for x, ts in enumerate(zip(row, row[1:], nrow, nrow[1:])): + surf.blit( + tiles[sum(bool(t) * 2**i for i, t in enumerate(ts))], + (x * 48, y * 32) + ) + + +class Mob(pygame.sprite.DirtySprite): + def __init__(self, image, (x, y)): + super(Mob, self).__init__() + self.image = image + self.rect = self.image.get_rect() + self.rect.topleft = x * 48 - 24, y * 32 - 32 + self.x, self.y = x, y + + def move_to(self, (x, y)): + self.x, self.y = x, y + self.rect.topleft = x * 48 - 24, y * 32 - 32 + + def move_by(self, d): + self.move_to((self.x + DX[d], self.y + DY[d])) + + +class Hero(Mob): + def act(self, level): + for event in pygame.event.get(): + if (event.type == pygame.QUIT or + event.type == pygame.KEYDOWN and + event.key == pygame.K_ESCAPE + ): + raise SystemExit() + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_UP: + self.move_by(0) + elif event.key == pygame.K_RIGHT: + self.move_by(1) + elif event.key == pygame.K_DOWN: + self.move_by(2) + elif event.key == pygame.K_LEFT: + self.move_by(3) + + +class Game(object): + def __init__(self): + self.screen = pygame.display.set_mode((480, 480)) + self.clock = pygame.time.Clock() + self.grass = load_atlas('grass.png', 48, 32) + self.mobs = load_atlas('mobs.png', 48, 48) + self.level = Level((11, 16)) + self.sprites = SortedUpdates() + self.background = pygame.Surface((480, 480)) + + self.level.render(self.background, self.grass) + self.level.hero = Hero(self.mobs[0], (1, 1)) + self.level.monsters = [ + Mob(self.mobs[1], (2, 2)) + ] + self.sprites.add(self.level.hero) + for m in self.level.monsters: + self.sprites.add(m) + + def run(self): + self.screen.blit(self.background, (0, 0)) + self.sprites.draw(self.screen) + pygame.display.flip() + running = True + while running: + self.sprites.clear(self.screen, self.background) + dirty = self.sprites.draw(self.screen) + pygame.display.update(dirty) + self.level.hero.act(self.level) + self.clock.tick(12) + + +Game().run()
