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()
Binary file fhrl/grass.png has changed
Binary file fhrl/mobs.png has changed