[pyar] consulta sobre cocos2d : como refescar una escena en medio de un callback?

claudio canepa ccanepacc en gmail.com
Lun Mar 19 07:17:11 ART 2012


On Mon, Mar 19, 2012 at 12:56 AM, Pablo De Napoli <pdenapo en gmail.com> wrote:

> Hola,
>
> Mando esta consulta a la lista porque sé que hay varios de los autores
> de Cocos2d en ella
> (de hecho, por lo que sé el proyecto surgió de un Pycamp de PyAr!)
> Resulta que estoy ayudando a un amigo a programar un jueguito con
> Cocos2d (en realidad
> él lo está programando para la versión para Iphone, pero el problema
> que tenemos se ve en la versión para python.)
>
> Fijensé el código que copio a continuación: es un menú en el cual
> quiero que cuando se
> ejecute la función callback llamada on_option pretendo que primero se
> vuelva invisible
> esa opción del menú y después de una pausa (de 4 segundos) vuelva a ser
> visible.
>
> El problema es que Cocos2d no parece registrar el cambio en la escena
> (y redibujarla) hasta
> que termina la función on_option.
>

La linea
time.sleep(4)
que está en tu on_option le dice a python 'espera 4 segundos antes de
retornar'

Y el codigo muestra otro problema de diseño:
   El metodo draw de cualquier nodo solo deberia ser llamado desde el
metodo visit del mismo nodo (*)

   El codigo del usuario no llama directamente a visit, la llamada a ese
metodo va a ser parte del on_draw que recibe la escena.(*)

(*) Salvo que estés definiendo una subclase con draw o visit
personalizados, en donde por supuesto estaria bien llamar con super(....)

Dicho de otra manera, el codigo del usuario modifica los datos de la
escena, pero deja que el render sea llamado automaticamente en el evento
on_draw, que se encargara de visitar todos los nodos ('visit') pidiendo que
se dibujen a si mismos (draw).


> Hay alguna manera de decirle que quiero que refresque la escena
> después de que le dije que la
> etiqueta se vuelva invisible? (para que el efecto se vea!)
>
> muchas gracias por cualquier ayuda que puedan darme!
> saludos
> Pablo
>
>
[snip code]


>
>
>    def on_option(self,que_opcion):
>       print "opcion "+str(que_opcion)+" seleccionada \n"
>       lista_items=self.get_children()
>       # Las opciones estan numeradas desde 1 pero los indices de un array
>       # en python comienzan en 0
>       lista_items[que_opcion-1].visible=False
>       self.draw()
>       time.sleep(4)
>       lista_items[que_opcion-1].visible=True
>
>

La forma elegante y clara de hacerlo en cocos seria cambiar el on_option a

# ac viene de import cocos.actions as ac
def on_option(self,que_opcion):
      print "opcion "+str(que_opcion)+" seleccionada \n"
      lista_items=self.get_children()
      # Las opciones estan numeradas desde 1 pero los indices de un array
      # en python comienzan en 0
     lista_items[que_opcion-1].do(ac.Hide() + ac.Delay(4) + ac.Show())


claudio

--
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120319/40cff151/attachment.html>


More information about the pyar mailing list