• Lunes 23 de Diciembre de 2024, 01:36

Autor Tema:  Manejo De Eventos  (Leído 2299 veces)

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Manejo De Eventos
« en: Lunes 30 de Enero de 2006, 18:21 »
0
quiero implementar un metodo ( clase ) reusable para el manejo de eventos, me gustaria que me comenten como lo resuelven, lo que yo tenia pensado es algo asi:

una clase que tiene un metodo para agregar callbacks asociados a cierto evento, cuando el evento se produce llama a los metodos que tiene en la lista asociados a ese evento.

por ejemplo una clase A con un metodo handleEvent, instancio dos objetos a y b, y los agrego en la lista para el evento KEYDOWN, cuando el evento se produce la clase manejadora de eventos llama a los metodos de los dos objetos.

que les parece?
como lo resuelven ustedes?

Neko-sama

  • Miembro activo
  • **
  • Mensajes: 99
    • Ver Perfil
Re: Manejo De Eventos
« Respuesta #1 en: Lunes 30 de Enero de 2006, 20:08 »
0
creo que en un juego hay varias formas de caputar eventos...

por ejemplo lo que dices tu...
el evento KEYDOWN

deberías tener un metodo general para dibujar y otro para actualizar variables...

yo lo manejo asi:

el el metodo general de actualizar... uso la api del DirectInput que esta cada ciclo de procesador preguntando si hubo una tecla pulsada... entonces comparo que tecla y se la mando a la clase de mi personaje... entonces este ve cual es y si fué arriba entonces llama a un metodo propio (caminar arriba)


no tengo nada mas sofisticado... creo que es muy generico...
tengo una clase DirectInput que captura las teclas y se las envio a mis clases de personajes que resiven esta clase y responde de acuerdo a teclas pulsadas...


el otro tipo de evento del que te hablé, son los eventos generados por el juego mismo...
por ejemplo... que pasen 4 minutos de juego... o que los personajes lleguen a cierta area de una etapa... o que muevan tal cosa... o que agarren otra... etc...

cuentame que te parece y seguimos cambiando formas de desarrollo

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Manejo De Eventos
« Respuesta #2 en: Lunes 30 de Enero de 2006, 20:37 »
0
pero eso requiere que cada juego modifique el ciclo principal, en cambio si tengo una clase manejadora de eventos a la que cada clase agrega un callback y para que evento se dispara esto se haria automaticamente, ya que cada clase que instancie se agregaria automaticamente a la lista y en el main solo llamaria a por ejemplo eventHandler.handleEvents() o algo asi entonces mi main no seria modificado para ningun juego en particular. implementé algo parecido con el dibujo de las imagenes, cada objeto que se quiere dibujar en la pantalla hereda de una clase que tiene como atributos coordenadas, una imagen y un boolean que indica si es visible o no, entonces luego se agregan a una lista de la clase principal ( Game ) y en el loop principal lo unico que hago es llamar a un metodo llamado drawThings que recorre la lista dibujando los objetos que estan visibles.

osea lo que quiero hacer es que el loop principal sea igual para todos osea
dibujarFondo()
manejarEventos()
dibujarCosas()

y que cada objeto del juego diga como, donde y cuando dibujarse y a que eventos responde y como solo agregandose a dos listas de la clase Game.

no se si les parece complicado.

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Manejo De Eventos
« Respuesta #3 en: Lunes 30 de Enero de 2006, 20:42 »
0
lo que trato de hacer es algo tipo modelo vista controlador pero en la universidad lo vimos muy por arriba

para mas informacion:
http://es.wikipedia.org/wiki/MVC

si alguien tiene mas conocimientos sobre este patron y puede ayudar en esto creo que seria muy bueno para que los programadores de videojuegos empecemos a programar de modo mas generico y estandarizado.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Manejo De Eventos
« Respuesta #4 en: Lunes 30 de Enero de 2006, 21:01 »
0
Hola.

A mi, a priori, se me ocurren tres métodos para manejar eventos, que pueden combinarse entre ellos.

El primero sería siguiendo puramente el MVC (que viene a ser el que has mencionado). Se tiene una clase que hace de controlador entre los eventos generados por el sistema operativo (vista) y las clases que necesitan ser notificadas mediante listeners para realizar las acciones pertinentes (modelo). Yo particularmente hago un wrapper de la parte dependiente del sistema que genera eventos independientes del sistema que son pasados al controlador de eventos de entrada (otro tipo de eventos pueden ser pasados a otras clases). Éste, a su vez, los notifica a los listeners que tenga registrados.

Por otro lado, puedes emular un sistema de recogida de eventos por polling de mensajes al estilo Windows o X11, en el que tu clase controladora pasa a encolar los eventos recibidos del sistema de manera abstracta, y las clases que quieren manipular esos eventos piden los que existan encolados.

También existe la posibilidad de mantener un vector con el estado de cada tecla y los últimos datos con respecto al ratón, y acceder desde cualquier parte para consultar su estado. Viene bien para comprobar el estado de algunas teclas como Shift, aunque puede ser sustituido igualmente por el primer caso y un buen diseño.

Particularmente prefiero el primer método, aunque una combinación con el segundo es muy útil en ciertos casos: cuando se quieren conocer eventos asíncronos de manera síncrona. Por ejemplo, cuando se recibe una señal, otro proceso envía un mensaje, un hilo notifica alguna acción, etc. En estos casos, en vez de interrumpir el flujo del programa, se encolan para poder ser leídos cuando corresponda. Una variación sería llamar a listeners para notificar los eventos que se hayan acumulado en la cola durante el último ciclo, para poder mantener un esquema de funcionamiento reactivo uniforme.

Lo más importante es mantener un nivel de abstracción por encima del sistema operativo subyacente, de manera que todo el código que se construya por encima sea independiente de plataforma, ya se estén manejando los eventos por DirectInput, Platform SDK, X11 o lo que sea.

Espero que te haya aclarado algo esta cuestión.

Un saludo,

Ruben3d

editado: Para el manejo genérico de eventos de cualquier tipo he desarrollado una serie de clases reutilizables que se pueden aplicar a casi cualquier contexto, aunque su diseño está íntimamente ligado a características del lenguaje en el que están implementadas. Si desarrollas en C++ te las dejo aqui.