Text aus einer XML Datei auslesen und anzeigen lassen?

  • Hi,


    ich weiß das die ScriptDoku noch nicht raus ist aber vielleicht ja jemand eine Idee.
    Es geht um folgendes.


    Jeder kennt diese blauen Info Kreise bei denen man einen Text angezeigt bekommt wenn man drauf geht.
    Was mich von Anfang an störte war, das man den Text nicht nach seinen Bedürfnissen anpassen kann.


    Ich hab also mal ein bisschen gesucht und bin in der alten Script Doku auf den InfoSpotTrigger gestoßen.


    Dieser löst beim betreten einen Sound auch und zeigt einen Infotext an. Nach einiger Zeit, bzw. wenn man die Maustaste drückt verschwindet das Fenster und auch der Trigger wird auf visibility=false geschaltet.


    Hier mal das Script:
    [lua]
    customInfoTrigger = {}


    local customInfoTrigger_mt = Class(customInfoTrigger);


    function customInfoTrigger:onCreate(id)
    g_currentMission:addUpdateable(customInfoTrigger:new(id));
    end;


    function customInfoTrigger:new(id)
    local instance = {};
    setmetatable(instance, customInfoTrigger_mt);

    instance.triggerId = id;
    addTrigger(id, "triggerCallback", instance);

    instance.infoSymbol = getChildAt(id, 0);
    local x, y, z = getTranslation(instance.infoSymbol);
    instance.posY = y;
    instance.jump = 0.05;

    instance.isEnabled = true;

    return instance;
    end;

    function customInfoTrigger:delete()
    removeTrigger(self.triggerId);
    end;

    function customInfoTrigger:update(dt)
    if self.isEnabled then
    rotate(self.infoSymbol, 0, 0.005 * dt, 0);

    self.jump = self.jump - 0.00015 * dt;
    local x, y, z = getTranslation(self.infoSymbol);
    setTranslation(self.infoSymbol, x, y + self.jump, z);

    if y + self.jump <= self.posY then
    self.jump = 0.05;
    end;

    if not getVisibility(self.triggerId) then
    self.isEnabled = false;
    end;
    end;
    end;

    function customInfoTrigger:triggerCallback(triggerId, otherId, onEnter, onLeave, onStay)
    if onEnter and self.isEnabled then
    if (g_currentMission.player ~= nil and otherId == g_currentMission.player.rootNode) or (g_currentMission.controlledVehicle ~= nil and otherId == g_currentMission.controlledVehicle.components[1].node) then
    if g_currentMission.infospotSound ~= nil then
    playSample(g_currentMission.infospotSound, 1, 1, 0);
    end;
    g_currentMission:infospotTouched(triggerId);
    self.isEnabled = false;
    setVisibility(self.triggerId, false);
    end;
    end;
    end;
    [/lua]



    Ich denke, der entscheidende Part wäre hier im triggerCallback Bereich zu setzten.


    Diese Script möchte ich mir, in der Hoffnung das es funktioniert, so umschreiben, das er den Infotext aus einer externen xml Datei läd und anzeigt.


    Die xml Datei habe ich wie folgt aufgebaut:



    Der Name der Datei lautet customInfo.xml


    Im Trigger sollte der Pfad zur XML Datei, der Pfad zur Sounddatei sowie die Nummer der Info (info1, info2 u.s.w) eingetragen werden.
    Meine frage wäre jetzt, ist es möglich den Text aus der Datei auszulesen und anzeigen zu lassen und wenn ja, wie?


    Hat da jemand eine Idee oder Tipps für mich?


    lg
    Webby

  • Das solltest du eigentlich ganz einfach lösen können. Prinziepiell verhält es sich ähnlich einer Index-Abfrage bei einem Mod...


    [lua]
    local xmlFile = loadXMLFile("TempXML", "filename"); -- filename = der Pfad zur Datei. Bestenfalls per UserAttribut festlegen/abfragen und mit self.baseDirectory arbeiten...
    local text = getXMLString(xmlFile, "customInfo.info1.text" );
    [/lua]


    text sollte dann der String sein, den du in der XML definiert hast ;)


    mfG

  • Vielen Dank für die Antwort.
    So ungefähr sah meine Lösung auch schon aus allerdings kam ich mit dem loadXMLFile nicht klar :)


    Wie rufe ich jetzt den Text einzeln auf wenn in den UserAttribues des Triggers z.B. "info2" steht?
    Bzw. wie stelle ich diesen auf dem Bildschirm da?
    Ich dachte da evtl. an ein Fenster ähnlich wie beim Blitzer von rafftnix.

  • webalizer


    Naja die Doku bringt mir garnichts wenn ich nicht weiß wonach ich suchen soll -.-
    Aber die Idee mit dem manual Ignition Script ist gut, da werde ich mir sicherlich was einfallen lassen.
    Danke dafür.


    Einen Eintrag in
    [lua]local xmlFile = loadXMLFile("TempXML", "filename");[/lua]
    verstehe ich nicht so ganz und zwar das hier "TempXML".
    Was ist damit gemeint?


    lg
    Webby

  • Keine Ahnung was du meinst. Mein Link führt dich genau zu den XML-Funktionen?!


    Du willst einen Text also String auslesen, also

    XML
    function getXMLString(integer objectId, string attributePath)


    was dann im Fall info2 so aussehen würde:


    XML
    getXMLString(TempXML_ID, customInfo.info2.text)


    TempXML ist ein beliebiger Name, wie du das XML-Objekt nennen willst.

  • Ok das hab ich soweit kapiert, denke ich.


    Das Problem ist, das in der externen XML Datei nicht nur (z.B) info2 drin steht sondern mehrere Infos.
    Deswegen soll man ja im Trigger eintragen können welcher info Text angezeigt werden soll.


    Wenn ich jetzt
    [lua]getXMLString(TempXML_ID, customInfo.info2.text)[/lua]
    eintrage, wird doch nur der Text aus Bereich info2 angezeigt, egal was im Trigger steht oder nicht?

  • Richtig. So wie es jetzt dort steht, wird immer nur der Info2 geladen und angezeigt.


    Also ein Attribute im GE anlegen:

    Code
    <Attribute name="TextName" type="string" value="info1"/>


    In deinem Skript läßt du nun das Attribute auslesen:


    [lua]
    self.textInfo= getUserAttribute(id, "TextName");
    [/lua]


    Zusammen mit den bisherigen Stand, läßt es sich dann zusammenbauen.


    [lua]
    self.TextDerAngezeigtWerdenSoll = getXMLString(xmlFile , "customInfo."..self.textInfo..".info#text"),
    [/lua]


    Die XML müsste dann so aussehen:



    So sollte das ganze dann gehen. Also die XML wird geladen, dort der Eintag CustomInfo, dann der angelegte Name, im Namen dann der Eintrag info, wo der Sting der tags Text geladen wird.


    Den Pfad zur XML solltest du auch im GE anlegen, per Attribute. So kann jeder User dann den Pfad selber eintragen. Wie der Pfad dann aussehen muss, bzw der Code in der Lua, das weißt du ja... siehe MapSoundTrigger.Lua, dort war es genauso.


    Rendern läßt du dann den text self.TextDerAngezeigtWerdenSoll .


    Nochmal Nachtrag: Der TextName aus dem GE, also wo info1 steht, der muss indentisch sein, mit dem in der XML, info1. Kannst du auch Webby1 nennen, muss dann aber im GE auch auf Webby1 geändert werden...


    EDIT: warum schreibt ihr immer antworten wenn ich auch am schreiben bin... ;)

  • Was vielleicht eine "bessere" Alternative wäre, die bereits vorhandenen l10n-Einträge zu erweitern... So müsstest du nicht zwingend eine neue XML anlegen könntest beispielsweise fremdsprachige Texte nutzen, ohne produktiven Code schreiben zu müssen ;).


    [lua]
    self.displayingText = g_i18n:getText(getUserAttribute(ObjectId, "displayingText" ));
    [/lua]


    und dann halt ein UserAttribute "displayingText" vom Typ String für deinen Trigger ;)


    Lautet der Wert des UserAttributes beispielsweise "InfoText01" kannst du ja in der ModDesc der Map folgendes erweitern :


    XML
    <l10n>
    <text name="InfoText01">
    <en>Type your texte here</en>
    <de>Schreibe deinen Text hier</de>
    </text>
    <l/10n>


    MfG

  • Dann müsste das Skript aber in die Map eingebaut sein, oder?
    Sprich in der Moddesc der Map das Skript laden lassen, und beim onCreate dementsprechend dann modOnCreate.seinSkriptOnCreate, damit die Texte in der Moddesc der Map erweitert werden können.


    Oder sehe ich das jetzt falsch?


    Wenn er das Skript einfach in den Mods Ordner packen will, dann muss er ja, wenn die User die Texte frei erstellen können sollen, eine zusätzliche XML anlegen.

  • Das ist das Problem wenn man sich sprachlich nicht richtig ausdrücken kann... :whistling:


    Meinte ja, wenn man im Skript mit
    [lua]g_i18n:getText(getUserAttribute(ObjectId, "displayingText" ));[/lua]
    arbeitet, das man dann doch auch in der Moddesc die Texte angeben muss.


    Wenn man so ein Skript schreibt,will man ja auch das die User die Texte selber verändern können. Somit würde ja der Fall mit extra Zip wegfallen.
    Bliebe in dem Fall nur die Möglichkeit das Skript als extraSource in die Map einzubauen, damit man mit den l10n texten arbeiten kann.


    Ich hatte jetzt gedacht das es doch eine Möglichkeit gibt im skript mit [lua]g_i18n:getText(getUserAttribute(ObjectId, "displayingText" ));[/lua] zu arbeiten und die Texte aus einer anderen Moddesc zu laden. Beispiel, Extra Zip mit Skript im Mods Ordner und in der Moddesc der Map die Texte anlegen.

  • :D ...Mod kennt doch jeder... :D !


    Warum die Texte wo anders angelegt werden sollen ist doch logisch. Er möchte ja erstmal ein Icon im GE setzen, wo dann beim betreten des Triggers der Text kommt, so wie bei den Standart Icons auch. Also eine erweiterung der Hilfs Icons. Die Idee ist ja auch ganz gut. Nur das Problem wenn er die Texte in die Moddesc seines Skriptes packt, ist doch dann wieder das niemand der es auf seine Map einbaut die Texte selber verändern kann.
    Daher ja auch der Einfall mit der extra XML, wo jeder die Texte frei ändern kann.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!