Wie einfach tick-basierte Engine in c ++ implementieren?
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?
}
}
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 tick
s zu vermeiden, das länger als das Intervall)
Dies vereinfacht auch die Umsetzung; Sie haben einfach eine Spielschleife, dass Trigger ein tick
Ereignis, dann sleep
s / yield
s 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 tick
s, optional mit 'Time-Pooling'.
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.