Slow-Motion

  • GM 8

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

  • Slow-Motion

    Ich habe ein Jump 'n' Run Spiel, bei dem ich gerne eine Zeitlupe einbauen möchte, so wie bei Prince of Persia, nur dass halt der Spieler selbst auch langsamer wird. Kurz gesagt: Ich möchte, dass das Spiel mit der Leertaste für ein paar Sekunden in Zeitlupe versetzt wird, damit man in Ruhe zielen kann.
    Room_speed ist bei mir Standartmäßig auf 30. Nun habe ich es gemacht, dass die room_speed solange auf 15 gesetzt wird, wie ich die Leertaste drücke. Wenn ich loslasse ist es wieder normal. Alles funktioniert super, nur das Problem ist, dass es in der wunderschönen Zeitlupe extrem stockt, da warscheinlich nicht genügend Frames berechnet werden. Was kann ich da machen? Wenn ich einfach room_speed erhöhe, sodass mehr Frames berechnet werden, ist das ganze Spiel im Zeitraffer, das will ich auch nicht....


    edit: Ich könnte natürlich auch einstellen, dass beim drücken der Leertaste einfach alle 27 Objekte langsamer werden aber das wäre mir dann doch ein bisschen zu aufwändig....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von FlashXenon ()

  • Erstmal zu room_speed:
    room_speed ist die Anzahl der aktualisierungen des Bildschirms pro Sekunde. Heißt: room_speed = 30; macht das 30 mal der Bildschirm neu gezeichnet wird, und room_speed = 15; das nur 15 mal pro Sekunde der Bildschirm neu gezeichnet wird.

    Du könntest ja zum Beispiel im Create Event einen Faktor bestimmen, und wenn du die Leertaste drückst (pressed!) teilst du den Speed von allen Objekten durch diesen Faktor. Beim wieder loslassen (release!) wird der Speed dann wieder mal diesen Faktor genommen.

    Ich könnte natürlich auch einstellen, dass beim drücken der Leertaste einfach alle 27 Objekte langsamer werden aber das wäre mir dann doch ein bisschen zu aufwändig....
    Dürfte doch eigentlich mit

    GML-Quellcode

    1. with(all) speed /= iFaktor;

    fuktionieren oder nicht?

    Mfg.,
    Mokuyobi
    木曜日 (Mokuyōbi)
  • das mit der globalen Variable, durch die die Geschwindigkeit jedes Objekts geteilt wird, habe ich schon versucht, aber es geht noch nicht so richtig. Denn beim Springen wird der Spieler irgendwie nicht langsamer. Könntest du mir vielleicht yoyogames.com/downloads/tutorials/platform.zip (plattform1.gmk) so verändern, dass beim drücken der Leertaste alles halb so schnell wird? Ich verstehe das noch nicht so richtig ^^ MfG FlashXenon
  • Naja, Mokuyobi's Lösung würde ich generell nicht empfehlen. Ich habe zufälligerweise genau das in mein derzeitiges Projekt eingebaut und habe es so gelöst:

    Als erstes, ich benutze die Game-Maker-Bewegungsvariablen wie speed, vspeed, hspeed und direction nicht, sondern verwende Eigene. Nennen wir unsere Variablen beispielsweise b_speed und b_direction. Oder, je nach Situation b_hspeed und b_vspeed. Schließlich muss dann in den Step-Event (ich empfehle den End-Step-Event) Folgendes oder Ähnliches geschrieben werden:

    GML-Quellcode

    1. b_hspeed=lengthdir_x(b_speed,b_direction) //Diese zwei Zeilen kann man
    2. b_vspeed=lengthdir_x(b_speed,b_direction) //je nach Situation weglassen
    3. x+=b_hspeed*global.game_speed
    4. y+=b_vspeed*global.game_speed

    Ähnliches muss an anderen Stellen gemacht werden, wie z.b. ein Zähler, der die Zeit des Sprungs in der Luft zählt:

    GML-Quellcode

    1. a_timer+=1*global.game_speed

    Vergiss außerdem nicht, dass Beschleunigungen auch beeinflusst werden müssen, also wird dann z.B. aus b_speed+=b_acceleration:

    GML-Quellcode

    1. b_speed+=b_acceleration*global.game_speed

    Auch Animationen müssen angepasst werden, also verzichte auf Variablen wie image_speed, setze diese deshalb stets auf 0 und verwende einen solchen Code:

    GML-Quellcode

    1. image_index+=b_image_speed*global.game_speed

    Alle Codes die du so veränderst, würde ich alle in den selben Step-Event packen wie das obige, also in meinem Fall in den End-Step Event.

    Schlaue Leute wissen nun: Die Variable global.game_speed gibt die Geschwindigkeit des Spiels an, ohne dabei die Framerate des Spiels zu beeinflussen. Dabei ist der Wert 1 die normale Geschwindigkeit, der Wert 0.5 würde dann eine Zeitlupe bedeuten, die die Geschwindigkeit halbiert. Dabei kann diese Variable beliebig geändert werden (Allerdings dafür lieber nicht den End-Step-Event benutzen).
    Natürlich musst du auch ein wenige selbst überlegen, wo du so eine Veränderung im Code brauchst und wo nicht. Bei mir z.b. hängt ein Großteil der Animationen von diesem a_timer ab, demnach muss ich bei diesen Animationen nicht die Geschwindigkeit beeinflussen, da a_timer ja schon langsamer voranschreitet.


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von lolliger_joj ()

  • Benutzer online 1

    1 Besucher