thegooglecodearchive / los-cocos

Automatically exported from code.google.com/p/los-cocos
0 stars 0 forks source link

Falla la interrupción de acciones en paralelo con stop #4

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Pasos para reproducir el problema:

El siguiente programa ejecuta 2 acciones en paralelo y las
interrumpe inmediatamente (para observar el problema):

-- %< --
import pyglet
from cocos.actions import *

window = pyglet.window.Window()
image = pyglet.resource.image('sprite.png')

sprite = ActionSprite(image, x=350, y=250)
sprite.do(Spawn(FadeIn(1), Delay(1)))
#identico a sprite.do(FadeIn(1) | Delay(1))

sprite.stop()

@window.event
def on_draw():
    window.clear()
    sprite.draw()

pyglet.app.run()
-- %< --

La excepción que notifica el intérprete es la siguiente:

-- %< --
Traceback (most recent call last):
  File "test.py", line 18, in <module>
    pyglet.app.run()
  File "/usr/lib/python2.5/site-packages/pyglet/app/__init__.py", line 263,
in run
    EventLoop().run()
  File "/usr/lib/python2.5/site-packages/pyglet/app/xlib.py", line 91, in run
    sleep_time = self.idle()
  File "/usr/lib/python2.5/site-packages/pyglet/app/__init__.py", line 187,
in idle
    dt = clock.tick(True)
  File "/usr/lib/python2.5/site-packages/pyglet/clock.py", line 669, in tick
    return _default.tick(poll)
  File "/usr/lib/python2.5/site-packages/pyglet/clock.py", line 282, in tick
    func(delta_t, *args, **kwargs)
  File "/media/usb/src/cocos/cocos/actions.py", line 245, in step
    self.actions.remove( x )
ValueError: list.remove(x): x not in list
-- %< --

El error solo se produce al utilizar acciones en paralelo, e
interrumpirlas en algún momento (no necesariamente de forma inmediata), 
el fallo es casi aleatorio.

Original issue reported on code.google.com by hugorusc...@gmail.com on 13 Mar 2008 at 6:52

GoogleCodeExporter commented 9 years ago
Por lo que se ve, el error se produce dentro del método "step" de 
ActionSprite, 
cuando se quieren eliminar elementos de la lista "self.actions" que están
seleccionadas en "self.to_remove":

-- %< --
for x in self.to_remove:
    self.actions.remove( x )
-- %< --

Ocurre que la lista "self.actions" puede tener menos elementos que los que
tiene "self.to_remove", en esos casos se produce el error.

Como solución se puede alterar el órden de las sentencias "ejecutar acciones" 
y
"limpiar acciones a eliminar". Adjunto los cambios que lo solucionan:

Index: cocos/actions.py
===================================================================
--- cocos/actions.py    (revisión: 194)
+++ cocos/actions.py    (copia de trabajo)
@@ -234,14 +234,15 @@
             `dt` : delta_time
                 The time that elapsed since that last time this functions was called.
         """
+        for x in self.to_remove:
+            self.actions.remove( x )
+
+        self.to_remove = []
+
         for action in self.actions:
             action._step(dt)
             if action.done():
                 self.remove( action )
-                
-        for x in self.to_remove:
-            self.actions.remove( x )
-        self.to_remove = []

         if len( self.actions ) == 0:
             self.schedule = False

Original comment by hugorusc...@gmail.com on 13 Mar 2008 at 7:09

GoogleCodeExporter commented 9 years ago
gracias! fixed in rev 196

Original comment by ricardoq...@gmail.com on 14 Mar 2008 at 2:10

GoogleCodeExporter commented 9 years ago
fixed.

Original comment by ricardoq...@gmail.com on 14 Mar 2008 at 2:31