Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//Das Programm befindet sich in der Datenbank bspw. gebaeude_146, was eine Baeckerei ist. //(void) holen wird ausgeführt if (Gebaeude der Gebaeudeklasse C_Muehle im Einflussbereich && Lagerbestand des entsprechende Gebaeude an Mehl >= 1 && Lagerbestand für Mehl der Baeckerei < Lagerlimit für Mehl der Baeckerei) { Mehl bei entsprechender Muehle -- Mehl bei Baeckerei ++ }//holen //(void) produzieren ausführen if (Lagerbestand für Mehl der Baeckerei >= 2 && Lagerbestand für Wasser der Baeckerei >= 1 && Lagerbestand der Baeckerei für Brot < Lagerlimit für Brot der Baeckerei) { Mehl =-2 Wasser -- Brot ++ }//produzieren //Die Datenbank wird dann weiter abgelaufenen. Gelangt sie nun z.B. bis Eintrag gebaeude_179, was ein Kontor ist, wird folgendes Prozedere durchlaufen. //(void) holen ausführen if (Gebaeude im Einflussbereich && Lagerbestand des entsprechende Gebaeude an Brot >= 1 && Lagerbestand für Brot des Kontors < Lagerlimit für Brot des Kontors) { Brot bei entsprechender Baeckerei -- Brot bei Kontor ++ }//holen //(void) liefern ausführen if (Gebaeude im Einflussbereich && Lagerbestand des Kontors an Wasser >= 1 && Lagerbestand für Wasser der Baeckerei < Lagerlimit für Wasser der Baeckerei) { Wasser bei Kontor -- Wasser bei Baeckerei ++ }//liefern |
Community-Fossil
Jeden Frame zu prüfen ob sich ein Gebäude im Einflußbereich befindet finde ich etwas Aufwendig.
Die Aktionen(„Holen“ und „Liefern“) würde ich in eigenen Klassen kapseln.
Die Klasse, die deine Gebäude verwaltet sollte Überschneidungen finden und die Gebäude miteinander "Verknüpfen" indem man sich das "Holen" von dem einen Gebäude holt und es dem anderen Übergibt. Die Gebäude sind also nicht direkt voneinander abhängig, sondern von den „Holen“ und „Liefern“ Objekten. Das Produzieren ist eine ganz andere Sache.
Vorweg: Von wievielen Gebäuden reden wir denn so? Je nachdem kannst du nämlich entsprechende "Optimierungen" ignorieren und bei Bedarf einfach über alle Gebäude einer Insel iterieren, wenn du auf der Suche nach Waren gehst.
Für den eigentlichen Produktionsablauf würde empfehlen nicht alle x Sekunden das Abholen/Liefern zu überprüfen. Was ggf eine Idee wäre, wäre ein Eventsystem zu verwenden (einfach mal nach googlen). Sprich sowas in Richtung von "Ware x steht zur Abholung bereit". u.U. könnte man auch pro Ware entsprechende "Prioritätenlisten" führen in denen alle Gebäude gespeichert werden, die die Ware in empfang nehmen könnten. Diese Liste wird dann von oben nach unten abgearbeitet, bis ein Empfänger gefunden wurde, der die Ware abnimmt.
Ansonsten könnte man aus der "Not" auch eine Tugend machen und die "Transportmatrix" auch manuell regulierbar machen. Sprich dass der Spieler selbst Transportwege und Prioritäten festlegen kann, aber mit entsprechender Autofunktion, die dann eben einfach über Standardprioritätslisten wie oben angedacht arbeitet.
Alternativ könnt ihr das Problem erstmal KISS mäßig lösen und es ähnlich wie in Siedler online machen. Da gehen alle Waren über die zentralen Lager und es gibt keine Direkttransporte. Somit seid ihr erstmal Komplexität los und könnt euch zunächst auf die anderen Spielaspekte konzentieren.
Naja. Gerade in C++ sind iterationen über mehrere tausende Objekte weniger das Problem . Die Einbindung von Transportwegen als zusätzliches Spielelement finde ich übrigens sehr interessant . Kennst du per Zufall die Victoria Reihe von Paradox? Da kann man per Gesetz einstellen, ob die Fabriken und Infrastruktur automatisch von den Kapitalisten (aus)gebaut werden oder ob nur der Staat bauen darf. Außerdem kann man Waren subventionieren um damit der KI bzw den Kaptialisten gewisse Anreize zu liefern und gezielt auszubauen auch wenn man nicht alles selbst macht.
So könnte man wahlweise entweder wie in anno alles selbst bauen oder aber wie in Sims city nur gewisse Flächen ausschreiben. Im Prinzip könnte man dann noch ein Bildungsystem einbauen womit bestimmte Betriebe bestimme Ausbildungen brauchen. So würde eine Schreinerei eher von einem Mitbürger mit Meisterausbildung gebaut werden als von einem ehemaligen unfreien.
Ungeachtet der Möglichkeiten würde ich euch aber zu zwei Dingen raten:
-keine Scheu vorm iterieren über alle Gebäude. Gerade in C++ ist das iterieren über ein paar tausend Objekte oft nicht so zeitfressend. Lieber später schauen wo es wirklich klemmt.
-vereinfacht möglichst alle Spielaspekte so weit es geht und baut sie erstmal zusammen. Komplexer kann man sie bei entsprechender Planung später auch noch machen.
...
Wenn ihr dann noch dabei seid wünsche ich mir persönlich die Möglichkeit per Gesetz (am Anfang einfache Auswahl-später ggf Politik gebunden) entsprechende Gewerbeflächen ausschreiben zu können, die dann nach dem Angebot von Edukten, Nachfrage von Produkten und vorhanden Arbeitskräften von der KI bebaut wird. Später wünsche ich mir politische Gesinnungen und Ausbildungstruktur innerhalb der Bevölkerung einen Koop. Dann kann einer nämlich einen auf Transportwesen und Wirtschaft machen und der andere kümmert sich um Bevölkerung, Bildung und Außen- sowie Innenpolitik .
Konkret könnte der zweite Punkt folgendermaßen umgesetzt werden:
-erster Prototyp mit einfacher zentraler Warenverteilung; vielleicht eben noch mit wirklichen Mikrotransporten zwischen Betrieb und Lagern (Grundlage)
-beim zweiter Prototyp tragen sich alle Gebäude mit einen Bedarf in Waren(-std::map) ein, welche wiederum entsprechende std::priority_queue beinhaltet. Wenn nun ein Gebäude beim Updaten feststellt, dass es ne Ware über hat, schaut es in der Warenmap nach welche Gebäude "Bedarf" haben und "fragt" diese ob sie sie abholen (Direkttransporte).
-der dritte Prototyp könnte das System um Transporte zwischen den zentralen Lagern/Umschlagsplätze erweitern (Warenflusssteuerung).
P.S: ein Tutorial zur Umsetzung von Eventsystemen bleibe ich leider schuldig, da ich sie immer nur verwende aber nicht selbst implementiere.
Community-Fossil
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »NachoMan« (04.04.2014, 12:33)
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Werbeanzeige