Pregunta

Estoy escribiendo un texto juego y necesito un sistema de combate sencillo, como en los lodos, de ejecutar los comandos, y de vez en cuando "tick" sucede, cuando todos los comandos se ejecutan, jugador y monstruos a hacer daño, todos los tipos de cosas diferentes que pasa. ¿Cómo implementar ese concepto? Pensé en hacer una variable que contiene la última señal tiempo, y una función que sólo pone los acontecimientos en la pila y cuando que el tiempo es (tiempo + x) las ejecuta todas simutaniously. ¿Hay alguna variante más fácil o más limpia de hacer eso?

Lo que sería posible sintaxis para eso?

double lastTickTime;
double currentTime;

void eventsPile(int event, int target)
{
// how do i implement stack of events? And send them to execute() when time is up?
}

void execute(int event, int target)
{
     if ((currentTime - lastTickTime) == 2)
     {
         eventsHandler(event, target);
     }    
     else 
     { // How do I put events on stack?
     }
}
¿Fue útil?

Solución

El problema con la pila de acción simple es que el orden de las acciones probablemente será el momento basan - quienquiera tipos más rápido golpearán un primer golpe. Probablemente debería introducir prioridades en la pila, de modo que, por ejemplo, todos los eventos globales activan en primer lugar, a continuación, eventos de acción criaturas, pero esos eventos de acción están clasificadas por algún atributo como la agilidad, o nivel. Si una criatura tiene mayor agilidad a continuación, que se pone el primer golpe.

Otros consejos

Por lo que he visto, la mayoría de estos motores son de eventos, en lugar de tiempo, basada. con un nuevo ser tick provocado algún intervalo después de la última tick terminó. (Evitando así principalmente la cuestión de la ticks que toman más tiempo que el intervalo)

Esto también simplifica la implementación; sólo tiene un bucle de juego que activa un evento tick, entonces sleeps / yields para el intervalo requerido. Que es triviales .

Puede además ser simplificado mediante el modelado del mundo como un árbol, donde cada elemento gestiona eventos que se propagan (como ticks) a sus hijos. siempre y cuando se evite / gestionar 'loops', esto funciona bien (lo he hecho).

Esto reduce eficazmente el sistema tick a algo como esto (psudocode):

while (isRunning) {
    world->tick();
    sleep(interval);
}

En la mayoría de los casos, los theres poca necesidad de conseguir mucho más elegante que el ajuste de la longitud de la duración anterior.

Cualquier acción entidades individuales sería parte de su propia cola de acciones, y manipulados durante su propia "marca" eventos.

Por lo general, los comandos del usuario sería dividida en comandos "meta" "dentro del juego" y, cualquier cosa dentro del juego no haría más que modificar cola de acciones de su personaje, para ser procesado en su siguiente pulso, según la normalidad de cualquier otra entidad.

simple combate basado en ronda sigue naturalmente de esta fundación. en tiempo real puede ser modelado con una división más fina de ticks, con la opción de 'tiempo-pooling'.

Usar un temporizador ejecutar cada x ms (mientras que x es la ticktime), ejecutar las acciones puestas en la pila en ese método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top