changeset 3:05c0c1ef4c80

Shooting rays
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 26 Aug 2012 13:12:06 +0200
parents d64392b860dc
children 9bb9ac51d75f
files deevo/__main__.py deevo/deevo.png
diffstat 2 files changed, 102 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/deevo/__main__.py	Sat Aug 25 19:28:27 2012 +0200
+++ b/deevo/__main__.py	Sun Aug 26 13:12:06 2012 +0200
@@ -6,7 +6,11 @@
 import itertools
 import pkgutil
 import StringIO
-import random
+
+
+SHEET = None
+shadows = None
+sprites = None
 
 
 class SortedUpdates(pygame.sprite.RenderUpdates):
@@ -37,17 +41,34 @@
         super(Sprite, self).__init__()
         self.image = SHEET[self.sheet_index]
         self.rect = self.image.get_rect()
+        self.depth = self.rect.top
 
 
-class Shadow(Sprite):
-    sheet_index = 18
-
+class SmallShadow(Sprite):
+    sheet_index = 17
     def __init__(self, whose, (ox, oy)):
-        super(Shadow, self).__init__()
+        super(SmallShadow, self).__init__()
         self.whose = whose
         self.ox, self.oy = ox, oy
 
     def update(self):
+        if not self.whose.alive():
+            self.kill()
+            return
+        self.rect.topleft = (self.whose.rect.x + self.ox,
+                             self.whose.depth + self.oy)
+
+class LargeShadow(SmallShadow):
+    sheet_index = 16
+
+
+class Shadow(SmallShadow):
+    sheet_index = 18
+
+    def update(self):
+        if not self.whose.alive():
+            self.kill()
+            return
         self.rect.topleft = (self.whose.rect.x + self.ox,
                              self.whose.depth + self.oy)
         if self.whose.depth == self.whose.rect.y:
@@ -55,19 +76,72 @@
         else:
             self.image = SHEET[18]
 
-class Fridge(Sprite):
-    sheet_index = 4
 
-    def __init__(self, (x, y)):
-        super(Fridge, self).__init__()
+class Thing(Sprite):
+    Shadow = SmallShadow
+    shadow_offset = (-2, 0)
+
+    def __init__(self, (x, y), index = 4):
+        self.sheet_index = index
+        super(Thing, self).__init__()
         self.rect.topleft = x, y
         self.depth = y
+        if self.Shadow:
+            shadows.add(self.Shadow(self, self.shadow_offset))
 
     def update(self):
         if self.rect.right < 0:
             self.rect.left = 800
 
 
+class Fridge(Thing):
+    Shadow = LargeShadow
+    shadow_offset = (0, 0)
+
+
+class Monster(Thing):
+    Shadow = Shadow
+    shadow_offset = (0, 8)
+
+    def __init__(self, (x, y), index = 12):
+        super(Monster, self).__init__((x, y), index)
+        self.dzs = itertools.cycle([0, -1, -4, -3, -2, -1, 0, 1, 2, 3, 4, 1])
+        self.dx, self.dy = -4, 0
+
+    def update(self):
+        self.rect.move_ip(self.dx, self.dy + self.dzs.next())
+        self.depth += self.dy
+        if self.rect.right < 0 or self.rect.top > 600 or self.rect.bottom < 0:
+            self.kill()
+
+class Ray(pygame.sprite.Sprite):
+    def __init__(self, owner):
+        super(Ray, self).__init__()
+        self.base = pygame.Surface((1024, 128))
+        self.base.fill((0xff, 0x00, 0xff))
+        self.base.set_colorkey((0xff, 0x00, 0xff))
+        for i in range(8):
+            self.base.blit(SHEET[2], (i*128, 0))
+        self.base.set_alpha(192)
+        self.frames = itertools.cycle([self.base.subsurface((i*48, 0, 800, 128)) for i in range(4)])
+        self.image = self.frames.next()
+        self.rect = self.image.get_rect()
+        self.owner = owner
+        self.rect.topleft = owner.rect.topright
+        self.depth = owner.depth
+        self.brightness = 0
+
+    def update(self):
+        if self.brightness:
+            self.brightness -= 16
+            self.image.set_alpha(self.brightness)
+        else:
+            self.kill()
+        self.image = self.frames.next()
+        self.rect.topleft = self.owner.rect.topright
+        self.depth = self.owner.depth
+
+
 class Gunner(Sprite):
     sheet_index = 0
 
@@ -80,6 +154,8 @@
         self.dy = 0
         self.ddy = 0
         self.depth = self.rect.top
+        self.ray = Ray(self)
+        shadows.add(Shadow(self, (-8, 12)))
 
     def update(self):
         keys = pygame.key.get_pressed()
@@ -91,6 +167,11 @@
             self.ddy = 2
         if keys[pygame.K_UP]:
             self.ddy = -2
+        if keys[pygame.K_SPACE]:
+            self.ray.brightness = 192
+            if not self.ray.alive():
+                sprites.add(self.ray)
+                self.ray.update()
 
         if self.ddx > 0:
             self.dx = min(self.dx+2, 12)
@@ -133,8 +214,13 @@
 
 def main():
     global SHEET
+    global shadows
+    global sprites
+
     screen = pygame.display.set_mode((800, 600))
     SHEET = load_sheet('deevo.png', 128)
+    SHEET[16].set_alpha(64)
+    SHEET[17].set_alpha(64)
     SHEET[18].set_alpha(64)
     SHEET[19].set_alpha(64)
     background = screen.copy()
@@ -146,8 +232,13 @@
     shadows = pygame.sprite.RenderUpdates()
     gunner = Gunner()
     sprites.add(gunner)
-    sprites.add(Fridge((600, 10)))
-    shadows.add(Shadow(gunner, (-16, 8)))
+    sprites.add(Fridge((600, 10), 4))
+    sprites.add(Fridge((200, 410), 5))
+    sprites.add(Fridge((205, 415), 6))
+    sprites.add(Thing((400, 210), 3))
+    sprites.add(Thing((100, 350), 15))
+    monster = Monster((700, 100))
+    sprites.add(monster)
     while True:
         clock.tick(15)
         for event in pygame.event.get():
Binary file deevo/deevo.png has changed