Pregunta

Estoy intentando crear un sistema central de distribución de eventos utilizando una especie de patrón Observer para mi pequeño proyecto de RPG y necesito consejos sobre la mejor manera de representar los datos de los eventos.

Tendré un EventManager que registre clases de escucha para diferentes tipos de eventos definidos en una enumeración estática como Event_Input_KeyPressed o Event_Game_ActorMoved.Almacenará eventos en una cola y los enviará a los oyentes correspondientes, cada uno de los cuales tendrá un método handleEvent(Event e) o algo así.

Cada evento será un objeto de tipo Evento, que contiene datos como su tipo de evento.

Mi pregunta es, dado que la naturaleza de los datos del evento difiere considerablemente entre los tipos de eventos, ¿cómo deberían representarse estos datos?Todavía no estoy seguro exactamente de qué tipos de eventos querré crear en el futuro, así que quiero que esto sea lo más flexible posible.Por ejemplo, un evento podría desencadenar otros eventos si ciertas condiciones son verdaderas (es decir,cuando el jugador presiona la tecla de acción, se abre una puerta si el jugador está en un lugar determinado y tiene una llave).¿XML o scripts son una buena opción?Otra forma que se me ocurre es crear una clase personalizada para cada evento general, como ActorEvent o MenuEvent, pero eso parece realmente ineficiente e inflexible.Además, dado que algunos objetos como Carácter solo necesitan conocer eventos muy específicos, como cuando se presiona la tecla "w", supongo que no es necesario que se les notifique cuando se presionan otras teclas como "h".¿Es viable crear tipos de eventos tan específicos o existe una manera mejor?es decir.Event_Input_KeyPressed_W

Gracias

¿Fue útil?

Solución

  1. Cree implementaciones concretas de sus eventos, extendiéndose desde el Event objeto básico.En primer lugar, será más fácil distribuir los objetos; es decir, en su cola, solo necesitaría hacer una instanceof para determinar cómo manejar el objeto.
  2. Su código de escucha de eventos se vuelve MUCHO más simple y más estrictamente controlado.No hay posibilidad de que un evento del mouse pase a un evento clave.Además, no necesitarás probar y transmitir el objeto de evento en el nivel del oyente.
  3. No veo por qué no se puede crear un detector de eventos "filtrado" que solo quiera recibir notificaciones de una condición particular de un evento en particular; de hecho, creo que es una buena idea.
  4. Probablemente idearía algún tipo de mecanismo de despacho conectable.Eso significa que cuando agrega un nuevo tipo de evento, no necesitará actualizar la cola, simplemente puede registrar un nuevo despachador.Dependiendo de lo que desee lograr, su cola pasaría el evento al despachador (proporcionando algunos medios para que el despachador obtenga una lista de oyentes).El despachador determinará si sabe cómo manejar el evento o no.Luego, el despachador enviará el evento a los oyentes requeridos (y, según lo que desee lograr), devolverá un resultado que indique si el evento se envió o no.

eso es mho

Otros consejos

  • Como usted dice que la estructura de diferentes tipos de eventos es diferente, es mejor crear clases de concreto para cada evento.¡No necesitas crear una clase para cada llave!Pero generalmente eventos de teclado
  • Usted dice que los personajes solo deben ser notificados de una tecla específica.No sé cuál es la sobrecarga de notificar al carácter y dejar que ese objeto ignore las teclas no relacionadas, pero si este es un patrón común entre las clases, por ejemplo, tiene 10 clases diferentes que pueden reaccionar a un conjunto especial de llaves, sería buenoPara no repetir los códigos e implementar una capa de despachador entre eventos y oyentes.Un tipo de disptoqueros puede ser KeyFilterdispatcher que recibe una lista de claves y filtros eventos basados en eso.¡Otro tipo de despachadores puede ser SEQDispatcher que solo perturba a los oyentes si se consideran múltiples eventos en un orden específico! Me gusta la idea plugnable de disfacher, dijo Madprorammer.¡También es posible que desee crear tuberías de despachadores también!
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top