Springen mit variabler Höhe in Side Scrollern

10

Wie kann ich den Spieler höher springen lassen, wenn die Sprungtaste länger gedrückt gehalten wird? Ich reduziere derzeit nur die Schwerkraft, solange die Taste gedrückt gehalten wird und der Spieler springt, aber das sieht seltsam aus.

John Stimac
quelle
Vielleicht erhalten Sie nur durch eine Änderung, um wie viel Sie die Schwerkraft reduzieren, eine bessere Sprungaktion.
Ali1S232
@ Gajet Das ist ziemlich klobig und scheint eine seltsame Art, es zu tun.
Die kommunistische Ente
Hmm, Sie sagen, dass die Reduzierung der Schwerkraft nicht bedeutet, dass Sie eine Physik-Engine verwenden. Ist das der Fall? Verwenden Sie Impulse zum Springen?
Jonathan Connell
Es gibt keine Physik-Engine und ich benutze keine Impulse
John Stimac
In welchem ​​Fall fällt Ihr Spieler? Übersetzen Sie seine Position nur anhand eines Bewegungsschwerkraftvektors?
Jonathan Connell

Antworten:

9

Zuerst müssen Sie entscheiden, wie der Sprung aussehen soll.

Im wirklichen Leben wird die Sprunghöhe in dem Moment festgelegt, in dem Sie den Boden verlassen. Sie können nicht weiter höher springen, während Sie sich bereits in der Luft befinden.

Wenn Sie also Ihre Sprunghöhe steuern können, während Sie bereits in der Luft sind, erhalten Sie eine Art "Jet-Pack" -ähnlichen Effekt.

Ich erinnere mich an einen Side-Scroller mit zwei unterschiedlichen Sprunghöhen. Ich denke, es war eines der Super-Mario-Spiele. Der höhere Sprung trat auf, wenn Sie die Sprungtaste gedrückt hielten, und der Sprung war dann tatsächlich ein zweiteiliger Sprung, beginnend mit dem anfänglichen regulären Sprung, gefolgt von einem zweiten Impuls, der Sie höher führte.

Also, wie soll dein Sprung aussehen? Welche Kontrolle soll der Spieler über den Sprung haben?

Ich würde damit beginnen:

Lassen Sie die Schwerkraft in Ruhe (dh ändern Sie sie niemals). Wenn ein Spieler die Sprungtaste drückt, wenden Sie die Sprungkraft an, solange der Spieler die Sprungtaste drückt (bis zu einem gewissen Zeitlimit). Wenn der Spieler dann die Sprungtaste loslässt, kann er keine Sprungkraft mehr anwenden (dh er kann keinen Sprung mehr einleiten), bis er zuerst den Boden berührt. An diesem Punkt werden die Sprünge wieder aktiviert.

Olhovsky
quelle
Ich habe das versucht und bekomme den Jetpack-Effekt. Ich habe mich gefragt, ob es einen Weg gibt, das zu vermeiden.
John Stimac
1
Vielleicht nicht das Spiel, an das Sie denken, aber in Super Mario 2 sind Sie höher gesprungen, indem Sie sich vor dem Springen ein wenig geduckt haben. (Was einen gewissen intuitiven Sinn ergibt, da Sie nicht sehr weit springen, wenn Sie versuchen, dies direkt aus einer stehenden Position heraus zu tun.)
Darien
3
Jcubed: Anstatt der Geschwindigkeit Kraft hinzuzufügen, versuchen Sie, die Kraft direkt der Position hinzuzufügen. Dann bewegt sich der Spieler linear nach oben, anstatt sich zu beschleunigen.
Olhovsky
@Jcubed: Wenn du einige Spiele wie spielst super meat boy, von denen ich denke, dass sie den gleichen Sprungeffekt haben, den du willst, scheint es so, als würde eine Kraft auf den Charakter ausgeübt , solange du die Sprungtaste gedrückt hältst, sie ist der Schwerkraft entgegengesetzt und kleiner als sie und die Ruhe ist wie das, was Alhovsky gesagt hat. Wenn ich so etwas implementieren würde, würde ich mit etwa 60% -80% der Schwerkraft als Sprungkraft beginnen.
Ali1S232
1
Ich mache das die ganze Zeit, halte einfach die Zeit, in der du die Aufwärtssprunggeschwindigkeit einstellst, indem du den Knopf kurz genug gedrückt hältst, damit es kein wahrnehmbarer Jetpack-Effekt ist - dann wird es mit ein paar Magie ziemlich einfach wie Super Mario sein Anzahl Tweaks. Verkleinern Sie nicht die "Kraft", sondern setzen Sie die Geschwindigkeit so lange auf die maximale Sprunggeschwindigkeit zurück, bis die jumpHigherTime abläuft oder der Spieler den Knopf loslässt. Außerdem empfinde ich das Springen von Super-Fleischjungen als ungenau und nervig, ebenso wie jedes Plattformspringen das beruht nur auf einer Physik-Engine; p
Oskar Duveborn
7

Ich habe einige Leute gesehen, die dies taten:

  1. Erstellen Sie eine Variable (ich werde es nennen jumpTime) (number / double / float). Wenn die Sprungtaste gedrückt wird, stellen Sie jumpTimeeine bestimmte Zahl ein (dh 0.5die Anzahl der Sekunden, die das Halten der Sprungtaste beeinflusst).

  2. Stellen Sie dann für jeden Schritt die Geschwindigkeit auf jumpTimemultipliziert mit einer anderen Zahl ein und verringern Sie sie jumpTimeum delta(die Zeitdifferenz zwischen den einzelnen Schritten).

  3. Wiederholen Sie diesen Vorgang, bis Sie jumpTimeNull oder weniger erreicht haben oder wenn der Spieler die Sprungtaste loslässt. Verwenden Sie danach die normale Physik (wenden Sie eine konstante negative Beschleunigung an, bis der Spieler den Boden erreicht).

Möglicherweise müssen Sie Versuch und Irrtum (oder "logisches Raten") verwenden, um geeignete Werte für diese "einige Zahlen" zu finden, es sei denn, Sie wissen, wie es geht.


UPDATE: Ich habe den Trick gefunden, der den Sprung etwas realistischer macht (da er ursprünglich langsam hoch und dann schnell runter geht). Infinite Mario verwendet auch die folgende Zeile (293 von Character.js der JavaScript-Version) ... this.Ya *= 0.85;Dies ist einfach wie "Luftwiderstand" und begrenzt / verlangsamt die Geschwindigkeit des Charakters in der Luft. Multiplizieren Sie also in jedem Frame die y-Geschwindigkeit (vertikale Geschwindigkeit) mit einer Zahl kleiner als eins, damit sie beim Zurückfallen langsamer wird (und daher ist es ähnlich und realistischer , wenn Sie während eines Sprungs sowohl nach oben als auch nach unten gehen ). Ich weiß, ich kann schlecht erklären ...

Wenn der Charakter mit der oben beschriebenen Methode springt, "steigt" er schneller auf als "fällt wieder nach unten". Der Luftwiderstand verlangsamt jedoch die vertikale Geschwindigkeit. Da wir die vertikale Geschwindigkeit so einstellen, dass sie proportional zu jumpTimejedem Bild ist, hat dieser Widerstand keinen großen Einfluss auf die erste Hälfte des Springens. In der nächsten Hälfte (nach unten fallend) wird die vertikale Geschwindigkeit jedoch nicht in jedem Frame eingestellt, sondern einfach durch eine andere Zahl addiert (in diesem Fall ist es die Gravitationskonstante). Daher wirkt sich der Luftwiderstand beim Fallen aus. Da er die Geschwindigkeit (in jede Richtung) verringert, verlangsamt er den Fall und ähnelt der ersten Hälfte.

Es gibt jedoch auch andere Möglichkeiten, um dieses Problem zu lösen, z. B. die Verringerung der Schwerkraft auf den Charakter beim Fallen. Wir müssen jedoch herausfinden, um wie viel wir die Schwerkraft reduzieren sollten.


Fallstudie: Unendlicher Mario

Folgendes habe ich gefunden (aus Zeile 206 von Mario.java von Markus Persson (Notch)):

    if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
    {
        if (jumpTime < 0)
        {
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            jumpTime++;
        }
        else if (onGround && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = 0;
            yJumpSpeed = -1.9f;
            jumpTime = 7;
            ya = jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;
        }
        else if (sliding && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = -facing * 6.0f;
            yJumpSpeed = -2.0f;
            jumpTime = -6;
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;

            facing = -facing;
        }
        else if (jumpTime > 0)
        {
            xa += xJumpSpeed;
            ya = jumpTime * yJumpSpeed;
            jumpTime--;
        }
    }
    else
    {
        jumpTime = 0;
    }

Die Javascript-Version ist im Grunde dieselbe https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

Dies ähnelt dem Vorschlag von Olhovsky, aber in diesem Fall ist die Kraft proportional zu der Zeit, die vergangen ist, nachdem der Spieler die Sprungtaste gedrückt hat.

Meine Javascript-Version:

    if ( onGround && jump && !jumped ) {
        jumpTime = maxJumpTime;
        onGround = false;
        jumped = true;
        this.vel.y = jumpTime * jumpConstant;
        A = true;
    } else if ( !onGround && jump && jumpTime > 0 && !released ) {
        jumpTime -= evt.delta;
        this.vel.y = jumpTime * jumpConstant;
        B = true;
    } else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
        this.vel.y -= gravityConstant * evt.delta;
        jumpTime = 0
        released = true;
    } if ( this.pos.y < 0 && !A && !B ) {
        onGround = true;
        released = false;
        this.pos.y = 0;
        this.vel.y = 0;
    }
    if ( !jump && onGround ) jumped = false;

Einige Werte für die Konstanten (z. B. "Schwerkraftkonstante" und "Sprungkonstante") ergeben jedoch einen unrealistischen Sprung. Aber manchmal müssen Spiele nicht realistisch sein! ( Update siehe Update-Abschnitt oben)

Diese Frage ist bereits mehr als ein Jahr alt, aber ich hoffe, das hilft!

ErnWong
quelle
2

Wie Olhovsky gesagt hat, wird die Sprunghöhe in dem Moment festgelegt, in dem Sie den Boden verlassen, nicht danach.

Wenn Sie wirklich den Jetpack - Effekt vermeiden wollen, sehe ich nur zwei Möglichkeiten: eine Tastenkombination um höher zu springen, oder grundlegend verändert die Art , die Sprungtaste funktioniert:

Anstatt den Spieler springen zu lassen, sobald die Taste gedrückt wird, verzögern Sie den Sprung, bis die Taste losgelassen wird . Im Grunde genommen steuert die Dauer des Tastendrucks, wie viel Federspannung in den Beinen des Spielers aufgebaut und anschließend gelöst wird.

Dies verändert natürlich die Spielmechanik grundlegend und kann für den Spieler ungewohnt sein. Aber der Effekt könnte sehr interessant sein und die Unbekanntheit wert sein.

Konrad Rudolph
quelle
2
Ich denke, ich erinnere mich, dass ich mit genau dieser Mechanik einen Plattformer gespielt habe - verlasse den Boden nicht, bis du den Sprung "aufgeladen" hast. Mit einigen hübschen Animationen (wie Staubwolken, die zu Füßen des Charakters wachsen) kann dies getan werden, um sich intuitiv zu fühlen.
Jari Komppa
2

Ich habe in David Gouveias Antwort auf die Frage " Wie kann man einen Charakter zum Springen bringen? " Eine andere Lösung gefunden.

Zusammenfassung:

Seine Idee war es, eine Geschwindigkeit einzustellen, wenn der Spieler den Sprungknopf drückt. In jedem Frame wird nur die Schwerkraft berechnet. Wenn der Spieler die Taste loslässt, setzt er die Geschwindigkeit auf einen kleineren Wert, wenn die Geschwindigkeit größer als sie ist. Die Geschwindigkeit wird in jedem Frame nur durch die Schwerkraft verringert.

Ich sollte seine Antwort nicht stehlen, also lesen Sie seinen Beitrag. Seine Lösung befindet sich im Abschnitt " Sprung mit variabler Höhe ".

Die Leute haben sich also viele verschiedene Möglichkeiten ausgedacht, um dieses Problem zu lösen ...

ErnWong
quelle