Estoy trabajando en un juego donde algunos eventos dentro del juego deben ocurrir de vez en cuando. Un buen ejemplo sería un tutorial. Comienzas el juego, y en varios puntos del juego ocurre un evento:
- Te encuentras con tu primer enemigo, el juego se detiene y recibes una explicación sobre cómo matarlo.
- Has matado al primer enemigo, recibes un mensaje de "buen trabajo".
- Obtienes un nuevo elemento, un menú con la ventana emergente de estadísticas de elementos.
- etcétera etcétera.
El juego en el que estoy trabajando es un juego de rompecabezas en el que las reglas del juego son más o menos iguales, por lo que parece ineficaz codificar todos estos eventos en niveles separados.
¿Debo definir de alguna manera estos eventos en una fuente externa, como XML? Luego, escriba un intérprete que lea el XML y establezca los requisitos de eventos para el nivel. No estoy seguro de cómo podría definir un evento que debería ocurrir cuando mataste a dos enemigos, por ejemplo.
Para ser claros, no estoy buscando el mejor lenguaje de programación o lenguaje de script para hacer esto, sino más bien el mejor método para manejar esto.
¡Gracias!
Editar: un segundo ejemplo, ya que mi pregunta era bastante difícil de entender:
El problema que tengo es poner algunas acciones adicionales en el juego en un procedimiento que siempre es prácticamente el mismo. Al igual que una batalla RPG, todos tienen un turno, eligen una habilidad, etc., siempre es lo mismo. Pero, ¿y si hubiera un caso en el que me gustaría mostrar una escena en algún punto intermedio? Hacer que toda la estructura del juego pase en una clase de batalla alterada con la escena incluida parece muy ineficiente. Me pregunto cómo se hace esto generalmente.
fuente
Respuestas:
Esto depende mucho de cómo se comunican los eventos entre los objetos de tu juego. Por ejemplo, si está utilizando un sistema de mensajería central, entonces podría tener un módulo tutorial que escuche ciertos mensajes y cree ventanas emergentes tutoriales cada vez que escuche ciertos mensajes. Luego, puede configurar qué mensaje escuchar, junto con la ventana emergente que se mostrará, en un archivo XML o algo analizado por el módulo tutorial. Al tener un objeto de tutorial separado que monitorea el estado del juego y muestra ventanas emergentes de tutorial cuando nota cosas en el juego, puede cambiar el objeto de tutorial a voluntad sin necesidad de cambiar nada más sobre su juego. (¿Es este el patrón Observador? No estoy familiarizado con todos los patrones de diseño).
En general, depende de la complejidad de su tutorial si vale la pena preocuparse por esto. Codificar los eventos en su código y / o niveles no me parece un gran problema para solo un puñado de ventanas emergentes de tutoriales. Tengo curiosidad por saber qué es exactamente lo que tiene en mente que le hace pensar que será ineficiente, ya que todo lo que debe hacer con cada disparador es enviar un mensaje al módulo tutorial, algo así como TutorialModule.show ("1st_kill");
fuente
Aquí están las restricciones de diseño tal como las entiendo:
El código de juego básico no se preocupa por los requisitos de nivel y no debe estar acoplado al código que se ocupa de ellos.
Al mismo tiempo, es el código de juego central que sabe cuándo ocurren los eventos específicos que cumplen con esos requisitos (obtener un objeto, matar a un enemigo, etc.)
Los diferentes niveles tienen diferentes conjuntos de requisitos y esos deben describirse en alguna parte.
Teniendo en cuenta eso, probablemente haría algo como esto: Primero, crea una clase que represente un nivel de juego. Encapsulará el conjunto de requisitos específicos que tiene un nivel. Tiene métodos a los que se puede llamar cuando ocurren eventos del juego.
Dale al código de juego central una referencia al objeto de nivel actual. Cuando se producen eventos de juego, le dirá el nivel llamando a métodos en él:
enemyKilled
,itemPickedUp
, etc.Internamente,
Level
necesita algunas cosas:LevelRequirement
objetos que describen el conjunto específico de objetivos que necesita para ese nivel.Cuando ingresas a un nivel, crearás un
Level
con elLevelRequirement
s correcto , configurarás el código de juego y le darás ese nivel.Cada vez que ocurre un evento de juego, el juego lo pasa
Level
. Eso a su vez calcula los datos agregados (número total de enemigos asesinados, enemigos de ese tipo asesinados, etc.) Luego recorre sus objetos requeridos, dando a cada uno los datos agregados. Un requisito prueba para ver si se cumple, y si es así, se genera el comportamiento resultante apropiado (que muestra el texto del tutorial, etc.)LevelRequirement
básicamente necesita dos cosas:RequirementType
enumeración con cosas comoFIRST_KILL
y luego una granswitch
que sabe cómo verificar cada tipo).Todavía queda la cuestión de dónde se describen esos conjuntos de requisitos. Podría hacer algo como XML u otro formato de archivo de texto. Eso es útil si:
Si ninguno de esos es el caso, probablemente los construya directamente en código. Más simple siempre es mejor.
fuente
Pensé que necesita saber cómo hacer estos eventos y el resto de la publicación es sobre eso. Si desea almacenar estos eventos, use una base de datos relacional o descríbalos por texto y use un lenguaje de scripting (analizará y evaluará Tú). :)
Lo que desea es reconocer los eventos ocurridos (1) y luego realizar algunas acciones que estos eventos exigen (imprimir mensaje, verificar pulsación de tecla ...) (2). También desea que estos eventos sucedan solo una vez (3).
Básicamente, desea verificar las condiciones y luego programar un comportamiento.
Cómo reconocer eventos (1)
¿De qué están hechos los eventos?
En una visión más general, cada evento está compuesto de:
Cómo almacenar estos eventos
En alguna estructura de datos:
También puede almacenarlo en una base de datos relacional, aunque parece que no es necesario, si desea hacer este juego en grande, es posible que necesite hacer uno.
Luego tienes que analizar estas cadenas / cosas. O puede usar un lenguaje de script como Python o LUA o un lenguaje como LISP, todos pueden analizarlo y ejecutarlo por usted. :)
Cómo usar estos eventos en el bucle del juego (2)
Necesitará estas dos estructuras de datos:
Algoritmo:
Cómo realizar estas acciones por sí mismo (2)
Haces una lista de objetos, que tienen la función "actualizar". A veces se les llama entidades (en el motor Quake) o actores (en el motor Unreal).
Acción "decir algo"
La acción "requiere clave"
Que métodos aprender
fuente