Frage

Ich bin ein Text-Spiel zu schreiben, und ich brauche ein einfaches Kampfsystem, wie in MUDs, Sie Befehle erteilen, und ab und zu „Tick“ geschieht, wenn all diese Befehle ausführen, Spieler und Monster Schaden verursachen, alle Arten von verschiedenen Sachen passiert. Wie implementiere ich dieses Konzept? Ich dachte an eine Variable machen, die letzten Tick Zeit hält, und eine Funktion, die nur puts Ereignisse auf dem Stapel, und wenn diese Zeit (Zeit + x) führt sie alle simutaniously. Gibt es eine einfachere oder sauberere Variante, das zu tun?

Was wäre möglich Syntax für das?

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?
     }
}
War es hilfreich?

Lösung

Das Problem mit einfacher Aktion Stack ist, dass die Reihenfolge der Aktionen wahrscheinlich Zeit basierte sein wird - wer Arten schnellsten einen ersten Hit schlagen. Sie sollten wahrscheinlich Prioritäten im Stapel einführen, so dass beispielsweise alle globalen Ereignisse zuerst auslösen, dann Kreaturen Aktionsereignisse, aber diese Aktion Ereignisse werden von einigen Attributen wie Agilität, oder Ebene bestellt. Wenn eine Kreatur höhere Agilität hat dann, dass es den ersten Treffer wird.

Andere Tipps

Von dem, was ich gesehen habe, die meisten solche Motoren sind Ereignis, anstatt Zeit, basiert. mit einem neuen tick Wesen ausgelöst einig Intervall nach dem letzten tick beendet. (Also vor allem die Frage des ticks zu vermeiden, das länger als das Intervall)

Dies vereinfacht auch die Umsetzung; Sie haben einfach eine Spielschleife, dass Trigger ein tick Ereignis, dann sleeps / yields für den gewünschten Zeitraum. Welche ist trivial .

Es kann weiter durch die Modellierung der Welt, als ein Baum vereinfacht werden, wobei jedes Element ausbreitende Ereignisse (wie ticks) verwaltet, um ihre Kinder. so lange, wie Sie vermeiden / verwalten ‚Loops‘, das funktioniert gut (ich habe es getan).

Dies reduziert effektiv das tick System zu so etwas wie dieser (psudocode):

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

In den meisten Fällen, Theres wenig Bedarf viel schicker zu bekommen, als für die Länge der vorherigen Dauer eingestellt werden.

Jede einzelne Einheiten Aktionen Teil ihrer eigenen Aktion Warteschlange würde, und während ihrer eigenen „tick“ Ereignisse behandelt.

In der Regel Benutzerbefehle aufgeteilt in „ingame“ wären und „Meta“ Befehle, alles im Spiel nur ihren Charakters der Aktion Warteschlange ändern würde, in ihrem nächsten Tick verarbeitet werden, wie pro normal für jede andere Einheit.

Einfacher rundenbasierten Kampf folgt natürlich aus dieser Stiftung. Realtime kann mit einer feineren Teilung ticks, optional mit 'Time-Pooling'.

modelliert werden

Verwenden Sie einen Timer alle x ms Ausführung (während x Ihr Ticker ist), führen alle auf den Stapel gelegt Aktionen in diesem Verfahren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top