From 0ecd13ef347ecfe47cce8fb11965cc958db19c89 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 19 Jul 2009 11:38:49 +0100 Subject: [PATCH] Load waggons from XML files as well --- include/IRollingStock.hpp | 2 +- schemas/waggon.xsd | 12 +++++++++ src/Train.cpp | 6 ++--- src/Waggon.cpp | 43 +++++++++++++++++++++++++------ waggons/coal_truck/coal_truck.xml | 4 +-- 5 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 schemas/waggon.xsd diff --git a/include/IRollingStock.hpp b/include/IRollingStock.hpp index 50fd7d8..dc2f437 100644 --- a/include/IRollingStock.hpp +++ b/include/IRollingStock.hpp @@ -46,6 +46,6 @@ typedef shared_ptr IRollingStockPtr; // Make various waggons and engines IRollingStockPtr loadEngine(const string& aResId); -IRollingStockPtr makeWaggon(); +IRollingStockPtr loadWaggon(const string& aResId); #endif diff --git a/schemas/waggon.xsd b/schemas/waggon.xsd new file mode 100644 index 0000000..a678ca2 --- /dev/null +++ b/schemas/waggon.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/Train.cpp b/src/Train.cpp index 941c197..eb1f561 100644 --- a/src/Train.cpp +++ b/src/Train.cpp @@ -94,7 +94,7 @@ const double Train::SEPARATION(0.1); Train::Train(IMapPtr aMap) : myMap(aMap), myVelocityVector(makeVector(0.0f, 0.0f, 0.0f)) { - myParts.push_front(Part(loadEngine("red"), true)); + myParts.push_front(Part(loadEngine("pclass"), true)); enterSegment(engine(), aMap->startLocation()); @@ -102,14 +102,14 @@ Train::Train(IMapPtr aMap) move(0.275); for (int i = 1; i <= 5; i++) - addPart(makeWaggon()); + addPart(loadWaggon("coal_truck")); mySmokeTrail = makeSmokeTrail(); } void Train::addPart(IRollingStockPtr aVehicle) { - Part part(makeWaggon()); + Part part(aVehicle); enterSegment(part, myMap->startLocation()); // Push the rest of the train along some diff --git a/src/Waggon.cpp b/src/Waggon.cpp index ad9197d..163cc58 100644 --- a/src/Waggon.cpp +++ b/src/Waggon.cpp @@ -18,35 +18,51 @@ #include "IRollingStock.hpp" #include "IModel.hpp" #include "IResource.hpp" +#include "IXMLParser.hpp" +#include "ILogger.hpp" +#include "ResourceCache.hpp" #include using namespace std; // All cargo waggons -class Waggon : public IRollingStock { +class Waggon : public IRollingStock, public IXMLCallback { public: - Waggon(); + Waggon(IResourcePtr aRes); ~Waggon() {} + // IRollingStock interface void update(int aDelta); void render() const; IControllerPtr controller(); double speed() const { return 0.0; } double length() const { return myModel->dimensions().x; } + + // IXMLCallback interface + void text(const string& localName, const string& aString); private: IModelPtr myModel; + IResourcePtr myResource; static const float MODEL_SCALE; }; const float Waggon::MODEL_SCALE(0.4f); -Waggon::Waggon() +Waggon::Waggon(IResourcePtr aRes) + : myResource(aRes) { - IResourcePtr res = findResource("coal_truck", "waggons"); - - myModel = loadModel(res, "coal_truck.obj", MODEL_SCALE); + static IXMLParserPtr parser = makeXMLParser("schemas/waggon.xsd"); + + parser->parse(myResource->xmlFileName(), *this); +} + +// Load information from the XML file +void Waggon::text(const string& localName, const string& aString) +{ + if (localName == "model") + myModel = loadModel(myResource, aString, MODEL_SCALE); } void Waggon::update(int aDelta) @@ -64,8 +80,19 @@ IControllerPtr Waggon::controller() throw runtime_error("Cannot control a waggon!"); } -IRollingStockPtr makeWaggon() +namespace { + Waggon* loadWaggonXml(IResourcePtr aRes) + { + log() << "Loading waggon from " << aRes->xmlFileName(); + + return new Waggon(aRes); + } +} + +// Load a waggon from a resource file +IRollingStockPtr loadWaggon(const string& aResId) { - return IRollingStockPtr(new Waggon); + static ResourceCache cache(loadWaggonXml, "waggons"); + return cache.loadCopy(aResId); } diff --git a/waggons/coal_truck/coal_truck.xml b/waggons/coal_truck/coal_truck.xml index 62fbf34..6b0b7c2 100644 --- a/waggons/coal_truck/coal_truck.xml +++ b/waggons/coal_truck/coal_truck.xml @@ -1,5 +1,5 @@ - + Coal truck coal_truck.obj - + -- 2.39.2