[Olpc-uruguay] Consultas Pygame

Flavio Danesse fdanesse en gmail.com
Sab Feb 20 14:14:53 EST 2010


Bueno, ahora me tranqué con el adaptador que no me devuelve los eventos a
pygame.

El adaptador lo que haces capturar los eventos en el canvas de la ventana de
sugar, traduce la informacion de este evento y la agrega en un userevent que
pone en la cola de eventos de pygame, a lo cual este responde.

El tema es que cuando muevo el mouse sin apretar ningun boton o apreto el
mouse sin moverlo, los eventos no llegan nunca a pygame.
Ejecutando el juego sin el adaptador, todo marcha perfecto, así que el error
está en el adaptador.

El adaptador está publicado aca:
http://sites.google.com/site/sugaractivities/home/herramientas/adaptadorpygamesugar

Lo que sigue es un fragmento de codigo del adaptador donde se capturan los
eventos del mouse y se pasan a un userevent (self._post(evt) ) en pygame. Un
detalle a tener en cuenta es que al crear las mascaras de eventos para el
mouse, cuando se crea con gtk.gdk.POINTER_MOTION_HINT_MASK el evento se
traduce correctamente solo una vez, al crear la ventana y luego ya no
funciona, esto no es una particularidad de sugar ni gtk, siempre es así
según lo que leí, sin embargo, no entiendo mucho sobre las mascaras, así que
les dejo esto para que vean que se les ocurre.

*    def _get_mouse_pressed(self):*
        return self.__button_state
*
    def _mousedown_cb(self, widget, event):*
        self.__button_state[event.button-1] = 1
        return self._mouseevent(widget, event, pygame.MOUSEBUTTONDOWN)

*    def _mouseup_cb(self, widget, event):*
        self.__button_state[event.button-1] = 0
        return self._mouseevent(widget, event, pygame.MOUSEBUTTONUP)

*    def _mouseevent(self, widget, event, type):*
        evt = pygame.event.Event(type, button=event.button, pos=(event.x,
event.y))
        self._post(evt)
        return True

*    def _mousemove_cb(self, widget, event):*
        if event.is_hint:
            x, y, state = event.window.get_pointer()
        else:
            x = event.x
            y = event.y
            state = event.state

        rel = (x - self.__mouse_pos[0], y - self.__mouse_pos[1])
        self.__mouse_pos = (x, y)

        self.__button_state = [
            state & gtk.gdk.BUTTON1_MASK and 1 or 0,
            state & gtk.gdk.BUTTON2_MASK and 1 or 0,
            state & gtk.gdk.BUTTON3_MASK and 1 or 0,
        ]

        evt = pygame.event.Event(pygame.MOUSEMOTION, pos=self.__mouse_pos,
rel=rel, buttons=self.__button_state)
        self._post(evt)
        return True





El 20 de febrero de 2010 02:06, Flavio Danesse <fdanesse en gmail.com>escribió:

> En la xo Pablo.
> Yo siempre pruebo todo en la xo a medida que hago cambios en el codigo y
> muchas veces programo directamente en la xo, salvo que sea algo muy
> complicado entonces me resulta mas comodo mi notebook por el teclado sobre
> todo.
>
>
>
> El 20 de febrero de 2010 01:51, Pablo Moleri <pmoleri en gmail.com> escribió:
>
>> 2010/2/20 Flavio Danesse <fdanesse en gmail.com>
>>
>> Gabriel, el tema es que no se si se ajustará esta idea al juego que estoy
>>> haciendo porque de todos los jugadores que participan, solo uno es el
>>> usuario, el resto son robots que hay que controlar por tiempo para que el
>>> usuario pueda ver que es lo que hacen.
>>>
>>> Está bien, esperar los eventos del usuario, pero los robots hay que
>>> enlentecerlos de lo contrario el usuario solo vería los resultados de sus
>>> jugadas pero no entendería que fue lo que hicieron sus rivales.
>>>
>>> Justamente me parece que lo que plantea Gabriel se ajuste muy bien a tu
>> realidad. Podés mantener tu bucle principal refrescando la pantalla, etc,
>> hasta que llegue el "evento de usuario" que en realidad te indica que es el
>> turno del siguiente judador.
>> Tenés que tener en cuenta que los eventos en pygame son períodicos, o sea
>> que una vez que lo recibís tenér que desactivar el timer.
>>
>> Con respecto a la respuesta de Esteban, justamente eso es lo que trataba
>>> de decir, que no funciona, que si pongo:
>>>  pygame.time.delay(1500) obtengo el mismo retardo que si pongo
>>> pygame.time.delay(10000)
>>>
>>> En esto no se como ayudarte, habría que buscar en algún foro, pero según
>> la documentación con 15*1000 debería esperar 15 segundos, capaz que hay
>> algún otro evento que interrumpe el delay y por eso no lográs que espere más
>> de 1s.
>>
>>>
>>> Gracias a la ayuda de ustedes, el juegó bajó de 74% de CPU a 20% y nunca
>>> pasa del 26% en la RAM.
>>>
>> Muy bueno! ¿Esto es en una XO o en otra PC?
>>
>> Ya solucioné los problemas de audio que tenía.
>>> Se que el juego es una bobada, pero la verdad que me está quedando bien
>>> bonito, con suerte, espero poder terminarlo para abril
>>>
>> Vamo arriba!! :D
>>
>>
>>
>> _______________________________________________
>> Olpc-uruguay mailing list
>> Olpc-uruguay en lists.laptop.org
>> http://lists.laptop.org/listinfo/olpc-uruguay
>>
>>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://lists.laptop.org/pipermail/olpc-uruguay/attachments/20100220/6f3de279/attachment.htm 


More information about the Olpc-uruguay mailing list