¿Existe un patrón generalmente aceptado para realizar diversas acciones dentro de un juego? Una forma en que un jugador puede realizar acciones y también que una IA puede realizar acciones, como movimiento, ataque, autodestrucción, etc.
Actualmente tengo una BaseAction abstracta que usa genéricos .NET para especificar los diferentes objetos que devuelven las diferentes acciones. Todo esto se implementa en un patrón similar al Comando, donde cada acción es responsable de sí misma y hace todo lo que necesita.
Mi razonamiento para ser abstracto es que puedo tener un único ActionHandler, y AI puede poner en cola diferentes acciones implementando la acción base. Y la razón por la que es genérico es para que las diferentes acciones puedan devolver información de resultados relevante para la acción (ya que diferentes acciones pueden tener resultados totalmente diferentes en el juego), junto con algunas implementaciones comunes de beforeAction y afterAction.
Entonces ... ¿hay una forma más aceptada de hacer esto, o suena bien?
fuente
Respuestas:
No creo que haya una forma aceptada de la aplicación de este concepto, pero me gusta mucho compartir cómo me suelen tratar con esto en mis juegos. Es una combinación del patrón de diseño Command y el patrón de diseño Composite .
Tengo una clase base abstracta para acciones que no es más que un contenedor alrededor de un
Update
método que se llama cada cuadro, y unFinished
indicador para indicar cuándo la acción ha terminado de ejecutarse.También utilizo el patrón de diseño compuesto para crear un tipo de acciones que sea capaz de alojar y ejecutar otras acciones. Esta también es una clase abstracta. Se reduce a:
Luego tengo dos implementaciones de acciones compuestas, una para ejecución paralela y otra para ejecución secuencial . Pero la belleza es que, dado que el paralelo y la secuencia son acciones en sí mismas, pueden combinarse para crear flujos de ejecución más complejos.
Y el que gobierna las acciones secuenciales.
Con esto en su lugar, se trata simplemente de crear implementaciones de acciones concretas y usar las acciones
Parallel
ySequence
para controlar el flujo de ejecución. Terminaré con un ejemplo:He utilizado con éxito este sistema para conducir todo el juego en una aventura gráfica antes, pero probablemente debería funcionar para casi cualquier cosa. También fue lo suficientemente simple como para agregar otros tipos de acciones compuestas, que se utilizaron para crear bucles de ejecución y condicionales.
fuente
Draw
método ya está construido sobre el estado de la entidad y los cambios son automáticos. En un renderizador en modo retenido como Flash, puede usar el patrón observable para realizar cambios en las entidades que se propagan a los objetos de visualización, o realizar la conexión manualmente dentro de la propia entidad.Character
clase tiene unaPosition
propiedad y unDraw
método que lee cuál es el valor actual dePosition
y dibuja la imagen correcta allí. En esta situación, solo necesita actualizar el valor dePosition
que el resultado se verá automáticamente en la pantalla.Character
tiene unaPosition
propiedad, pero delega la representación a algún tipo deSprite
objeto que se representa automáticamente mediante un gráfico de escena o algo así. En esta situación, debes asegurarte de que tanto la posición del personaje como la posición del sprite estén siempre sincronizadas, lo que implica un poco más de trabajo. Aún así, en cualquier caso, no veo por qué el administrador de acciones debería tener algo que ver con eso. :)