Gebäudeverwaltung eines SimCity-Klons

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Nova

Betreff: Gebäudeverwaltung eines SimCity-Klons

BeitragSo, Jul 29, 2012 3:28
Antworten mit Zitat
Benutzer-Profile anzeigen
(Mehr Fragen der Theorie, keine Code im Beitrag enthalten. Wink)


Ich habe mir in letzter Zeit ein paar Gedanken gemacht, wie ich die Gebäude einem SimCity-Klons verwalten würde.
Also es gibt mehrere Gebäudearten mit unterschiedlichen Unterarten. (Beispielsweise Grundart Kraftwerk - Unterart Atomkraftwerk, Kohlekraftwerk, Solaranlage...), und diese will ich dynamisch laden können. Das Spiel soll wenn möglich so modifizierbar wie möglich sein. Ich möchte daher keine neue .exe-Datei kompilieren müssen, nur weil ein neues Kraftwerk dazukommt. Oder, wenn nicht zu schwer, gar eine ganz neue Ressource einführen, wie Müll, um den man sich kümmern muss. (SimCity-Spieler werden wissen, was ich meine.)
Hinzu kommt natürlich, dass die Gebäude auch verwaltet werden müssen. Um zu wissen, wie viel Strom ich zur Verfügung habe, müssen alle Kraftwerke durchgegangen werden. Und zwar nur die Kraftwerke, die anderen Gebäude interessieren mich nur beim Verbrauch, nicht aber bei der maximalen Energie.

Meine Ideen:
  • Ein Haupttype für alle Gebäude, davon erbt jede Grundart von Gebäuden (Kraftwerke, ....) und davon wiederum erbt jede Unterart (Atomkraftwerk, Kohlekraftwerk, ...). Jede Unterart-Klasse kommt dabei in eine globale Liste der Oberklasse, und jede Grundart-Klasse kommt in eine globale Liste der Haupttyp-Klasse.
    Dabei besteht dann jedes neue Gebäude aus einem Objekt einer Unterart-Klasse und wird in eine globale Liste dieser Klasse eingefügt.
    Problem: Mir ist keine Möglichkeit bekannt, neue Klassen dynamisch per Datei zu erstellen, ohne neu kompilieren zu müssen. (Zwischenfrage: Würde das ganze in C++ funktionieren? Also dynamische neue Klassen?)
  • Ein Type für alle einzelnen Gebäudeunterarten. Dabei würde ein Feld "bezeichnung" oder so die genauere Art identifizieren. Eine Liste von Listen würde dabei die Verwaltung übernehmen. Die Hauptliste beinhaltet jede Unterliste, wobei jede Unterliste alle Gebäude eines Types beinhaltet. Alle Kraftwerke würden also in die eine Unterliste kommen, und diese Unterliste zusammen mit anderen in die Hauptliste. Vorteil ist ja, dass das dynamische Laden von neuen Gebäude kein Problem wäre, da einfach nur ein neues Objekt erzeugt werden müsste.
    Problem: Ich finde diese Methode unschön. Es ist wie in der Mathematik oder Physik: Wenn die Formel schön aussieht, ist sie wahrscheinlich richtig.
    Diese Methode benutzt die Vererbungs-Möglichkeiten von BlitzMax gar nicht und hat daher auch nicht die "sinnhafte Untergliederung", die automatisch bei Vererbung auftaucht ("Eine Unterart gehört zu einer bestimmten Grundart"). Hinzu kommt, dass ich für jedes Gebäude beispielsweise speichern müsste, welchen Effekt es auf beispielsweise die Luftverschmutzung hat, obwohl dort für jedes Gebäude dieser Art eigentlich 0 steht, da es keinen Effekt darauf hat. Bei der ersten Methode würde ich die Luftverschmutzung dann ganz einfach gar nicht erst aufschreiben.



Ich kenne mich in BlitzMax noch nicht so super aus, daher sind mir vielleicht ein paar Wege nicht bekannt, dies einfach und "schön" zu lösen.
Ich würde mich über Tipps oder Hilfe zu meinem Problemen freuen. Auch einfach ein Satz à la "Joa, passt schon. Nimm die x-te Methode, die ist gut." wäre möglich. Smile


Gruß, Nova
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Xeres

Moderator

BeitragSo, Jul 29, 2012 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe nicht, wie da keine Vererbung bei der zweiten Variante auftauchen soll. Du kannst Gebäude um Kraftwerke erweitern und diese dann Extern laden.
Ich lade die Objekte in eine Liste und wenn ich eines brauche, mache ich eine Kopie. Das reduziert die undurchsichtige Klasse einer Klasse von Objekten Beziehung.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Nova

BeitragSo, Jul 29, 2012 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Ich sehe nicht, wie da keine Vererbung bei der zweiten Variante auftauchen soll. Du kannst Gebäude um Kraftwerke erweitern und diese dann Extern laden.

Das ist mein Problem: Wie soll ich extern neue Klassen laden? Ich würde ja gerne eben die Definition von Kraftwerke dynamisch aus Dateien laden, damit ich diese nicht neu kompilieren muss, allerdings weiß ich nicht, ob das überhaupt möglich ist.

Hier mal ein Codebeispiel, wie ich mir die erste Methode gedacht habe (mal ohne dynamisches Laden der Gebäudearten):
BlitzMax: [AUSKLAPPEN]
Type TGebaeude Abstract
Field bauzeit:Int
Field bereitsGebaut:Int ' Wie viel vom Gebäude wurde bereits gebaut?
Field kosten:Int
Field ausrichtung:Int ' In welche Richtung schaut das Gebäude?
Field alter:Int

Global listeGrundarten:TList = New TList()
' Die Liste enthält alle Objekte der Klassen, die von TGebaeude erben.

Method zeichnen () Abstract
EndType

Type TKraftwerke Extends TGebaeude Abstract
Field energieproduktion:Int


Global listeKraftwerksarten:TList = New TList()
' Die Liste enthält alle Objekte der Klassen, die von TKraftwerke erben.
EndType

Type TAtomkraftwerk Extends TKraftwerke
Field gefahrKernschmelze:Int ' Wie hoch ist die Gefahr einer Kernschmelze?
EndType

Type TKohlekraftwerk Extends TKraftwerke
Field luftverschmutzung:Int ' Wie stark verschmutzt das Gebäude die Umwelt?
EndType

' Die einzelnen Werte können sich für die letzten Ebenen der Vererbung ändern, so
' produziert ein altes Kraftwerk weniger Strom, erzeugt aber mehr Verschmutzung.
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Xeres

Moderator

BeitragSo, Jul 29, 2012 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Type TGebaeude Abstract

EndType

Type TKraftwerk Extends TGebaeude
Field energieproduktion:Int
Field luftverschmutzung:Int
Field gefahrKernschmelze:Int

Global Kraftwerkstypen:TList = New TList()
EndType


TKraftwerk sollte reichen, wenn du nicht mehrere Varianten an z.B. Kohlekraftwerken planst - du musst halt eine Vererbung vorher aufhören, wenn du das Laden erlauben willst.
Ich würde die verschiedenen TKraftwerk Arten in einer Liste speichern und das entsprechende Objekt kopieren, wenn ein funktionierendes Objekt benötigt wird.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group