Frage zu Salto in Physics

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

  • Frage zu Salto in Physics

    Hallo,

    ich arbeite mich momentan etwas durch die Physics bei Game Maker durch und möchte nun meinen obj_player bei drücken der Sprungtaste ein Salto in Richtung obj_ball machen lassen, der sich in der Luft bewegt. Dazu habe ich folgende Fragen:

    1. Animiere ich den Sprite (spr_player) so, dass der komplette Salto sich im Sprite abspielt oder lasse ich die Füße immer nach unten gucken und lasse nur obj_player rotieren?
    2. Kann ich herausfinden, an welcher Stelle sich obj_ball in 10 Steps befindet, damit obj_player den Ball mit seinem Salto trifft?

    Gruß, Adnan
  • 1. nein das mit rotate ist schon eine gute idee allerdings ist er dann steif wie ein brett, während der player per animation in die Hocke gehen könnte, ein mix aus beidem wäre passend sprich bei druck der sprungtaste geht er in die knie position und per rotate rotiert er wenn er unten wieder ankommt den sprite wieder auf normal wechseln

    2. ja das sollte doch einfach per xy Position anfragen

    if (object.x) und mit den ball Koordinaten abgleichen um den Hit zu bekommen
  • Hi fuexline,

    danke für die schnelle Antwort.

    zu 1.: Sorry, ich hatte mich ungünstig ausgedrückt. Natürlich würde ich den Sprite im zweiten Fall auch animieren und in die Hocke gehen lassen, aber dabei darauf achten, dass die Füße immer schon auf der Bodenlinie bleiben. Das ist gut, dann werde ich die Variante verwenden. Danke schon mal dafür.

    zu 2.: Der Ball bewegt sich eventuell recht schnell und ich möchte die Animation von obj_player an obj_ball anpassen, es soll also mehrere verschiedene Animationen geben. Dafür wäre es klasse, wenn ich einfach eine Funktion schreibe, die bei Release der Leertaste ausrechnet, wann der Ball in den nächsten 5-25 Steps die beste Position hat, um obj_player mit der korrekten Animation und Animationsgeschwindigkeit zum Ball zu bewegen. Aktuell denke ich an eine komplizierte Formel, aber ich bin halt auch eher der Programmierer und Game Maker bietet vielleicht da tolle Hiflsmittel an?

    Gruß, Adnan
  • Na ja mir ist da ehrlich gesagt nix bekannt denn das wäre alles totaly random, man könnte aber permanent die ball position abfragen und 4 pixel vor dem helden wird ja nix mehr groß passieren wenn der ball dann x Pixel höher als der held ist wird er hoch gehen wenn er auf x0 höhe liegt geht der held runter

    da wäre es dann egal was passieren würde
  • Ja, prinzipiell hast du recht, aber die Animation wird ja auch Zeit in Anspruch nehmen. Das heißt, wenn sich der Ball rechts über dem Kopf befindet, wenn die Spieler Animation startet, kann es sein, dass zum Zeitpunkt der Kollision der Ball unten links in der Ecke ist. Wir reden ja von fast einer halben Sekunde und der Ball bewegt sich eventuell recht schnell. Da legt er sicher n paar Meter im Raum hin.

    Ich werde mal schauen, ob ich das mit einer einfachen Formel errechnen kann. Bin mir nicht sicher, ob ich mit direction und so arbeiten kann, da der Ball sich permanent dreht. Aber mit x, y, xprevious und yprevious könnte ich die Flugrichtung bestimmen und errechnen, wo sich der Ball in 10 Steps befindet. Für den Fall, dass sich Objekte in der Nähe des Balls befinden, muss ich mir was überlegen. Aber das krieg ich schon irgendwie hin^^

    Danke für die Hilfe!
  • In 10 Steps passiert ja nicht so viel, da es ja je nach dem wie du den Roomspeed hast unter einer Sekunde ist.
    Wenn man dann davon ausgeht, dass der Ball schon in Richtung Spieler fliegt, könnte man das ganze mit physik formeln berechnen :D. Kennt aber eigentlich jeder.
    Spoiler anzeigen
    ​Kleiner Denkanstoß
    Du fährst mit einer Gleichbleibender(Gleichförmiger) Geschwindigkeit über die Autobahn mit 300km/h.
    Wie weit bist du gefahren wenn du 1 Stunde lang unterwegs warst?
    300 Kilometer.
    Formel wäre dann:
    Weg = Geschwindigkeit*Zeit
    s = v*t
    Umgestellt nach t wäre es dann:
    t = s/v


    s = Weg, v = Geschwindigkeit, t = Zeit
    t = s/v
    In Sicht vom Code im Player:
    Weg ist x-obj_ball.x
    Geschwindigkeit vom Ball müsstest du dann festlegen, wie schnell er pro step weiter geht
    Steps = (x-obj_ball.x)/(Bewegung pro Step in Pixeln);



    Ich hab eh wieder irgendwas falsch verstanden xD
    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
  • Hi Husi012,

    nee, du hast nix falsch verstanden. Du hast es genau erfasst. Das was du schreibst, war auch mein Gedanke. Ich hätte ne andere Formel verwendet, aber du bringst es auf den Punkt. Die Frage ist halt, gibt es da keine fertige Funktion?!

    Da der Ball sich nicht auf den Spieler zu bewegen muss, sondern so fliegt, wie er halt fliegt, kann ich nicht mit obj_player.x und obj_player.y arbeiten. Leider fehlen mir aktuell die vordefinierten Variablen, also daher die pure Theorie:

    Mit Hilfe von x, y, xprevious und yprevious kann ich für einen Step den Winkel und die Strecke der aktuellen Flugbahn errechnen.

    Die Formel dafür sieht in etwa so aus:

    GML-Quellcode

    1. // angle = Winkel
    2. // len = Strecke pro Step
    3. var newX = obj_ball.x + steps * len * cos(pi * angle / 180);
    4. var newY = obj_ball.y + steps * len * sin(pi * angle / 180);
  • Ich würde das dann alles in eine Funktion packen, dass ich dann später nur noch schreibe:

    getNextPosition(object, steps);

    Mein Problem ist halt nur, dass das Ergebnis im Falle einer vorherigen Kollision schlichtweg falsch wäre. Aber man könnte das auch ausnutzen. Ich meine, wenn mein obj_player erwartet, dass der Ball rechts überm Kopf ist, aber er vorher gegen die Wand knallt und auf einmal links ist, dass obj_player dann eine Fail-Animation abspielt.

    Ich werde nachher mal testen, wieviel Strecke mein Ball in einer halben Sekunde zurück legt. Vllt erübrigt sich dadurch schon das Problem...