Problemas con el movimiento del mouse

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Problemas con el movimiento del mouse

Notapor leonel06033 » Mié Oct 07, 2009 8:46 pm

Hola a todos:

bueno, soy nuevo en esto, pero estoy haciendo un pacman para linux, este va a ser mi primer juego.

La cuestion es que en la pantalla de presentación del pacman, se muestran varias optiones que van a ser seleccionadas por el uso del mouse, que hago a para logar esto.

Bueno, tomo el evento motion que genera el mouse al moverse y voy analizando su posicion (x,y) y voy comparando esta con la posición que ocupan las imagenes que representan las opciones del game, todo hasta aqui perfecto, pero es que se demora mucho en tomar las coordenadas y si muevo mucho el mouse por fuera de una opción cuando el mismo entra en el rango de una imgen, se me demora mucho en darse cuanta que ya esta en esa posición, es como si se fueran acomulando todas las coordenadas en una pila y el programa le valla dando tratamiento a cada una hasta llegar a la ultima, pero lo hace de forma muy lenta.

que podra ser eso amigo, si alguien tiene respuesta para eso, por favor respondan rapido puesto que estoy parado por eso.

saludos.
Avatar de Usuario
leonel06033
 
Mensajes: 10
Registrado: Lun May 25, 2009 5:15 pm

Notapor hugoruscitti » Mié Oct 07, 2009 11:59 pm

Si, tal como indicas los eventos que genera la aplicación
se almacenan en una pila a medida que llegan, si demoras
mucho en atender cada uno de ellos es probable que se
acumulen mas rápido de lo que se consumen.

La clave está en atenderlos lo mas rápido posible, por ejemplo,
si llega un evento de movimiento de mouse solamente mover
el cursor en pantalla y una vez que recorriste todos los eventos
de la aplicación recién ahí evaluar si el mouse ha quedado
sobre un componente (como un botón).

Un problema frecuente al atender los eventos es hacerlo de
a uno por ciclo de bucle. Por ejemplo el siguiente ejemplo
funcionaría muy lento, y los eventos se acumularán:

Código: Seleccionar todo
while 1
     evento = obtener_un_evento_de_la_cola()
     print evento
     procesar_evento (evento)
     procesar_coordenadas_sobre_objetos_de_la_interfaz(event)
     imprimir_pantalla()


¿por que sería lento?, primero, independientemente el lenguaje
que utilices, imprimir en consola con print o printf o cout ... es
muy lento, porque el programa realiza una operación de
entrada/salida y pierde mucho rendimiento. Segundo, no tiene
mucho sentido imprimir la pantalla cada vez que llega un evento,
sería mejor procesar los eventos y solo cuando terminen todos
recién ahí imprimir la pantalla.

Esta es una versión mejorada de lo anterior:

Código: Seleccionar todo
while 1
     while existan_eventos_en_cola:
           evento = obtener_un_evento_de_la_cola()
           procesar_evento (evento)
     
     procesar_coordenadas_sobre_objetos_de_la_interfaz()
     imprimir_pantalla()


Aunque, esto es generalizando, puede que tu código sea un
poco diferente. Cualquier cosa avisanos, la clave es no imprimir
en pantalla y vaciar la cola de eventos antes de imprimir...

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Problemas con el movimiento del mouse

Notapor leonel06033 » Jue Oct 08, 2009 3:46 pm

Hola una vez más:

Bueno, gracias a que no me deje caer obtube la respuesta al problema que tenían con el procesamiento a eventos del mouse motion.

Gracia le doy al administrador por responderme tan atentamente y veloz, esto demuestra que los encargados si que están puestos para el buen funcionamiento del foro, gracias.

Bueno, admin, la verdad que tienes razón en lo que me explicas, y como me dices es así como lo hago, de manera más precisa y óptima para el programa. Pero aunque lo tenía hecho de la manera más inteligente posible continuaba con el problema, que hice, pues utilice la función

Uint8 SDL_GetMouseState(int &x, int &y);

y actualizando los dispositivos con la función

SDL_PumEvents();

cada vez que el ciclo da una vuelta esto me funciona de maravillas.

muchas gracias, ahora el problema que tengo es otro y ese si que es viejo pero lo publicare por fuera en este mismo foro.

muchas gracias admin.
Avatar de Usuario
leonel06033
 
Mensajes: 10
Registrado: Lun May 25, 2009 5:15 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron