Mercurial > deevo
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():
