Visibility in LS2013

  • Hallo alle,


    seit langem habe ich mich mal wieder ans Scripten gewagt.
    Ich glaube ich bin zu dumm mit setVisibility zu arbeiten?


    wenn ich mit:


    [lua]setVisibility(self.test1, true);[/lua]


    arbeite passiert nichts.


    auch wenn ich:


    [lua]getVisibility(self.test1);[/lua]
    mache, und dies mit tostring printen lasse, sagt er "nil"


    die self.test1 habe ich mit Util.indexToObject korrect verlinkt.


    Was mache ich Falsch?


    Mit freundlichen Grüßen


    Schlüter55v

  • hier ist mal der Code:
    [lua]Viewobject = {};


    function Viewobject.prerequisitesPresent(specializations)
    return SpecializationUtil.hasSpecialization(Motorized, specializations);
    end;


    function Viewobject:load(xmlFile)
    self.view1 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.view1#Index"));
    self.view2 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.view2#Index"));
    self.view3 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.view3#Index"));
    self.view4 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.view4#Index"));
    self.view5 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.view5#Index"));
    self.view6 = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.view6#Index"));
    self.statusview = 0;
    self.setview = 0;
    setVisibility(self.view1, false);
    setVisibility(self.view2, false);
    setVisibility(self.view3, false);
    setVisibility(self.view4, false);
    setVisibility(self.view5, false);
    setVisibility(self.view6, false);
    end;


    function Viewobject:delete()
    end;


    function Viewobject:mouseEvent(posX, posY, isDown, isUp, button)
    end;


    function Viewobject:keyEvent(unicode, sym, modifier, isDown)
    end;


    function Viewobject:update(dt)
    if InputBinding.hasEvent(InputBinding.viewplus) then
    self.statusview=self.statusview + 1;
    end;
    if InputBinding.hasEvent(InputBinding.viewminus) then
    self.statusview=self.statusview - 1;
    end;
    end;


    function Viewobject:updateTick(dt)

    if self:getIsActive() then
    local test = getVisibility(self.view1)
    if self.statusview == 7 then
    self.statusview = 0;
    end;
    if self.statusview == -1 then
    self.statusview=0;
    end;
    end;
    if self.statusview == 0 then
    setVisibility(self.view1, false);
    setVisibility(self.view2, false);
    setVisibility(self.view3, false);
    setVisibility(self.view4, false);
    setVisibility(self.view5, false);
    setVisibility(self.view6, false);
    self.setview = self.statusview;
    end;

    if self.statusview == 1 then
    setVisibility(self.view1, true);
    setVisibility(self.view2, false);
    setVisibility(self.view3, false);
    setVisibility(self.view4, false);
    setVisibility(self.view5, false);
    setVisibility(self.view6, false);
    self.setview = self.statusview;
    end;

    if self.statusview == 2 then
    setVisibility(self.view1, false);
    setVisibility(self.view2, true);
    setVisibility(self.view3, false);
    setVisibility(self.view4, false);
    setVisibility(self.view5, false);
    setVisibility(self.view6, false);
    self.setview = self.statusview;
    end;

    if self.statusview == 3 then
    setVisibility(self.view1, false);
    setVisibility(self.view2, false);
    setVisibility(self.view3, true);
    setVisibility(self.view4, false);
    setVisibility(self.view5, false);
    setVisibility(self.view6, false);
    self.setview = self.statusview;
    end;

    if self.statusview == 4 then
    setVisibility(self.view1, false);
    setVisibility(self.view2, false);
    setVisibility(self.view3, false);
    setVisibility(self.view4, true);
    setVisibility(self.view5, false);
    setVisibility(self.view6, false);
    self.setview = self.statusview;
    end;

    if self.statusview == 5 then
    setVisibility(self.view1, false);
    setVisibility(self.view2, false);
    setVisibility(self.view3, false);
    setVisibility(self.view4, false);
    setVisibility(self.view5, true);
    setVisibility(self.view6, false);
    self.setview = self.statusview;
    end;

    if self.statusview == 6 then
    setVisibility(self.view1, false);
    setVisibility(self.view2, false);
    setVisibility(self.view3, false);
    setVisibility(self.view4, false);
    setVisibility(self.view5, false);
    setVisibility(self.view6, true);
    self.setview = self.statusview;
    end;


    end;


    function Viewobject:draw()
    renderText(0.5,0.5, 0.022, tostring(self.statusview));
    renderText(0.5,0.45, 0.022, tostring(self.setview));
    renderText(0.5,0.4, 0.022, tostring(test));



    end;


    function Viewobject:onLeave()
    end;
    [/lua]


    und in der XML:


    XML
    <view1 index="0>13|0" />
    <view2 index="0>13|1" />
    <view3 index="0>13|2" />
    <view4 index="0>13|3" />
    <view5 index="0>13|4" />
    <view6 index="0>13|5" />
  • Oha, bei dem Code würde sich jeder Entwickler im Grab umdrehen. Soviel doppelt, da schleichen sich sehr leicht Fehler ein.
    Einlesen geht mit einer while-Schleife und einer Tabelle ganz schön kompakt und viel flexibler in Bezug auf weitere view-Objekte. In updateTick brauchst du die ganzen if-Dinger nicht, das geht mit einer simplen for-Schleife und Überpfüfung, ob der Zähler gleich dem statusview ist. Und in update kannst du das statusview schön mit Modulo setzen, ann fällt die Überprüfung in updateTick auch weg.
    Das Resultat dürfte dann vielleicht 40-50 Zeilen lang sein und deutlich flexibler und deutlich weniger fehleranfällig als jetzt.

  • Freut mich wenn es geklappt hat :).


    Vielleicht noch ein gut gemeinter Rat meinerseits. Dein Code ist doch sehr unübersichtlich, bzw. kann man selbiges mit wesentlich weniger Quellcode hinbekommen. Warum sage ich dir das? Ganz einfach, wenn man es von Anfang an richtig "lernt", kann man sich einiges an Arbeit, Zeit und auch Performance sparen :)


    Vielleicht magst du dir das mal anschauen und versuchen zu verstehen
    [expander][lua]


    ---- LOAD ----


    self.views = {};
    local i = 0;
    while true do
    local key = string.format("vehicle.views.view(%d)", i);
    local index = Utils.indexToObject(self.components, getXMLString(xmlfile, key.."#index"));
    if index == nil then break; end;
    local entry = {};
    entry.index = index;
    table.insert(self.views, entry);

    setVisibility(index, false);
    i = i+1;
    end;



    ----- UPDATE -----


    if InputBinding.hasEvent(InputBinding.viewplus) then
    local i = self.statusview+1;
    if i > table.getn(self.views) then
    i = 1;
    end;

    for j = 1,table.getn(self.views) do
    local v = self.views[j];
    setVisibility(v.index, j==i);
    end

    self.statusview = i;
    self.setview = i; -- ka wofür du das brauchst :D
    end;
    [/lua][/expander]


    EDIT: 2 Dumme ein Gedanke. Mein Code wäre dann wohl als Anlehnung an bassaddict´s Gedankenzügen zu sehen :D

  • Mal ne Frage die ich mir schon öfter gestellt hab... Gibts eigentlich nen bestimmten Grund dafür:


    [lua] local key = string.format("vehicle.views.view(%d)", i);
    local index = Utils.indexToObject(self.components, getXMLString(xmlfile, key.."#index"));
    [/lua]


    Es geht ja auch so:
    [lua]
    local index = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.views.view"..i.."#index"));
    [/lua]


    Passt hier gerade gut in den Thread rein..


    @Threadersteller, den Code von FIAT80-90DT nicht einfach so kopieren und dann wundern warum nix geht, in Zeile 7 ist ein ; zuviel drin ;)




    LG


    EDIT: Der Fehler in Zeile 7 scheint von der Forensoftware zu kommen, in meiner Zeile ist er auch obwohl ich ihn raus editiert hab..

  • Ich verstehe hier in dem Skript eine Sache nicht so ganz, und zwar das umschalten des setVisibility.


    Soweit klar, wenn man die taste drückt, so wird der self.statusview erhöht. Im ersten Skript des Threadersteller sieht man ja was dann passieren soll, immer nur der Index soll sichtbar sein, welcher den Count der self.statusview Variablen hat, alle anderen unsichtbar.


    Und da verstehe ich den Code aus FIAT80-90DT seinem Skript jetzt nicht so ganz wie das funktionen soll.
    [lua] local i = self.statusview+1;
    if i > table.getn(self.views) then
    i = 1;
    end;

    for j = 1,table.getn(self.views) do
    local v = self.views[j];
    setVisibility(v.index, j=i);
    end
    [/lua]


    Klar ist, der Count wird beim Tastendruck erhöht um +1, wenn der Count so groß ist wie die gesamten Bauteile die geschaltet werden können, wird der Count auf 1 gesetzt.


    Aber im zweiten Teil kann ich dann nicht mehr ganz folgen... dort wird jetzt wieder der table self.views durchgegangen, jeder einzelne Index. Wobei v. für den jeweiligen Index stehen soll, also die Position innerhalb des Tables. Auch soweit verstanden. Aber das umschalten von setVisibility das kapiere ich nicht.
    Da wird auf den Index zugegriffen, also das Bauteil identifiziert, soweit noch klar, aber das "j=i", das ist mein Problem. i ist der Count der Variablen self.statusview, j ist der Index im table self.views, aber wie kann ich damit alle anderen Teile unsichtbar schalten bzw nur das Bauteil, was den Count i hat sichbar bekommen?
    Es würde ja "übersetzt" heißen: setVisibility(v.index, 1=2);, wenn dort ein "j==i" stehen würde, dann könnte ich es verstehen, 1==2 ergibt ein false, bzw dann im 2. durchlauf ein 2==2 ein true, somit wäre das Bauteil sichtbar.


    Oder ist das jetzt nur ein Schreibfehler?

  • Ja, Schande auf mein Haupt. BlueBaby, du hast natürlich völlig recht, es muss i==j sein. Das passiert mir in Letzter Zeit öfter aufgrund mehrerer verschiedener Programmiersprachen :D.


    Wird geändert :)


    --------------------------------------


    modelleicher


    Prinzipiell kann man es auch so machen, nur stimmt dein Code nicht ganz - du hast die Klammern vergessen ;)
    In meinem Kontext würde es auch so funktionieren :
    [lua]local index = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.views.view("..i..")#index"));[/lua]

  • Ich habs vor meinem post so probiert :


    [expander][lua]
    self.stabilisationPipes = {};
    local i = 0;
    while true do
    --local key = string.format("vehicle.stabilisationPipes.pipe(%d)", i);
    --local index = Utils.indexToObject(self.components, getXMLString(xmlFile, key.."#index"));
    local index = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.stabilisationPipes.pipe("..i..")#index"));
    if index == nil then
    break
    end;

    local entry = {};
    entry.index = index;
    table.insert(self.stabilisationPipes, entry);
    i = i+1;
    end;
    [/lua][/expander]


    Ohne Klammern funktioniert es nicht.
    Weiß der Geier was LS da wieder raus macht :D

  • Ob mit oder ohne klammern hängt von den Einträgen in der XML ab. Hab mal 2 schöne Beispiele aus den Standardscripten rausgesucht. Anhand davon dürfte klar sein, wo der Unterschied liegt.
    Ohne klammern: (Steerable.lua)

    Code
    35 local cameraKey = string.format("vehicle.cameras.camera%d", i);


    Mit Klammern: (Vehicle.lua)

    Code
    476 local baseName = string.format("vehicle.attacherJoints.attacherJoint(%d)", i);
  • Jup, genau. Ohne Klammern explizite Nummerierung der Tags, mit Klammern implizite Nummerierung.
    Wenn die Reihenfolge eine Rolle spielt (wie bei den Kameras) sollte man explizite Nummerierung verwenden, ansonsten ist implizite Nummerierung die bessere Wahl (Prinzip: keine Annahmen treffen wenn nicht notwendig).

Jetzt mitmachen!

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