2009-04-23 11 views
0

Ich möchte Spielobjekte aus Definitionsdateien (XMLs) laden und sie dann im Spiel mit vorbereiteten Eigenschaften (wie Waffen, Texturen, Max. Geschwindigkeit, Sichtweite usw.) erstellen. Ich dachte an IClonable Schnittstelle, aber es scheint sehr seltsam. Auch muss ich unterscheiden zwischen Einheiten (Soldaten, Fahrzeuge, vielleicht Flugzeuge) und Gebäuden.Laden von Spielobjekten aus ihrer Definition

+8

Was ist Ihre Frage? – JoshJordan

+0

So entwerfen Sie dieses "System". jmucchiello hat geantwortet (mit einer generischen Fabrik, die eine bestimmte Fabrik aufruft), aber ich möchte die Definitionsdateien nur einmal parsen (am besten beim Start) – mnn

Antwort

0

Klingt wie Sie wollen eine allgemeine Fabrik, die eine bestimmte Fabrik aufrufen kann. Die generische Fabrik übernimmt die Definitionsdatei und bestimmt den generischen Typ des Objekts "Waffe, Einheit, Gebäude". Dann übergibt es den DOM-Baum an eine bestimmte Fabrik für diesen Typ. Die Waffenfabrik weiß, wie man alle verschiedenen Waffen im System baut. Und es übergibt den DOM-Baum an den Konstruktor der Waffe, so dass alle Details für den Konstruktor verfügbar sind.

Wie Sie diese Fabriken schreiben, hängt davon ab, wie Ihr XML aussieht und wie "automatisiert" Sie es wirklich haben wollen. Sie müssen genauere Angaben machen, um eine spezifischere Antwort zu erhalten.

EDIT: Jetzt verstehe ich es. Sie möchten die XML-Dateien als Vorlage für die zukünftige Objekterstellung verwenden. Sie möchten ein generisches Objekt "Fahrzeug". Sie laden die XML-Datei für "Hubschrauber" und es erstellt eine neue "Klasse" von "Fahrzeug", ohne tatsächlich eine Klasse zu erstellen, nicht wahr?

Also, Sie erstellen ein Fahrzeug "Klasse", die alle Fahrzeuge abstammen. Dann erstellen Sie eine Fahrzeugvorlage "Klasse", von der alle Vorlagen abstammen. Das XML wird zum Instanziieren einer Vorlagenklasse verwendet. Die Vorlagenklasse wurde erstellt, um das tatsächliche Objekt zu instanziieren.

class vehicle_template { 
    vechicle_template(xmlstreamthing x); 
    // properties found in vehicles, set from xml 
}; 
class vehicle { 
    vechicle(vehicle_template v); 
    // properties vehicles have, taken from template 
}; 
vehicle vehicle_factory(string s) { 
    static map<string,vehicle_template> already_loaded; 
    vehicle_template vt = already_loaded.find(s); 
    if (vt == null) { 
     xmlstreamthing xml = get_xml_from_object_name(s); // you need to figure this part out 
     if (xml == null) { 
      throw no_such_vehicle(s); 
     } 
     vt = new vehicle_template(xml); 
     already_loaded.add(s,v); 
    } 
    return new vehicle(vt); 
} 

Offensichtlich ist das nicht runnable Code, aber es sollte Ihren Anfang bekommen.

Ich weiß nicht, wie Sie diese Objekte dazu bringen, sich anders zu verhalten, aber das sollte Ihr Ladeproblem lösen. Vielleicht brauchen Sie eine Sprache, in der Sie die Sprache eingeben können, in der Sie den Objekten zur Laufzeit Methoden hinzufügen können.

+0

Danke, aber ich wollte die Definitionsdateien nicht immer beim Erstellen von Objekten analysieren. – mnn

+0

Sie analysieren es nicht immer und immer wieder. Sie verwandeln es beim ersten Laden in einen DOM-Baum. Übergeben Sie den Baum dann an jede Fabrik, bis sie den Konstruktor trifft. Dann zerstört die ursprüngliche Fabrik (die den DOM-Baum baute) den Baum. Einmal analysieren, ein paar Mal durchlaufen, erledigt – jmucchiello

+0

Aber wenn es den DOM-Baum zerstört, muss er es beim Erstellen eines anderen Objekts erneut erstellen. Ich dachte über String-ID-basierte Objektdefinition nach und behalte Dictionary oder etwas ähnliches. – mnn

Verwandte Themen