Leg-das-Rohr-Minispiel

  • #60, by MachtnixTuesday, 25. April 2017, 13:37 7 years ago
    Heute morgen beim Frühstück hatte ich eine Ahnung von einer Idee: ich muss nicht die Einzelfelder untersuchen, sondern die Verbindungen. Es gibt 40 gültige Verbindungen. Ich muss klären, ob Osten mit Westen des nächsten Feldes, und ob Süden und Norden zusammenpassen. Dazu bekommt jedes Feld eine Tabelle: Tab1={0,1,0,1} für die Boolschen Werte der vier Eingänge, die ich miteinander vergleiche (über Kreuz). 

    Thread Captain

    1097 Posts


  • #61, by MachtnixThursday, 27. April 2017, 17:18 7 years ago
    Anstelle der Tabelle nehme ich doch lieber 4 Werte für die vier Richtungen, die ich abfrage. Ich bin noch lange nicht soweit, mit Tabellen sinnvoll umzugehen... wink

    Für die erste Zeile eine For-Schleife, die erst startet, wenn der 1. Feldtyp zum Wassereinlauf passt (es gibt nur drei Möglichkeiten):

    Beim Linksklick:
    Hole aktuelles Objekt
    Weise dem aktuellen Objekt seinen Feldnamen zu
    setze den Wert für das Feld
    setze die vier Werte für Nord, Süd, Ost, West


    Für n = 1 bis 4
        Hole Wert n
        Hole Wert n+1
             Wenn Wasser = falsch UND Deckel = auf
                 Wenn Ost_n = 1 UND West_n+1 = 1 dann
                     Setze Verbindung auf geschlossen
                Ende
            Ende
    Ende

    Frei Schnauze in Kladde. wink

    Ich habe noch Probleme, n zuzuordnen. Ich bekomme ja mit game.CurrentObject zwar den Namen des Feldes, aber keinen Wert. Ich muss also Sebastians Methode benutzen, um dem aktuellen Objekt seinen Feldnamen zuzuweisen und diesem Feld mit Namen "Feld1" den Wert 1 geben. Den muss ich dann mit n abfragen. Ebenso mit Feld 2-25.

    Theoretisch könnte ich auch 40 Bedingungen hintereinander auflisten... wink

    Der Vorteil ist, dass ich durch die vier Abfragen die Spielfeldränder automatisch ausklammere. Für die zweite Zeile starte ich dann eine Schleife von 6 bis 9. Wenn ich darauf achte, dass ich bei 6 nicht nach links abfrage (denn dort befindet sich die 5 ja nicht, sondern das Spielfeld ist zuende), habe ich vielleicht sogar auch die Fließrichtung für später. Aber noch keine Ahnung, wie.

    Für die senkrechten Spalten nehme ich dann n+5. Weil ich bei jedem Klick alle 40 Möglichkeiten von links nach rechts, von oben nach unten durchgehe, brauche ich n-1 und n-5 nicht, - damit entfällt die ätzende Spielfeldabfrage.

    Ich muss das nun noch IRGENDWIE in Lua umsetzen...wink Man sieht deutlich, dass ich mich schwertue, das, was ich erreichen will, in einen logischen Zusammenhang zu bringen... Was ich wann wie abfragen muss, bekomme ich durch Versuch und Irrtum raus...

    Thread Captain

    1097 Posts

  • #62, by MachtnixThursday, 27. April 2017, 21:07 7 years ago
    Ich habe für die ersten drei Felder (Feld1, Feld2, Feld3) drei Werte angelegt: Feldname1=1, Feldname2=2, Feldname3=3. Nun möchte ich diese 3 Werte abfragen:

    Feldtyp = game.CurrentObject:getName()
    
    print(Feldtyp) -- das funktioniert
    
    
    
    for i=1,3,1 do
    
       xy=getObject("Objects[Feld"..i.."]"):getInt("[Feldname"..i.."]")
    
       print xy
    
    end -- das funktioniert nicht


    Trotz Sebastians toller Erklärumg ist das mit den Anführungsstrichen und Klammern noch mysteriös...

    Thread Captain

    1097 Posts

  • #63, by MachtnixFriday, 28. April 2017, 16:21 7 years ago
    So funktioniert es:
    for i=1,3,1 do
        xy=getObject("Scenes[Spielfeld].SceneObjects[Feld"..i.."].ObjectValues[Feldname"..i.."]")
    
    print (xy)
    
    end

    Anmerkung: natürlich sind das vier Zeilen, aber der Editor will das nicht darstellen...

    Vis gibt mir tatsächlich drei verschiedene Ergebnisse aus. Yeah!
    Allerdings habe ich jetzt wieder die zwei ID-Zahlen in Klammern dahinter. Wie bekomme ich die weg? Was muss ich dahinter noch anhängen?

    Thread Captain

    1097 Posts

  • #64, by sebastianFriday, 28. April 2017, 16:33 7 years ago
    Du machst dich wink 

    Du gibst nur die Objekte aus, nict deren Werte. 

    Füge ein
    .Int hinter die letzte eckige Klammer an um dessen Wert zu kriegen. 


    Thread Captain

    2346 Posts

  • #65, by MachtnixFriday, 28. April 2017, 17:53 7 years ago
    Danke.

    Mit .Int klappt das jetzt noch nicht, aber das kriege ich schon raus. Vielleicht ist es ja auch .Float, oder ich habe was übersehen...

    Edit:
    .Int muss hinter die runde Klammer ganz am Schluss.:

    xy=getObject("Scenes[Spielfeld].SceneObjects[Feld"..i.."].ObjectValues[Feldname"..i.."]").Int



    Thread Captain

    1097 Posts

  • #66, by sebastianFriday, 28. April 2017, 18:37 7 years ago
    oh ja, sorry. hab das getObject komplett überlesen ^^

    Float kann es zudem nicht sein, das Value Objekte laut DataStructure dieses Feld gar nicht besitzen. 

    Thread Captain

    2346 Posts

  • #67, by MachtnixFriday, 28. April 2017, 19:13 7 years ago
    Ich bleibe wohl öfter bei der alten Schreibweise... wink Ist zwar länger, aber dann sehe ich auch besser die Postanschrift der Objekte. Außerdem weiß ich nie genau, ob ich Variablen irgendwann doppelt habe.

    "Float" habe ich nur geraten, weil ich nicht wusste, ob der Interpreter automatisch "Integer" setzt, wenn ich Wert=1 schreibe. Vielleicht ist es ja für ihn eine 1,000000000000000000000000...

    Selbstverständlich ist das nämlich nicht (ich bin noch urzeitlich Pascal-verseucht...). Das Lua-Prinzip, nach Lust und Laune Variablen zu belegen, ist mir ziemlich fremd. Deswegen bekommen meine Variablen immer noch Kürzel, die zeigen, was für ein Typ die sind. Gewohnheiten kriegt man schlecht weg - Disziplin kann aber auch nicht schaden.

    Thread Captain

    1097 Posts

  • #68, by MachtnixSunday, 30. April 2017, 15:17 7 years ago
    Wie rufe ich aus einem Lua-Script ein anderes Script auf?

    Und: gelten dann die Variablenwerte global? Habe ich in einem Script z.B. „Maus1“ auf 1 gesetzt: kann ich das überall abfragen? Um den Wert aber ins Spiel zu bringen, muss ich setValue o.ä. Verwenden, richtig?

    Thread Captain

    1097 Posts

  • #69, by sebastianSunday, 30. April 2017, 16:00 7 years ago
    Wie rufe ich aus einem Lua-Script ein anderes Script auf?

    Und: gelten dann die Variablenwerte global? Habe ich in einem Script z.B. „Maus1“ auf 1 gesetzt: kann ich das überall abfragen? Um den Wert aber ins Spiel zu bringen, muss ich setValue o.ä. Verwenden, richtig?
    du kannst keine scripte aufrufen, sondern nur funktionen:


    function meine_funktion()
        ...do stuff...
    end

    und irgendwo, wo du die Funktion nutzen willst machst du dann per execute script Action part oder innerhalb eines anderen Skripts

    meine function()


    Variablen in Lua sind entweder local für die eine function gültig (wenn innerhalb einer Funktion definiert,
    nur local für ein ganzes Skript gültig (am besten in einem definition script oben außerhalb der darin geschriebenen funktionen)
    oder aber global gültig, wenn du "global" davor schreibst.


    Alternativ kannst du natürlich auch lokale Werte in VS Values speichern und dann woanders wieder ran holen...

    Thread Captain

    2346 Posts

  • #70, by MachtnixSunday, 30. April 2017, 16:39 7 years ago
    Danke. Ich war davon ausgegangen, dass eine Variable automatisch global ist, wenn ich nichts davor schreibe. Also besser global davor schreiben...

    Ich hatte einfach das Problem, dass ich bestimmte Variablen global brauche, damit sie überall abgefragt werden können. z.B. der Rohrtyp, der auf dem Stapel liegt. 

    Thread Captain

    1097 Posts