Die Hauptressource in meinem Spiel ist Masse , die als Gleitkommazahl gespeichert wird und sich mit der Zeit ändert. Ressourcenknoten erhöhen die Masse und Fabriken entleeren sie. Wenn ich zum Beispiel einen Ressourcenknoten habe, der 5 Masse pro Sekunde liefert, werde ich bei 5 * deltaT
jedem Spielschritt Masse gewinnen . Die Masse wird auf die nächste ganze Zahl gerundet angezeigt, und die Gewinn- / Verlustindikatoren werden in Zehnteln angezeigt.
Wie soll ich mit einer Masse umgehen, die auf Null trifft? Dies schafft eine Race-Bedingung, wenn mehrere Fabriken versuchen, gleichzeitig zu bauen: Fabriken, die sich zuerst in der Warteschlange befinden oder die weniger Ressourcen verbrauchen, erhalten Priorität, sobald mehr Ressourcen eingehen, und werden so schneller als die anderen gebaut.
Wie kann ich damit umgehen? Soll ich den Schritt komplett überspringen?
quelle
Antworten:
Ich stimme Petr zu: Es gibt keinen festen Weg, dies zu tun. Wie Sie dies tun möchten, hängt davon ab, wie Sie Ihr Spiel gestalten möchten.
Unter diesen Umständen ist es jedoch sofort offensichtlich, auf welche Art von Mechanik Sie abzielen: Sie möchten nur, dass die Dinge so schnell wie möglich produziert werden, und zwar in dem Maße, wie Sie Masse zur Verfügung haben.
Produzieren innerhalb der Kapazität
Ich werde das Buch von Supreme Commander durchblättern, da Sie ein System verwenden, das dem von Supreme Commander sehr ähnlich ist. Das Verringern der Produktionskapazität ist eigentlich ziemlich einfach.
Ein Mechaniker für Produktionsgeschwindigkeit
In jedem Aktualisierungsschritt produzieren Ihre Fabriken nicht nur eine festgelegte Menge: Sie arbeiten mit einer Produktionsgeschwindigkeit , die bestimmt, wie viel Fortschritt sie in jedem Schritt machen und wie viel Masse sie verbrauchen. Wenn Sie mit 75% Kapazität produzieren, machen Ihre Fabriken in jedem Schritt 75% mehr Fortschritte und verbrauchen 75% der Masse im Vergleich zu 100% Kapazität.
Um die Produktionsgeschwindigkeit zu berechnen, sollten Sie Ihre Fabriken abfragen, bevor Sie überhaupt etwas bauen, um die Gesamtressourcen zu ermitteln, die in diesem Schritt bei voller Kapazität verbraucht würden. Dann führen Sie eine einfache Berechnung durch:
Nehmen wir an, Sie benötigen in diesem Schritt 125 Masse, um mit voller Kapazität zu produzieren, haben aber in diesem Schritt nur 100 Masse. Diese Gleichung liefert Ihnen eine Produktionsgeschwindigkeit von 0,8 (die dezimale Darstellung von 80%). Wenn Sie Ihren Fabriken anweisen, ihre Bauarbeiten tatsächlich auszuführen , geben Sie ihnen diesen Wert, um ihnen mitzuteilen, mit welcher Geschwindigkeit sie bauen: und jetzt wird Ihre Produktion auf ganzer Linie verlangsamt.
Alternativen
Sie könnten auch damit beginnen, Fabriken vorübergehend außer Betrieb zu setzen, bis die Produktionskapazität frei wird, und es könnte sehr interessant sein, zu beobachten, dass Fabriken, die von Generatoren weit entfernt sind, extrem ausgelastet sind.
Mehrere Ressourcen?
Wie Sie damit umgehen, bleibt Ihnen überlassen. Es gibt viele Möglichkeiten. Am einfachsten ist es wahrscheinlich, eine Produktionskapazität für jede Ressource zu berechnen und dann die niedrigste auszuwählen , sodass Ihre schwächste Ressource für den Rest zum Engpass wird.
quelle
Obwohl ich die Antwort von Jonathan Hobbs gut finde, finde ich ein Warteschlangensystem noch einfacher:
Dies wird wahrscheinlich im Durchschnitt genauso funktionieren wie die Implementierung von Jonathan. Jonathans Lösung kann jedoch Probleme bereiten, wenn die Arbeitsgeschwindigkeit sehr niedrig eingestellt ist und meine Implementierung eine Fabrik mit einer sehr hohen Ressourcenanforderung für diesen Frame haben könnte, die andere Fabriken für mehrere Frames blockiert.
quelle
Ich entwickle ein ähnliches Versorgungssystem in meinem eigenen Spiel, daher habe ich auch darüber nachgedacht, wie ich das Problem der Versorgungssperre und die Bevorzugung lösen kann. Um das Problem zu veranschaulichen, werde ich ein einfaches Beispiel erstellen:
Wenn Sie eine Liste haben: [Produzent1, Konsument1, Konsument2, Konsument3] und die Aktualisierung in der angegebenen Reihenfolge ab Angebot = 0 durchführen, erhalten Sie Folgendes:
consumer1 macht den ganzen Spaß, während consumer 2 und 3 hungern, bis consumer 1 zufrieden ist. Abhängig von Ihrem Spiel ist dies möglicherweise nicht wünschenswert. Ich weiß, in meinem Spiel ist es nicht. Wenn ich damit fertig bin, erstelle ich eine Warteschlange, in der Verbraucher, denen ein Tick eingegeben wurde, für den nächsten Tick an den hinteren Bereich der Warteschlange verschoben werden, an den Roy T. meiner Meinung nach gelangt. Das obige Beispiel würde so aussehen:
Auf diese Weise erhält jeder seinen angemessenen Anteil an den Ressourcen.
Ich plane auch, eine zusätzliche Warteschlange zu implementieren, die als Prioritätswarteschlange verwendet werden soll, damit der Benutzer bestimmte Strukturen mit Ressourcenpriorität auswählen kann. Die Prioritätswarteschlange wird immer vor der Standardwarteschlange bedient. Stellen Sie sicher, dass zuerst alle Produzenten aktualisiert werden und anschließend alle Ressourcen verbraucht werden. Anderenfalls bricht die Warteschlange zusammen, wenn Sie Ressourcen auf halbem Weg durch einen Haken produzieren und einige Konsumenten bereits ausgehungert sind.
Um es noch einmal zusammenzufassen: Aktualisieren Sie die Produzenten, dann die Prioritätswarteschlange, und verschieben Sie gefütterte Verbraucher an das Ende der Prioritätswarteschlange. Aktualisieren Sie dann die Standardwarteschlange und verschieben Sie gefütterte Verbraucher an das Ende der Standardwarteschlange.
quelle
Nun, ich werde auf Johns Idee näher eingehen, da wir dies ein wenig im Chat besprochen haben .
Bearbeiten: Diese Lösung ist eigentlich nur dann vorzuziehen, wenn der Verbrauchsartikel-Betrag davon abhängt, wie oft die Fabrik einen Stapel von Ressourcen erhalten soll. Wenn es egal ist, können Sie in der Tat nur eine Warteschlange verwenden.
Meine Lösung: Alle Fabriken in einer Prioritätswarteschlange. Die Priorität wird erhöht, da eine Fabrik unter Hunger leidet. Hunger, Priorität, auf Null gesetzt, wenn die Fabrik Ressourcen verbraucht hat. Oberste Priorität hat immer die Beschaffung der nächsten Ressourcen.
Bei der Bestimmung, welche Fabrik welche Ressourcen in einer Art Pseudocode erhält:
Auf diese Weise stellen Ihre Fabriken nacheinander jeweils 1 Produkt her. Wenn Sie die Anzahl der verbrauchten Produkte berücksichtigen möchten, damit billigere Produkte häufiger hergestellt werden, können Sie beispielsweise die Priorität um 1 / verbrauchte Menge erhöhen.
quelle
Komische Frage.
Was Sie tun müssen, hängt von der von Ihnen erstellten Spiellogik ab . Sie können eine Warteschlange machen, Sie können überspringen. Kommt darauf an, wie du denkst, dass sich dein Spiel verhalten soll. Korrigieren Sie mich, wenn ich mich in Ihrer Frage geirrt habe.
quelle
Sie können für alle Konstruktionen eine Anzahl des gesamten Ressourcenbedarfs pro Tick behalten. Wenn ein Ressourcenspeicher weniger als diese erforderliche Menge erreicht, wird der gesamte Aufbau vollständig gestoppt, bis sich der Speicher so weit angesammelt hat, dass er mindestens einen Tick Produktion unterstützt. Dann kann die Produktion wieder aufgenommen werden.
Anstatt die Produktionsrate als Float zu speichern, ist sie binär - entweder produziert Ihre Fabrik mit voller Geschwindigkeit oder nicht.
Abgesehen davon ist dieser Ansatz im Wesentlichen der gleiche wie die Antwort von Jonathan für die Produktionsraten-Sonderfälle 0,0 und 1,0 - ein beliebiger Gleitkommawert f mit 0,0 <= f <= 1,0 ist wahrscheinlich eleganter, da Sie keine ruckeligen Bewegungen der Speichermenge erhalten , aber die Logik sollte etwas einfacher sein.
quelle