Leg-das-Rohr-Minispiel

  • #100, z sebastianWednesday, 10. May 2017, 09:18 hodinky 8 years ago
    ein break in Lua gibt es nur in Schleifen (for, while, repeat) nud kann (darf) nicht außerhalb von solchen genutzt werden.

    Du könntest deine Abfrage allerdings in eine Funktion packen und per "return" etwas zurückgeben, wenn eine bestimmte Sache passiert. Der rest unterhalb wird dann nicht mehr ausgeführt.






    Kapitán

    2346 Posts


  • #101, z MachtnixWednesday, 10. May 2017, 17:02 hodinky 8 years ago
    Ah, danke. Ich kenne Vergleichbares wie "break" auch in if-Konstruktionen. Immerhin hat es im Lua-Script einen Effekt bewirkt, wenn auch nicht den richtigen - was bedeutet, dass Lua den Befehl zwar nicht ignoriert, aber falsch interpretiert. Habe es aber jetzt auch anders hingekriegt.

    Im Moment bin ich auf der Zielgeraden... smile

    Kapitán

    1097 Posts

  • #102, z MachtnixThursday, 11. May 2017, 14:11 hodinky 8 years ago
    Hallo,

    diese Zufallsverteilung (siehe Bild) lässt sich offenbar nicht lösen (jedenfalls nicht innerhalb der vorgegebenen Einlaufzeit); also muss ich doch noch etwas am Zufallsgenerator feilen. Zur Zeit wird für jedes Feld der Generator extra angeworfen; es gibt also durchaus Fälle mit ungünstigen Puzzleteilen.

    Der Einlauf funktioniert wunderbar; allerdings muss ich noch die Spielrandabfrage einbauen (man kann von unten nach oben oder von links nach rechts "springen", das sind natürlich ungültige Spielzüge).

    Dennoch gibt es ein Problem, das ich vorher nie als ein solches betrachtet hatte: die Standbilder mit den gefüllten Rohrteilen blenden nicht ein.

    Ich habe im letzten Frame jeder Animation ein Script und eine Aktion (blanco). Egal, was ich auswähle: ich kann eine neue Animation nicht von dort aus starten, obwohl mir das unlogisch erscheint. Und wenn es gelingt, wird nicht das aktuelle Feld abgefragt (wo die Animation gerade läuft), sondern bereits das nächste. Da ist irgendwo noch ein Denkfehler drin. Da es sich aber lediglich um Standbilder handelt, könnte ich doch einfach die Standardanimation oder das Objektbild nach dem Ende der Animation ändern .

    Meine Frage also: kann ich das eingeladene Bild eines Objektes per Lua austauschen? Es gibt Funktionen mit "sprite", aber damit kann ich nicht viel anfangen. Andere Quellen verweisen auf "link". Kürzlich habe ich erst die "Befehlsliste" so richtig entdeckt - dort stehen ja viele Visionaire-Befehle drin (tolle Sache!), z.B. setValue(VSpriteSprite, {path=...}). Ist das der richtige Befehl zum Austauschen?

    Kapitán

    1097 Posts

  • #103, z sebastianThursday, 11. May 2017, 14:25 hodinky 8 years ago
    sofern ich weiß sind die Animationen und dessen Sprites was dessen aussehen angeht während der Laufzeit des Spiels nicht mehr änder/scriptbar.
    Es gibt zwar eine draw funktion in der du quasi aus dem Nichts ein Sprite in die Welt rendern kannst, aber ich schätze hier den Aufwand das ordentlich für dein Spiel umzusetzen etwas hoch ein (eigentlich kann ich da nicht viel zu sagen, da ich das bis jetzt noch tnicht genutzt habe).

    Das in deinen Animationen der letzte Frame meist keine Actionen abfeuert würde ich hier genauer untersuchen. Gegebenenfalls liegt es an zu kurzen pausen, die ggf. die Engine dann überspringt oder dass deine Bilder im allgemeinen "probleme" beim laden haben (werden ja normalerweise erst geladen, wenn das bild angezeigt werden soll) und dadurch Frames übersprungen werden. Alles natürlich reine Vermutungen...

    Dass es dann manchmal dann eine Animation für das nächste Feld startet liegt hier wohl irgendwo an deinem Script, da es anscheinend hier schon das nächste Feld als momentanes Objekt erwählt hat...

    Kapitán

    2346 Posts

  • #104, z MachtnixThursday, 11. May 2017, 15:10 hodinky 8 years ago
    sofern ich weiß sind die Animationen und dessen Sprites was dessen aussehen angeht während der Laufzeit des Spiels nicht mehr änder/scriptbar.
    Es gibt zwar eine draw funktion in der du quasi aus dem Nichts ein Sprite in die Welt rendern kannst, aber ich schätze hier den Aufwand das ordentlich für dein Spiel umzusetzen etwas hoch ein (eigentlich kann ich da nicht viel zu sagen, da ich das bis jetzt noch tnicht genutzt habe).
    Das befürchte ich auch, obwohl der Befehl so aussieht, als könne er unmittelbar was ändern. Ich dachte nur, da man ja z.B. Sound während des Spiels nachladen / ändern kann (natürlich müssen die Link-Funktionen vorher angelegt sein), dass das auch mit Bildern gehen könnte.
    Dass es dann manchmal dann eine Animation für das nächste Feld startet liegt hier wohl irgendwo an deinem Script, da es anscheinend hier schon das nächste Feld als momentanes Objekt erwählt hat...
    Da hast du vollkommen Recht, denn genau das tut das Script im Prinzip. Ich starte den Einlauf und anhand des Wertes des nächsten Feldes wird die dazu passende Animation gestartet. Wenn diese Animation dann läuft, ruft sie am Ende dasselbe Script erneut auf (rekursiv), um das nächste Feld zu checken. Dadurch habe ich aber kein "Loch", wo ich die Endanimation reinstopfen könnte - außer eben im letzten Frame der Animation. Da aber alle Animationen iterativ sind, weiß ich im Grunde nie, in welcher ich gerade bin. Ich weiß auch nie konkret, auf welchem Feld ich mich gerade befinde, denn es werden immer nur die Felder +1,-1, +5, -5 angezeigt. Müsste ich dann quasi immer zurückrechnen...

    Das wäre auch vollkommen in Ordnung, wenn ich auf andere Weise auf die aktuell gerade laufende Animation zugreifen bzw. sie abfragen könnte. Mit "ActiveAnimation" usw. hat das bislang noch nicht geklappt. Kann aber sein (ich bin ziemlich sicher), dass ich da was falsch anwende.

    Ich dachte naiv, dass ein Aufruf im letzten Frame ganz simpel funktionieren sollte. Es muss doch möglich sein, abzufragen, welche Animation gerade läuft und die dazugehörige zweite Ani zu starten. Dann brauche ich ja nur diesen aktuellen i-Wert in den Aufruf der Abschlussanimation (oder des Bildes) zu stecken.

    Schlimmstenfalls muss ich dann in JEDE Animation nochmal rein (12 x 25 Stück...) und das passende Rohrstück explizit anwählen. Da ich aber z.Z. die "Sparmethode" habe (sechs Standbilder in einer Ani), kann ich nur über Lua auf den Frame zugreifen, nicht im Editor.

    Das mit den Pausen ist ein guter Hinweis, danke. Kann ich ja mal austesten. Ich habe sowieso oft den Eindruck, dass die Abarbeitung von Funktionen bzw. Schleifen nicht immer gleich erfolgt, je nachdem, wie voll der Grafik-Cache oder wie lahm der Rechner ist... wink

    edit
    AnimationActive

    t_bool

    True if the animation was started. This value can be false if the animation was preloaded but not yet started. If set to false and the animation is not preloaded then it is deleted. If it is preloaded and set to false then the animation is hidden but kept alive. If set to true when the animation was not yet started (only possible if it was preloaded) then the animation is started.
    Das habe ich mir jetzt 5 Mal durchgelesen, aber immer noch nicht verstanden. wink

    Aber True if the animation was started ist wohl genau das, was ich brauche. Wenn Ani xy is true, starte Ani z... Muss ich nur noch in eine Code-Form bringen...




    Kapitán

    1097 Posts

  • #105, z MachtnixThursday, 11. May 2017, 22:06 hodinky 8 years ago
    Na, geht doch...

    Die Lösung war so simpel wie einleuchtend. Da am Ende jeder Animation das Script aufgerufen wird, wie es im nächsten Feld weitergeht, durfte die Standbildanimation des vollen Rohres nicht nach der Einlaufanimation kommen. Sondern davor. Also einfach oben an den Anfang geschrieben - und nun klappt es mit dem Einzelframeaufruf.

    Also naja- so richtig verstanden habe ich es nicht, weil es meinem gesunden Menschenverstand widerspricht. Aber Hauptsache, es funzt.
    Aktuell =getObject("Scenes[Spielfeld].SceneObjects[Feld"..Startfeld.."].ObjectValues[Typ"..Startfeld.."]").Int 
    
    startAnimation("Scenes[Spielfeld].SceneObjects[Feld"..Startfeld.."].ObjectAnimations[Voll"..Startfeld.."]")
    
    setAnimFrames("Voll"..Startfeld.."",Aktuell,Aktuell) 

    Ich muss das Script dringend dokumentieren - nach drei Monaten weiß ich nicht mehr, was ich gemacht habe und warum... smile

    Kapitán

    1097 Posts

  • #106, z MachtnixFriday, 19. May 2017, 18:23 hodinky 7 years ago
    Kurze Zwischenbilanz: das Austauschen und Auffüllen der Rohre geschieht jetzt problemlos (dass eine Rohrfüllung stoppt, weil ein unpassendes Teil vor ihm liegt, hat noch einige Kopfschmerzen bereitet... Bislang wurde immer das nächste Rohrstück mitgefüllt, egal, ob passend oder nicht - was ja dämlich ist...).

    Allerdings bastele ich bereits einige Tage an der Feldrandabfrage. Ich glaube, meine spezielle Lösung für das Befüllen erschwert mir zugleich auch die Randabfrage, weil immer erst das Rohr einläuft, bevor es abgefragt wird. Manno... Ich habe mir wohl selbst eine Grube gegraben. Das Problem tritt nur bei dem "Links-Rechts"-Problem auf, weil ja Feld 5 ganz rechts auf Feld 6 ganz links weiterläuft. Oben und unten scheinen keine Probleme zu bereiten, obwohl ich da gar nichts gemacht habe. Wahrscheinlich findet das Script einfach die Feldelemente nicht, also hört es auf zu arbeiten. Hätte ich doch bloß die Schachvariante mit einem größeren Spielfeld genommen, dann bräuchte ich nur die unmöglichen Spielfeldnummern abzufragen...

    Ein Reset war auch geplant, aber auch dort muss ich die ganze Konstruktion ja in eine Bedingung einbetten, ob Reset gedrückt wird oder nicht. Davon abhängig müssen alle Werte wieder auf Null (auf Anfang) gesetzt werden. Gestaltet sich ebenfalls schwieriger als gedacht...

    Kapitán

    1097 Posts

  • #107, z MachtnixMonday, 29. May 2017, 17:52 hodinky 7 years ago
    Hallo,

    wer mag, kann schon mal beta-testen, ob das Durchlaufen der grünen Flüssigkeit immer ordnungsgemäß stattfindet.

    Ich habe nach dreißig Durchläufen keinen Fehler mehr gefunden.

    Der erste Mausklick auf ein Feld gibt das darunter verborgene Rohr preis. Der zweite Klick darauf vertauscht das Feldelement mit dem Element auf dem grünen Feld am Rande rechts.

    Stößt das offene Rohr an den rechten Rand, muss die Flüssigkeit stoppen und darf nicht auf der nächsten Zeile im ersten Feld weiterlaufen. Denn z.B. das Feld Nr. 5 ganz rechts würde fälschlich auf das Feld Nr. 6 lnks weiterführen.

    Dasselbe gilt für den linken Rand. Hier natürlich rückwärts.

    Oben und unten scheinen bislang immer zu funktionieren.

    Damit man nicht in Zeitdruck gerät und in Ruhe die verrücktesten Kombinationen legen kann, ist das automatische Einlaufen deaktiviert. Man muss auf das grüne Feld rechts oben klicken, damit die Sequenz beginnt.

    "Reset" ist z.Z. deaktiviert. Noch muss man für ein neues Spiel das Spiel verlassen (z.B. mit "Esc").

    Geplant ist ein Startmenü mir kurzer Erläuterung und ein Einstellen des Schwierigkeitsgrades in drei Stufen. Für den Anfänger startet der Einlauf später, für den Profi früher. Die Einlaufgeschwindigkeit bleibt dabei gleich. Da die Animationen eine bestimmte Geschwindigkeit haben, ist ein globales Ändern des Tempos für mich z.Z. nicht möglich.

    Wenn der Zufluss zum Hahn geschafft ist, soll später eine Glückwunschmeldung aufspringen. Oder irgendwas anderes. Vorschläge sind herzlich willkommen.

    Da ich eine Animation mit auslaufender Flüssigkeit noch nicht korrekt hinbekommen habe, werde ich wohl anstelle des Hahns vielleicht einen geschlossenen Tank hinsetzen.

    Möglich wäre auch eine Score-Tabelle, in der die benötigte Zeit eingetragen wird.

    Das "Drumherum" kommt also später smile

    Ab und zu ist das Rätsel nicht lösbar, weil nicht alle benötigten Rohrstücke aufgedeckt werden können. Manchmal gibt es zuviel von der gleichen Sorte. Das passiert in ca. 1 von 20 Fällen und sollte gefixt werden.

    Gruß
    Machtnix

    Vielen Dank!

    Zip-Datei (Windows):

    http://filehorst.de/d/bGwFJzxI

    Kapitán

    1097 Posts

  • #108, z MachtnixThursday, 01. June 2017, 13:17 hodinky 7 years ago
    Es gab noch einen „Käfer“, die korrigierte Version ist aber noch nicht hochgeladen. 

    Mein Problem ist nun, dass ich für „Reset“ auf einen Wert im Editor zurückgreifen muss. Ändere ich diesen Wert in einem Script, reagiert Vis aber nicht darauf. Offenbar wird der Wert erst NACH dem kompletten Abarbeiten geändert. Hilft es, wenn ich zwei Scripte mache?

    Kapitán

    1097 Posts

  • #109, z MachtnixThursday, 01. June 2017, 16:21 hodinky 7 years ago
    Rohrspiel

    I try it in English:

    My problem is now that for "Reset" I have a value in the editor. If I change this value in a script, Vis does not respond. Apparently the value is changed only after the complete script processing. Does it help if I make two scripts? Setting the value in the first, then call the other script in the editor actions and execute?

    Kapitán

    1097 Posts

  • #110, z MachtnixSaturday, 03. June 2017, 20:19 hodinky 7 years ago
    Reset habe ich verworfen. Ich bekomme Lua-Script und Editor-Aktionen (bzw. Werte und Bedingungen) nicht zusammen. Es sind irgendwie zwei völlig unterschiedliche und unabhängige Welten, die zwar jeweils für sich alleine, aber kaum gut miteinander arbeiten...

    Rohrspiel

    Kapitán

    1097 Posts