Leg-das-Rohr-Minispiel

  • #80, z MachtnixMonday, 01. May 2017, 22:07 hodinky 8 years ago
    Immerhin habe ich jetzt für die Abfrage, welcher Rohrtyp im Feld liegt und welche Animation jeweils gestartet werden muss, ein Mini-Script hingekriegt... wink
    Spare ich mir 300 händische Einträge (frei nach Homer Simpson: Juhuuh!!!)

    Diese Abfrage brauche ich ja demnächst auch für die Wassereinlaufabfrage.

    Kapitán

    1097 Posts


  • #81, z MachtnixTuesday, 02. May 2017, 16:36 hodinky 8 years ago
    Um Animationen zu "sparen", wäre natürlich der direkte Frame-Zugriff sinnvoll.

    Als Test habe ich mir für Linksklick das Feld7 ausgesucht. Die Animation Ani7 enthält den Wasser-Einlauf von links und von rechts hintereinander. Ich muss also für eine Seite die Frames 1-12, für die zweite die Frames 13-24 abspielen. Ich würde erwarten, dass dann die Animation zwar verschwindet (weil gestoppt), - das kann man korrigieren. Aber die Ani läuft IMMER komplett durch, egal, welche Funktionen ich probiere. Die Zeile startAnimation funktioniert also. Was ist dennoch falsch?

    --Definitionsscript
    
    global function setAnimFrames(ani, n1, n2)
    
        getObject("ActiveAnimations["..ani.."]"):setValue(VAnimationFirstFrame, n1)
    
        getObject("ActiveAnimations["..ani.."]"):setValue(VAnimationLastFrame, n2)
    
    end
    
    
    
    
    
    
    --Aufruf in Aktion "Linksklick"
    
    startAnimation("Scenes[Spielfeld].SceneObjects[Feld7].ObjectAnimations[Ani7]")
    
    setAnimFrames("Ani7",1,12)

    Kapitán

    1097 Posts

  • #82, z sebastianTuesday, 02. May 2017, 16:48 hodinky 8 years ago
    warum ist setAnimFrames global? Wenn es in einem Definitionsscript steht, ist die Funktion sowieso verfügbar. Du speicherst ja auch nichts, sondern führst speziell für die in den Übergabeparametern angegebenen Daten etwas aus. Das global kann also weg smile 

    Zudem müssen die Animationen infinite laufen, damit sie sich wiederholen. Gegebenenfalls sollte in Frame 1,13,etc (also jedem ersten frame Teil einer variante) eine action haben, die ggf. die Ausrichtung abfragt und sich dann dadurch neu einstellt. 

    Edit:
    zudem setzt das FirstFrame setzen nicht unbedingt die Animationen auch sofort auf diesen Startframe, da diese ggfm noch mitten drin ist. Erst wenn es den LastFrame erreicht springt die Animationelnauf den FirstFrame. Ein StopAnimation vor dem StartAnimation könnte das beheben... 

    Kapitán

    2346 Posts

  • #83, z MachtnixTuesday, 02. May 2017, 17:11 hodinky 8 years ago
    Stimmt! Das "global" war Schuld! Jetzt laufen Frame 1-12 ab und die Animation verschwindet danach, OHNE dass 13-24 abgespielt werden (wie erwartet).  Quellcode habe ich irgendwann mal aus irgendeinem Wiki- oder Forumseintrag kopiert, ist schon ein Jahr her...

    Super-Tipp. Hätte nie geglaubt, dass das stören könnte.

    Die Animation selbst soll ja nicht unendlich laufen, denn der Wassereinlauf geschieht ja nur einmal. Ich muss höchstens am letzten Frame eine Aktion einbauen, die den letzten Frame (wo das Rohr voll ist) unendlich wiederholt ODER auf eine unendliche Standbild-Animation mit vollem Rohr überwechseln. Dummerweise erfordert das alles mehr Tipp-Arbeit als Einzelanimationen, denn ich muss in jede der 25 Animationen rein, den Frame 12 und 24 auswählen, dort eine individuelle Aktion setzen, - denn beim Kopieren von Animationen wird die Nummerierung leider nicht angepasst.

    Ja, ich weiß, mit Lua ginge das alles viel besser... aber ich bin ja schon froh, wenn überhaupt irgendwas startet... wink

    Kapitán

    1097 Posts

  • #84, z MachtnixTuesday, 02. May 2017, 17:30 hodinky 8 years ago
    Edit:
    zudem setzt das FirstFrame setzen nicht unbedingt die Animationen auch sofort auf diesen Startframe, da diese ggfm noch mitten drin ist. Erst wenn es den LastFrame erreicht springt die Animationelnauf den FirstFrame. Ein StopAnimation vor dem StartAnimation könnte das beheben... 
    Mmh, beim Mausklick passiert das nicht (auch wenn ich die Animation auf unendlich stelle). Sie startet immer brav am Anfang, läuft durch und verschwindet, egal wie lange ich warte oder was ich sonst so mache. Vielleicht geschieht das erst, wenn ich mehrere aktive Animationen habe.

    Mit dem Begriff der "aktiven" Animation komme ich sowieso nicht gut klar, denn es sind ja immer mehrere Animationen zur selben Zeit aktiv. Alle Rohrdarstellungen sind ja z.B.  unendliche Animationen, die unentwegt abspielen (also sind bis zu 25 Animationen gleichzeitig aktiv, oder?), und wenn der Wassereinlauf startet, sind ja mindestens zwei Anis gleichzeitig aktiv (dort, wo der Spieler klickt und dort, wo bereits Wasser einläuft...).

    Kapitán

    1097 Posts

  • #85, z sebastianTuesday, 02. May 2017, 17:40 hodinky 8 years ago
    ja, das ist korrekt. Alle momentan laufenden Animationen sind per "ActiveAnimations[name]" ansprechbar. 

    Kapitán

    2346 Posts

  • #86, z MachtnixTuesday, 02. May 2017, 17:58 hodinky 8 years ago
    Um mir die Schreibarbeit zu ersparen, müsste ich nun ein Script schreiben, das jeweils am Ende der Animationssequenz aufgerufen wird (das ließe sich stumpf mitkopieren, weil es immer gleich heißt), müsste dortdrin die zugehörige Animation abfragen (also in welcher bin ich gerade), müsste davon den entsprechenden Frame heraupicken und dort mit setAnimFrames den Endframe auf unendlich stellen (z.B. Loop von 12 zu 12).

    Aber dann ist es fast müheloser, jede Animation einzeln einzutragen. Dazu brauche ich nämlich nur in die Animationsliste gehen und die jeweiligen Indices auszutauschen. Ist zwar stumpfsinnig, aber ich brauche wenigstens in kein Untermenü reinklicken. Die Lua-Variante kommt mir noch zu kompliziert vor.

    Der Speicherverbrauch pro geladener Animation ist doch so oder so (fast) derselbe, oder? Ob ich nun 12x12 Frames in jeweils einer Animation aufgereiht habe und die Frames herauspicke, oder 12 Animationen mit 12 Frames...?

    Kapitán

    1097 Posts

  • #87, z MachtnixWednesday, 03. May 2017, 19:40 hodinky 8 years ago
    Puh, für die Wasserabfrage habe ich noch keine sinnvolle Idee. Am Anfang des Spiels habe ich nur zwei Möglichkeiten, weil das Startfeld links oben in der Ecke liegt. Ein gebogenes Rohr nach oben stößt auf den Rand, es bleiben nur ein waagerechtes oder eines nach unten.

    Ich wollte also abfragen, ob Typ 2 (waagrechtes Rohr) oder Typ 6 (gebogenes Rohr links unten) auf Feld1 (=n) liegen. Danach frage ich ab, ob Feld n+1 ein gerades Rohr oder die beiden anderen gebogenen Rohrmöglichkeiten aufweist.
    Wenn Feld 1 ein gebogenes Rohr nach unten hat (oder ein senkrechtes oder anderes gebogenes), muss ich Feld n+5 abfragen.

    Das klappt sogar.

    Aber die Abfragen werden potentiell natürlich immer mehr. Ich suche also noch nach einem sinnvollen Algorithmus. Sonst habe ich dutzende von if-Abfragen. Dieses Problem wurde ja in 1000 Spielen bereits gelöst (und wenn es auch nur etwas ähnliches wie Memory oder Dame ist). In einem PDF ("MakingGames") von Al Sweigart wurden explizite Lösungsansätze mit Python ausführlich beschrieben - sowas hätte ich gern mit Lua...

    Kapitán

    1097 Posts

  • #88, z sebastianWednesday, 03. May 2017, 20:39 hodinky 8 years ago
    wenn du für jedes Feld einen Wert hast für desses Wasserstand, lässt sich das theoretisch mit einer Funktion lösen.
    Falls der Wasserstand in 6 Teile unterteilt ist
    hat es einen wert 1, ist das wasser noch nicht drin, aber vorgemerkt reinzufließen
    hat es einen wert 6, ist das rohr voll

    nach dem Motto

    für jedes Feld n (1-25) dessen wasserstand 1-6 ist
       wasserstand für feld n = wasserstand+1
       wenn wasserstand von n = 6, dann 
          wenn typ von feld n = 1 und wenn typ von feld n+5 = 2, dann (nach unten offen)
              setze für feld n+1 den wert wasserstand +5
          sonst wenn typ von feld n = 2 und wenn typ von feld n-5 = 1, dann (nach oben offen)
              setze für feld n+1 den wert wasserstand -5
          sonst wenn typ von feld n = 3 und wenn typ von feld n-1 = 4, dann (nach links offen)
              setze für feld n+1 den wert wasserstand -1
          sonst wenn typ von feld n = 4 und wenn typ von feld n+1 = 3, dann (nach rechts offen)
              setze für feld n+1 den wert wasserstand +1
          ende wenn
      ende wenn

    in der nächsten Runde hat ja das "nächste Feld" einen Wert von 1 und somit bekommt es +1 Wasserstand, bis es wieder 6 erreicht hat um auf den nächsten überzuspingen.

    Theoretisch erstmal. Gibt bestimmt noch andere (bessere methoden) razz

    Kapitán

    2346 Posts

  • #89, z MachtnixWednesday, 03. May 2017, 21:00 hodinky 8 years ago
    Danke für deine schnelle Rückmeldung!

    Stufen für den Wassereinlauf habe ich nicht vorgesehen. Nach einer Pause von 30 Sekunden startet links der Wassereinlauf. Erreicht das Wasser das nächste Rohrfeld, startet dort eine Einlaufanimation, wenn die Verbindung existiert, solange bis das letzte Feld 25 erreicht ist. Existiert keine, ist das Spiel beendet. Ich frage also irgendeinen, noch nicht näher festgelegten Wert ab, ob das Rohr verbunden ist. Wenn ja, kann für das angeschlossene Feld die Einlauf-Animation starten.

    Was nützt mir ein Wasserstand von z.B. 2 (die "Füllmenge" an sich gibt es ja nicht)? Das wären dann vielleicht irgendwelche halbvollen Frames innerhalb der jeweiligen Fließ-Animation. Deshalb ist mir momentan nicht klar, worin der Vorteil besteht, 6 Stufen zu benutzen.

    Die Abfrage, ob die Rohre verbunden sind, müsste ich in kurzen Abständen wiederholen, damit immer der aktuelle Zustand abgerufen wird.

    Das mit dem Vormerken ist jedoch sinnvoll, denn es existieren bis zum Einlaufen bereits verbundene Rohre. Ich habe die Werte "verbunden, aber noch leer (klicken geht noch), und Wasser könnte fließen", und "Wasser läuft bereits ein (klicken geht nicht mehr)" Vielleicht habe ich dich aber auch falsch verstanden.

    Kapitán

    1097 Posts

  • #90, z sebastianWednesday, 03. May 2017, 21:33 hodinky 8 years ago
    den füllstand als wert hätte ich halt genutzt um quasi den stand der dinge pro feld abzufragen, damit nicht jedes mal ein neues Feld gechekct wird, sondern nur alle X schritte je nach wasserstand halt. 6 war jetzt ein reines Beispiel smile
    Meine Lösung wäre jetzt so gedacht, dass sie universell für alle möglichen start oder endpunkte möglich wäre.

    Kapitán

    2346 Posts