Sprunghandhabung und Schwerkraft

7

Ich bin neu in der Spieleentwicklung und suche Hilfe bei der Verbesserung meines Sprunghandlings für ein einfaches Side-Scrolling-Spiel, das ich erstellt habe. Ich möchte, dass der Sprung länger dauert, wenn die Taste über die gesamte Länge des Sprunges gedrückt gehalten wird. Andernfalls wird der Sprung nicht so lang, wenn die Taste gedrückt wird. Derzeit gehe ich wie folgt mit dem Springen um:

Player.prototype.jump = function () {
    // Player pressed jump key
    if (this.isJumping === true)
    {
        // Set sprite to jump state
        this.settings.slice = 250;

        if (this.isFalling === true)
        {
            // Player let go of jump key, increase rate of fall
            this.settings.y -= this.velocity;
            this.velocity -= this.settings.gravity * 2;
        }
        else
        {
            // Player is holding down jump key
            this.settings.y -= this.velocity;
            this.velocity -= this.settings.gravity;
        }

    }

    if (this.settings.y >= 240)
    {
        // Player is on the ground
        this.isJumping = false;
        this.isFalling = false;
        this.velocity = this.settings.maxVelocity;
        this.settings.y = 240;
    }
}

Ich setze isJumping auf Keydown und isFalling auf Keyup. Während es für den einfachen Gebrauch in Ordnung ist, suche ich nach einem besseren Weg, um mit Springen und Schwerkraft umzugehen. Es ist ein bisschen fehlerhaft, wenn die Schwerkraft erhöht wird (weshalb ich die letzte y-Einstellung in die letzte if-Bedingung setzen musste), also würde ich gerne einen besseren Weg finden, dies zu tun. Wo sind einige Ressourcen, die ich mir ansehen könnte, um besser zu verstehen, wie man mit Springen und Schwerkraft umgeht? Was ist ein besserer Ansatz, um damit umzugehen? Wie gesagt, ich bin neu in der Spieleentwicklung, also könnte ich es völlig falsch machen. Jede Hilfe wäre dankbar.

opes
quelle

Antworten:

7

Hier ist, wie ich vorschlagen würde, damit umzugehen:

Lassen Sie Ihre PlayerKlasse zunächst eine Variable speichern jumpForce, bei der es sich um einen 2D-Vektor handelt, der velocityund ähnelt gravity. Haben Sie jetzt auch eine Konstante, initialJumpForcedie die unmittelbare Kraft ist, die auf Ihren Spieler ausgeübt wird, wenn die Sprungtaste zum ersten Mal gedrückt wird. Wenn die Sprungtaste gedrückt wird und der Spieler geerdet ist (z. B. Player.settings.yist 240), dann:

jumpForce = initialJumpForce;

Und jedes Update:

// Calculate the net force acting on the player.
var netForce = this.jumpForce - this.settings.gravity;
this.velocity += netForce * deltaTime;

// Deteriorate the jumping force.
this.jumpForce -= this.settings.gravity;
// Do something to ensure that jumpForce doesn't become negative.

Beachten Sie, dass eine zusätzliche Variable ,, angezeigt wurde deltaTime. Dies müssen Sie verwenden, wenn Sie Geschwindigkeit und Position in eine Aktualisierungsschleife integrieren. deltaTimeist die Zeit in Sekunden, die seit dem letzten Frame vergangen ist.

Immer wenn die Sprungtaste losgelassen wird, sofort Player.jumpForcewieder auf einstellen 0. Auf diese Weise übernimmt die Schwerkraft vollständig Ihren Spieler. Wenn Sie die Sprungtaste gedrückt halten, bleibt die langsam abnehmende Sprungkraft am Leben, um auf Ihren Spieler in der Luft einzuwirken.

Sie können auch einen Impuls oder eine direkte Änderung der Geschwindigkeit in Betracht ziehen, wenn die Sprungtaste gedrückt wird. Während jumpForceSie mit Sprungsteuerungen die gewünschte Dynamik erzielen, wird es einige Zeit dauern, bis Sie auf den Spieler einwirken, sodass das Springen träge erscheint. Zusätzlich zum Einstellen der Sprungkraft können Sie also Folgendes tun:

this.velocity.y = 50;

Ich habe 50willkürlich ausgewählt ... nicht sicher, welche Einheiten Sie verwenden, aber es ist ein Wert, mit dem Sie spielen können; das gleiche mit initialJumpForce. Hoffe das hilft :)

Kevintodisco
quelle
Dies ist ein großartiger Ort, um zu beginnen. Eine kurze Frage deltaTime, um sicherzustellen, dass ich es richtig verstehe. Wäre es nur eine Sekunde geteilt durch meine Framerate? Wenn zum Beispiel meine Bilder pro Sekunde 30 sind, deltaTimewäre das dann 1/30 oder .033?
öffnet
2
@sprawl Ja, das ist richtig. Seien Sie jedoch gewarnt, wenn Sie davon ausgehen, dass Ihre Framerate auf 30 festgelegt ist, können unerwartete Ergebnisse erzielt werden. Normalerweise schwankt die Framerate leicht, besonders wenn Sie anfangen, schwere Berechnungen durchzuführen. Es ist besser, einen System-Timer zu verwenden und jeden Frame neu zu berechnen, wie viel Zeit seit dem letzten Frame vergangen ist. ZBdt = getTotalElapsedSeconds() - totalElapsedSecondsLastFrame;
Kevintodisco
@ktodisco Danke für die Information. Ich werde weitermachen und es versuchen. Das war sehr informativ und ich schätze es sehr. Vielen Dank!
öffnet