Geschwindigkeit exponentiell erhöhen bzw. senken basierend auf Subimage

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Geschwindigkeit exponentiell erhöhen bzw. senken basierend auf Subimage

    Hallo da!

    In meinem Spiel bewegt sich ein Vogel von rechts nach links. Nun soll besagter Vogel an Geschwindigkeit zunehmen, sind seine Flügel "eingefahren".
    Soweit funktioniert das mit folgendem Code prima.

    GML-Quellcode

    1. if (image_index > 10 && image_index <80)
    2. {
    3. x -= 6;
    4. }
    5. else
    6. {
    7. x -= 5;
    8. }

    Nur sieht das ziemlich unnatürlich aus, da die Geschwindigkeit abrupt ab bzw. Zunimmt.
    Wie könnte man das eleganter lösen?
    Ich sehe schon, das Problem liegt bereits beim If Statement.

    Vielleicht hat jemand eine Lösung?
  • Wenn ich dich richtig verstehe hast du eine Animation in welcher der Vogel zwischendurch mit den flügeln schlägt.
    Statt direkt die Koordinate zu verschieben könntest du hspeed beim Flügelschlag auf einen hohen wert setzen und ansonsten langsam reduzieren.
  • Es fehlt deutlich Kontext für eine optimale Lösung aber das Problem beginnt für mich schon damit, dass Du die Geschwindigkeit auf der Animation basierst und nicht umgekehrt. Dass Du anscheinend über achtzig Images in der Animation hast ist auch ziemlich seltsam. Und die wichtigste Frage ist für mich wie der Spieler diese Flügel kontrolliert (davon ausgehend, dass der Vogel das Spielerobjekt ist).

    Im Optimalfall würdest Du die Images (wahrscheinlich, es fehlen Infos) so organisieren, dass image_index 0 der eine Extremzustand ist (Flügel oben) und dein letztes image der andere (Flügel unten). Dann kannst Du mit simpler Multiplikation das image_index an die Geschwindigkeit anpassen und hast komplette Freiheit beim Regeln von Geschwindigkeit und Beschleunigung.

    Nicht gestestet, aber in etwa so:

    GML-Quellcode

    1. image_index = floor(BonusSpeed / MaxBonusSpeed * ImageCount);


    Bei so einer Lösung würde sich der image_index schön an die BonusSpeed anpassen. BonusSpeed würdest Du dann auf die Basisgschwindigkeit draufzählen:

    GML-Quellcode

    1. hspeed = -BaseSpeed -BonusSpeed;


    Müsstest im Create Event halt noch sinnvolle Werte setzen für die Variablen:
    BaseSpeed: ist die Geschwindigkeit bei offenen Flügeln, bei deinem Beispiel müsste das 5 sein.
    MaxBonusSpeed: maximaler Geschwindigkeitsbonus für offene Flügel, müsste in deinem Beispiel 1 sein.
    BonusSpeed: die aktuelle Bonusgeschwindigkeit vom Flügelschlag, die auch das image_index anpasst.

    Jetzt musst Du eben noch die BonusSpeed schön sanft regeln. Ich habe halt keine Ahnung ob der Spieler direkte Kontrolle über den Flügelschlag hat oder das einfach zyklisch ablaufen soll etc., musst Du selber was schönes ausdenken oder mehr Infos bieten wie der Vogel sich verhält.
  • Ah sorry nicht mitgedacht. Die Situation ist folgende. Der Vogel, hier das Objekt, ist lediglich ein aufwendiges Detail, welches im Spiel nicht steuerbar sein wird.

    Die Animation wurde in Adobe AE erstellt und dann als .png gerendert. Daher die hohe Anzahl der Bilder.

    hspeed wird hier aber auch nichts bringen, da die Variable durch die Abfrage (siehe Oben) direkt nach entsprechendem Frame abrupt verändert wird. (Oder ich bekomme da gerade was nicht mit. Ist schon spät, vielleicht wird es mir morgen klar)
  • Der Code ist dazu gedacht, deinen alten zu ersetzen.
    Vielleicht sähe es auch etwas natürlicher aus, wenn der Vogel immer etwas nach oben beim Flügelschlag geht und sich dabei auch nach oben bzw. nach unten dreht.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Also, die Idee ist, dass Du dann BonusSpeed wie gesagt nach belieben steuern kannst und der Flügelschlag sich automatisch an die Speed anpasst. Du musst Dich aber eben noch darum kümmern, dass BonusSpeed sich sinnvoll entwickelt. Du könntest es etwa einer Sinuskurve folgen lassen, was nicht gerade realistisch aber sehr weich wäre.