changeset 27:9897f946b8cc

Monster movement
author Radomir Dopieralski <moindev@sheep.art.pl>
date Tue, 18 Dec 2007 02:00:14 +0100
parents c66e886826b3
children 2ccb6995d85d
files lib/game.py lib/level.py monster/__init__.py monster/jello.py monster/player.py
diffstat 5 files changed, 94 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/lib/game.py	Tue Dec 18 01:05:25 2007 +0100
+++ b/lib/game.py	Tue Dec 18 02:00:14 2007 +0100
@@ -23,46 +23,47 @@
                 self.level.player.walk(d)
             except MoveBump, bump:
                 self.level.player.attack(d, bump.monster)
+            self.end_turn()
         except MoveError:
             Mesg(self.level.player, "blocked")
+    
+    def end_turn(self):
+        for monster in self.level.monsters.values():
+            if not monster.dead:
+                try:
+                    monster.act()
+                except Exception, e:
+                    print "Monster %s acting weird!" % repr(monster)
+                    print repr(e)
+    
+    def all_finished(self):
+        """Are all animations ready?"""
         
+        for sprite in self.level.sprites:
+            if sprite.step:
+                return False
+        return True
+    
     def main_loop(self):
         self.level.refresh(self.screen)
         av = self.level.player
-        hscroll = 0
-        vscroll = 0
         key_pressed = None
         while 1:
             # Update the screen
+            hscroll = 0
+            vscroll = 0            
+            if av.rect.left<48:
+                hscroll = 3
+            if av.rect.right>self.screen.get_width()-48:
+                hscroll = -3
+            if av.rect.top<48:
+                vscroll = 2
+            if av.rect.bottom>self.screen.get_height()-48:
+                vscroll = -2
             if hscroll or vscroll:
-                if hscroll>2:
-                    hs = 3
-                elif hscroll<-2:
-                    hs = -3
-                else:
-                    hs = 0
-                if vscroll>1:
-                    vs = 2
-                elif vscroll<-1:
-                    vs = -2
-                else:
-                    vs = 0
-                self.level.scroll(hs, vs)
-                hscroll -= hs
-                vscroll -= vs
+                self.level.scroll(hscroll, vscroll)
                 self.level.refresh(self.screen)                
-            else:
-                self.level.update(self.screen)
-
-            if av.rect.left<48:
-                hscroll += 48-av.rect.left
-            if av.rect.right>self.screen.get_width()-48:
-                hscroll += self.screen.get_width()-48-av.rect.right
-            if av.rect.top<48:
-                vscroll += 48-av.rect.top
-            if av.rect.bottom>self.screen.get_height()-48:
-                vscroll += self.screen.get_height()-48-av.rect.bottom
-
+            self.level.update(self.screen)
             self.clock.tick(15)            
             # Process input
             for event in pygame.event.get():
@@ -71,7 +72,7 @@
                 elif event.type==KEYDOWN:
                     key_pressed = event.key
 
-            if av.step==0:
+            if self.all_finished():
                 keys = pygame.key.get_pressed()
                 if keys[K_UP] or key_pressed==K_UP:
                     self.try_walk(1)
--- a/lib/level.py	Tue Dec 18 01:05:25 2007 +0100
+++ b/lib/level.py	Tue Dec 18 02:00:14 2007 +0100
@@ -9,7 +9,7 @@
 
 class Level:
     def __init__(self, filename):
-        self.creatures = sprites.SortedUpdates()
+        self.sprites = sprites.SortedUpdates()
         self.shadows = pygame.sprite.RenderUpdates()
         self.effects = pygame.sprite.RenderUpdates()        
         self.scrollpos = [-48,-32]
@@ -52,32 +52,27 @@
         monster = module.Mob((x, y), self)
         return monster
     
-    def add_sprite(self, group, sprite):
-        group.add(sprite)
+    def add_sprite(self, sprite):
+        self.sprites.add(sprite)
         sprite.rect.move_ip(self.scrollpos[0], self.scrollpos[1])
 
     def scroll(self, dx, dy):
         self.scrollpos[0] += dx
         self.scrollpos[1] += dy
-        for sprite in self.creatures:
+        for sprite in self.sprites:
             sprite.rect.move_ip(dx, dy)
         for sprite in self.effects:
             sprite.rect.move_ip(dx, dy)
         for sprite in self.shadows:
             sprite.rect.move_ip(dx, dy)
 
-
     def refresh(self, screen):
         '''Redraw the whole level'''
 
         screen.blit(self.background, self.scrollpos)
-        self.shadows.draw(screen)
-        self.creatures.draw(screen)
-        self.effects.draw(screen)
-        
+        self.update(screen, update=False)
         pygame.display.update()
 
-
     def clear_func(self, screen, rect):
         source = rect.move(-self.scrollpos[0], -self.scrollpos[1])
         source = source.clip(self.background.get_clip())
@@ -87,16 +82,17 @@
             patch = self.background.subsurface(source)
         screen.blit(patch, rect)
 
-    def update(self, screen):
+    def update(self, screen, update=True):
         '''Redraw and update all the animated parts'''
 
         self.effects.clear(screen, self.clear_func)
-        self.creatures.clear(screen, self.clear_func)
+        self.sprites.clear(screen, self.clear_func)
         self.shadows.clear(screen, self.clear_func)
-        self.creatures.update()
+        self.sprites.update()
         self.shadows.update()
         self.effects.update()
         dirty = self.shadows.draw(screen)
-        dirty += self.creatures.draw(screen)
+        dirty += self.sprites.draw(screen)
         dirty += self.effects.draw(screen)
-        pygame.display.update(dirty)
+        if update:
+            pygame.display.update(dirty)
--- a/monster/__init__.py	Tue Dec 18 01:05:25 2007 +0100
+++ b/monster/__init__.py	Tue Dec 18 02:00:14 2007 +0100
@@ -32,13 +32,16 @@
         pygame.sprite.Sprite.__init__(self)
         self.frame = 0
         self.delay = 0
+        self.step = 0
         self.level = level
         self.x, self.y = pos
         self.h = 0
+        self.dead = False
         self.place(pos)
         self.frames = read_frames(os.path.join("image", image_file))
         self.shadow = Shadow(self)
-        self.level.add_sprite(self.level.creatures, self)
+        self.level.add_sprite(self)
+        self.anim = self.anim_stand()
         self.shadow.update()
         self.update()
 
@@ -80,21 +83,20 @@
         if self.step==15:
             self.rect.move_ip(0, -4)
             self.h += 4        
-        if self.step<=0:
+        if self.step<=1:
             self.die()
         else:
             self.image.set_alpha(self.step*32)
 
-    def hit(self):
-        Mesg(self, "-5", color=(255,0,0))
-        if self.anim!= self.anim_die:
-            self.anim = self.anim_die
-            self.step = 8
-    
-    def anim(self):
+    def anim_stand(self):        
         self.animate(self.frames[0], 3)
 
-    def die(self):
+    def anim_walk(self):
+        self.rect.move_ip(delta_x[self.facing]*3, delta_y[self.facing]*2)
+        self.z += delta_y[self.facing]*2
+        self.animate(self.frames[0], 1)
+    
+    def destroy(self):
         try:
             self.shadow.kill()
         except AttributeError:
@@ -105,6 +107,35 @@
         except KeyError:
             pass
 
+    def hit(self):
+        if self.dead:
+            return
+        Mesg(self, "-5", color=(255,0,0))
+        self.die()
+        
+    def die(self):
+        if not self.dead:
+            self.dead = True
+            self.anim = self.anim_die
+            self.step += 8
+
+    def rotate(self, direction):
+        self.facing = direction
+
     def update(self):
+        if self.step<=0:
+            if self.dead:
+                self.destroy()
+            self.anim = self.anim_stand
         self.anim()
+        if self.step>0:
+            self.step -= 1
+       
+    def walk(self, direction):
+        self.rotate(direction)
+        self.move((self.x+delta_x[direction],self.y+delta_y[direction]))
+        self.step += 8
+        self.anim = self.anim_walk
         
+    def act(self):
+        pass
--- a/monster/jello.py	Tue Dec 18 01:05:25 2007 +0100
+++ b/monster/jello.py	Tue Dec 18 02:00:14 2007 +0100
@@ -1,8 +1,17 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 
+import random
+
 from monster import Monster
 
 class Mob(Monster):
     def __init__(self, pos, level):
         Monster.__init__(self, pos, level, "jello.png")
+        
+    def act(self):
+        direction = random.randint(1, 4)
+        try:
+            self.walk(direction)
+        except:
+            pass
--- a/monster/player.py	Tue Dec 18 01:05:25 2007 +0100
+++ b/monster/player.py	Tue Dec 18 02:00:14 2007 +0100
@@ -8,12 +8,10 @@
 class Mob(Monster):
     def __init__(self, pos, level):
         self.facing = 0
-        self.step = 0
         Monster.__init__(self, pos, level, "abi2.png")
         self.rotate(3)
-        self.z+=1
+        self.z += 1
         self.level.player = self
-        self.anim = self.anim_stand
     
     def anim_stand(self):
         self.image = self.frames[self.facing-1][0]
@@ -47,12 +45,7 @@
         self.facing = facing
         self.image = self.frames[self.facing-1][0]
 
-    def walk(self, direction):
-        self.rotate(direction)
-        self.move((self.x+delta_x[direction],self.y+delta_y[direction]))
-        self.step = 8
-        self.anim = self.anim_walk
-    
+   
     def attack(self, direction, monster):
         self.rotate(direction)
         self.step = 4