3 new revisions:
Revision: 834d897d2e
Author: Hugo Ruscitti <
hugoru...@gmail.com>
Date: Sat Jun 19 18:57:57 2010
Log: enviando la referencia del shaolin a todos los enemigos del juego
(par...
http://code.google.com/p/sbfury/source/detail?r=834d897d2e
Revision: 78c72cc889
Author: Hugo Ruscitti <
hugoru...@gmail.com>
Date: Sat Jun 19 19:10:53 2010
Log: haciendo que los enemigos miren casi todo el tiempo la posicion del
sh...
http://code.google.com/p/sbfury/source/detail?r=78c72cc889
Revision: 8ea3293406
Author: Hugo Ruscitti <
hugoru...@gmail.com>
Date: Sat Jun 19 19:59:58 2010
Log: creando estados y funciones para que los enemigos le puedan pegar al
p...
http://code.google.com/p/sbfury/source/detail?r=8ea3293406
==============================================================================
Revision: 834d897d2e
Author: Hugo Ruscitti <
hugoru...@gmail.com>
Date: Sat Jun 19 18:57:57 2010
Log: enviando la referencia del shaolin a todos los enemigos del juego
(para que los enemigos sepan donde esta el shaolin).
http://code.google.com/p/sbfury/source/detail?r=834d897d2e
Modified:
/sbfury/enemies/__init__.py
/sbfury/enemies/fat.py
/sbfury/enemies/hannia.py
/sbfury/scene/game.py
=======================================
--- /sbfury/enemies/__init__.py Sat Jun 19 18:49:49 2010
+++ /sbfury/enemies/__init__.py Sat Jun 19 18:57:57 2010
@@ -2,9 +2,10 @@
class Enemy(sprite.Sprite):
- def __init__(self, must_be_updated=False):
+ def __init__(self, shaolin, must_be_updated=False):
super(Enemy, self).__init__(must_be_updated=must_be_updated)
self.flip = True
+ self.shaolin = shaolin
def set_ai_states(self, ai_states):
"Define la rueda de estados que tiene que seguir el personaje (AI
simple)."
=======================================
--- /sbfury/enemies/fat.py Sat Jun 19 18:49:49 2010
+++ /sbfury/enemies/fat.py Sat Jun 19 18:57:57 2010
@@ -20,8 +20,8 @@
class Fat(enemies.Enemy):
- def __init__(self, x=400, y=200):
- super(Fat, self).__init__(must_be_updated=True)
+ def __init__(self, shaolin, x=400, y=200):
+ super(Fat, self).__init__(shaolin, must_be_updated=True)
self.position = x, y
self._load_animations()
self.set_ai_states([state.Wait(self, 4), state.Wait(self, 4)])
=======================================
--- /sbfury/enemies/hannia.py Sat Jun 19 18:49:49 2010
+++ /sbfury/enemies/hannia.py Sat Jun 19 18:57:57 2010
@@ -20,8 +20,8 @@
class Hannia(enemies.Enemy):
- def __init__(self, x=400, y=200):
- super(Hannia, self).__init__(must_be_updated=True)
+ def __init__(self, shaolin, x=400, y=200):
+ super(Hannia, self).__init__(shaolin, must_be_updated=True)
self.position = x, y
self._load_animations()
self.set_ai_states([state.Wait(self, 1), state.WalkRandom(self,
1)])
=======================================
--- /sbfury/scene/game.py Sun Jun 6 16:14:06 2010
+++ /sbfury/scene/game.py Sat Jun 19 18:57:57 2010
@@ -107,7 +107,7 @@
}
class_of_enemy = name_class[name]
- enemy = class_of_enemy(x, y)
+ enemy = class_of_enemy(self.shaolin, x, y)
self.stage.add_element(enemy)
self.stage.add_element(enemy.shadow)
self.stage.collision_manager.add_enemy(enemy)
@@ -134,6 +134,7 @@
# Add player to collision manager
self.stage.collision_manager.add_player(shaolin_sprite)
+ self.shaolin = shaolin_sprite
def advance_level(self):
"Avanza un nivel dentro del juego."
==============================================================================
Revision: 78c72cc889
Author: Hugo Ruscitti <
hugoru...@gmail.com>
Date: Sat Jun 19 19:10:53 2010
Log: haciendo que los enemigos miren casi todo el tiempo la posicion del
shaolin.
http://code.google.com/p/sbfury/source/detail?r=78c72cc889
Modified:
/doc/source/enemies.rst
/sbfury/enemies/__init__.py
/sbfury/enemies/state.py
=======================================
--- /doc/source/enemies.rst Sat Jun 19 18:49:49 2010
+++ /doc/source/enemies.rst Sat Jun 19 19:10:53 2010
@@ -49,3 +49,13 @@
determinado por el ultimo argumento, y cuando termina tiene que llamar
internamente a ``go_to_next_ai_state`` para seguir con el siguiente
estado.
+
+
+Todos miran al shaolin
+----------------------
+
+Cuando se inicializa un enemigo dentro del método ``create_enemy`` de la
+escena ``Game``, se le pasa al nuevo enemigo la referencia del shaolin.
Esto
+es útil porque permite a los enemigos conocer la posición del shaolin,
tanto
+para realizar movimientos mas acertados como para observarlo todo el
+tiempo.
=======================================
--- /sbfury/enemies/__init__.py Sat Jun 19 18:57:57 2010
+++ /sbfury/enemies/__init__.py Sat Jun 19 19:10:53 2010
@@ -32,5 +32,12 @@
next_state.start()
self.set_state(next_state)
+ def update(self, dt):
+ self._state.update(dt)
+
+ def see_to_player(self):
+ "Mira en la direccion del shaolin, esto simula que el personaje no
pierde de vista al protagonista."
+ self.flip = (self.shaolin.position[0] < self.position[0])
+
import fat
import hannia
=======================================
--- /sbfury/enemies/state.py Sat Jun 19 18:49:49 2010
+++ /sbfury/enemies/state.py Sat Jun 19 19:10:53 2010
@@ -8,8 +8,8 @@
import random
-
class Stand(State):
+ "El personaje parado en su sitio. Solo se suele utilizar como clase
abstracta."
def __init__(self, target):
State.__init__(self, target)
@@ -33,6 +33,7 @@
class Wait(Stand):
+ "Espera un numero determinado de segundos."
def __init__(self, target, seconds):
State.__init__(self, target)
@@ -46,11 +47,13 @@
def update(self, dt):
self.dt += dt
self.target.update_animation(dt)
+ self.target.see_to_player()
if self.dt > self.seconds_to_wait:
self.target.go_to_next_ai_state()
class WalkRandom(Stand):
+ "Camina en cualquier dirección al azar."
def __init__(self, target, seconds):
Stand.__init__(self, target)
==============================================================================
Revision: 8ea3293406
Author: Hugo Ruscitti <
hugoru...@gmail.com>
Date: Sat Jun 19 19:59:58 2010
Log: creando estados y funciones para que los enemigos le puedan pegar al
protagonista.
http://code.google.com/p/sbfury/source/detail?r=8ea3293406
Modified:
/sbfury/collision.py
/sbfury/config.py
/sbfury/enemies/hannia.py
/sbfury/enemies/state.py
/sbfury/shaolin/shaolin.py
/sbfury/shaolin/state.py
/sbfury/sprite.py
=======================================
--- /sbfury/collision.py Sat Jun 19 15:54:40 2010
+++ /sbfury/collision.py Sat Jun 19 19:59:58 2010
@@ -70,12 +70,13 @@
if b.on_collision_receive(a, a.collision_force):
self._create_collision_effect((a.x, a.y), a.flip)
-
elif self._get_collision(send=b, receive=a):
+
b.on_collision_send(a)
if a.on_collision_receive(b, b.collision_force):
- self._create_collision_effect((a.x, a.y))
+ self._create_collision_effect((a.x, a.y), a.flip)
+
def _create_collision_effect(self, (x, y), flip):
x += randint(-30, 30)
=======================================
--- /sbfury/config.py Sat Jun 19 15:54:40 2010
+++ /sbfury/config.py Sat Jun 19 19:59:58 2010
@@ -19,6 +19,6 @@
SHOW_FRONT_LAYER = True
CAMERA_STEP = 20
SHAOLIN_INITIAL_JUMP_SPEED = 12
-SHOW_COLLISION_BOXES = False
+SHOW_COLLISION_BOXES = True
SHOW_CONTROL_POINTS = False
SOUNDS_ENABLED = True
=======================================
--- /sbfury/enemies/hannia.py Sat Jun 19 18:57:57 2010
+++ /sbfury/enemies/hannia.py Sat Jun 19 19:59:58 2010
@@ -24,7 +24,10 @@
super(Hannia, self).__init__(shaolin, must_be_updated=True)
self.position = x, y
self._load_animations()
- self.set_ai_states([state.Wait(self, 1), state.WalkRandom(self,
1)])
+ self.set_ai_states(
+ [state.Wait(self, 1), state.PunchToPlayerIfCloser(self)]
+ #state.WalkRandom(self, 1)])
+ )
self.go_to_next_ai_state()
self.shadow = shadow.Shadow()
self.move(0, 0)
@@ -35,6 +38,7 @@
self._animations = {
'stand': Animation('enemies/hannia/stand.png', 1),
'hitstand1': Animation('enemies/hannia/hitstand1.png', 1),
+ 'attack': Animation('enemies/hannia/hitstand1.png', 1),
'hitstand2': Animation('enemies/hannia/hitstand2.png', 1),
'hardhit': Animation('enemies/hannia/hardhit.png', 4),
'ground': Animation('enemies/hannia/ground.png', 1),
=======================================
--- /sbfury/enemies/state.py Sat Jun 19 19:10:53 2010
+++ /sbfury/enemies/state.py Sat Jun 19 19:59:58 2010
@@ -7,6 +7,7 @@
from sprite import State
import random
+COLLISION_RECT_ATTACK = (0, 80, 90, 20)
class Stand(State):
"El personaje parado en su sitio. Solo se suele utilizar como clase
abstracta."
@@ -42,7 +43,6 @@
def start(self):
self.target.set_animation('stand')
self.dt = 0
- print self.target, "Esperando:", self.seconds_to_wait, "segundos"
def update(self, dt):
self.dt += dt
@@ -73,6 +73,35 @@
if self.dt > self.seconds:
self.target.go_to_next_ai_state()
+class PunchToPlayerIfCloser(Stand):
+ "Intenta pegarle al protagonista solamente si esta cerca."
+
+ def __init__(self, target):
+ Stand.__init__(self, target)
+
+ def start(self):
+ pass
+
+ def update(self, dt):
+ if self.target.is_closer_to(self.target.shaolin):
+ self.target.set_state(Attack(self.target))
+ else:
+ self.target.go_to_next_ai_state()
+
+
+class Attack(State):
+ "Realiza un golpe intentando lastimar al protagonista."
+
+ def __init__(self, target):
+ State.__init__(self, target)
+ self.target.set_animation('attack')
+ self.target.set_collision(COLLISION_RECT_ATTACK, 1)
+
+ def update(self, dt):
+ if self.target.update_animation(dt):
+ self.target.go_to_next_ai_state()
+ self.target.set_collision(None)
+
class HitStand(State):
"Recibe un golpe simple."
=======================================
--- /sbfury/shaolin/shaolin.py Sat May 29 21:13:43 2010
+++ /sbfury/shaolin/shaolin.py Sat Jun 19 19:59:58 2010
@@ -58,7 +58,6 @@
'throw': Animation('shaolin/throw.png', 3),
'walk': Animation('shaolin/walk.png', 4),
}
-
def on_control_press(self, map):
self._state.on_control_press(map)
@@ -66,6 +65,9 @@
def on_control_release(self, map):
self._state.on_control_release(map)
+ def on_collision_receive(self, other_sprite, force):
+ """Returns True if collision do something."""
+ return self._state.on_collision_receive(other_sprite, force)
if __name__ == '__main__':
import control
=======================================
--- /sbfury/shaolin/state.py Sat May 29 21:13:43 2010
+++ /sbfury/shaolin/state.py Sat Jun 19 19:59:58 2010
@@ -35,6 +35,10 @@
def update(self, dt):
self.target.update_animation(dt)
+ def on_collision_receive(self, other_sprite, force):
+ self.target.set_state(HitStand(self.target, force))
+ return True
+
class Walk(State):
@@ -75,6 +79,10 @@
if not map.motion:
self.target.set_state(Stand(self.target))
+ def on_collision_receive(self, other_sprite, force):
+ self.target.set_state(HitStand(self.target, force))
+ return True
+
class Run(Walk):
def __init__(self, target, map):
@@ -98,6 +106,10 @@
elif map.jump:
self.target.set_state(JumpWalk(self.target, self.dx * 2))
+ def on_collision_receive(self, other_sprite, force):
+ self.target.set_state(HitStand(self.target, force))
+ return True
+
class AttackWhenRun(State):
def __init__(self, target, dx):
@@ -275,3 +287,17 @@
self.target.set_collision(None)
+class HitStand(State):
+ "Recibe un golpe simple."
+
+ def __init__(self, target, collision_force):
+ State.__init__(self, target)
+
+ if collision_force in [1, 3]:
+ target.set_animation('hitstand1')
+ else:
+ target.set_animation('hitstand2')
+
+ def update(self, dt):
+ if self.target.update_animation(dt):
+ self.target.set_state(Stand(self.target))
=======================================
--- /sbfury/sprite.py Sun Jun 6 19:36:23 2010
+++ /sbfury/sprite.py Sat Jun 19 19:59:58 2010
@@ -132,6 +132,19 @@
y += self.y + h + self.distance_to_floor
return x, y, w, h
+ def is_closer_to(self, other_sprite):
+ """Determina si dos sprites estan lo suficientemente cerca para
pegarse.
+
+ Este método se utiliza desde alguno de los estados de los
enemigos. Porque
+ los enemigos necesitan saber si estan cerca del enemigo antes
+ de realizar un golpe. Si el enemigo esta muy lejos directamente no
golpea.
+ """
+ x0, y0 = self.position
+ x1, y1 = other_sprite.position
+
+ if abs(x0 - x1) < 120 and abs(y0 - y1) < 30:
+ return True
+
def move(self, dx, dy):
"Mueve al personaje pero respetando los límites del escenario."
x, y = self.position
@@ -170,3 +183,5 @@
layer.add(sprite)
common.director.run(scene)
+
+