Wie implementiere ich eine Verzögerung?

11

Ich sage "Verzögerung", weil ich momentan keine Beschleunigung verwende. Ich meine, die Geschwindigkeit zurück in Richtung Null zu bewegen und schließlich anzuhalten.

Ich bin neu in Vektoren und nicht so gut mit Physik und so. Wie wird "Verzögerung" normalerweise gehandhabt?


Was ich jetzt habe, funktioniert, aber es scheint irgendwie hackisch .

update:function(Game, t, dt) {
    var speed = Game.Input.isKeyDown('shift') ? 8 : 4;

    if (Game.Input.isKeyDown('a')) {
        this.velocity.i -= speed;
    }
    else if (Game.Input.isKeyDown('d')) {
        this.velocity.i += speed;
    }
    else {
        if (Math.abs(this.velocity.i) > 3) {
            this.velocity.i += (this.velocity.i > 0) ? -speed : speed;
        }
        else {
            this.velocity.i = 0;
        }
    }

    if (Game.Input.isKeyDown('w')) {
        this.velocity.j -= speed;
    }
    else if (Game.Input.isKeyDown('s')) {
        this.velocity.j += speed;
    }
    else {
        if (Math.abs(this.velocity.j) > 3) {
            this.velocity.j += (this.velocity.j > 0) ? -speed : speed;
        }
        else {
            this.velocity.j = 0;
        }
    }

    this.updateVectors(dt);
}

Ich habe 3 verwendet, weil alles, was niedriger ist, ein seltsames Verhalten zeigt. Ich schätze, wenn ich die Geschwindigkeit erhöhen würde, müsste es geändert werden.

Xavura
quelle
2
Auch kleine semantische Detail .. in der Erklärung velocity.i += speed;die speedist in der Tat Ihre Beschleunigung, dh die Rate , die Geschwindigkeit ändert sich durch. :)
Ipsquiggle
Flixel nennt dies "Ziehen", falls Sie nach einem Begriff suchen, der unabhängig von der Beschleunigung ist.
Gregory Avery-Weir
"Verzögerung" ist eine negative Beschleunigung. Hast du Kalkül genommen?
3Dave
1
Eigentlich ist "Verzögerung" weder eine echte Sache noch "negative Beschleunigung". Es ist alles regelmäßige Beschleunigung, nur in verschiedene Richtungen.
MichaelHouse

Antworten:

16

Etwas so Einfaches wie

this.velocity.i *= 0.9;

funktioniert gut.

David Young
quelle
Heh, vertrau mir, dass ich es so schlimm kompliziere . Ich habe kürzlich gelesen, dass man den grundlegenden Luftwiderstand simulieren kann, indem man ihn mit 0,9 multipliziert, und das ist mir trotzdem nicht in den Sinn gekommen. Vielen Dank.
Xavura
Haha, oh wow, ja. Ich berechnete eine inverse Vektornormale und multiplizierte sie mit einem Verlangsamungsfaktor. Warum habe ich das nicht einfach gemacht? Manchmal sind die wirklich offensichtlichen Antworten am einfachsten zu übersehen.
CodexArcanum
7

In Pseudocode mache ich Variationen davon:

Geschwindigkeit + = ((MoveDirection * MaximumSpeed) - Geschwindigkeit) * AccelerationFactor

Wo:

  • Geschwindigkeit ist die aktuelle Geschwindigkeit, mit der sich das Objekt auf der aktuellen Achse bewegt.
  • MoveDirection ist die Richtung, in die das Objekt auf der aktuellen Achse fahren möchte. 1 ist vorwärts, 0 ist still und -1 ist rückwärts. Alle dazwischen liegenden Werte sind zulässig.
  • MaximumSpeed ​​ist eine Konstante, die bestimmt, wie schnell sich das Objekt auf der aktuellen Achse bewegen kann.
  • AccelerationFactor ist eine Konstante zwischen 0 und 1, die die Beschleunigungs- und Verzögerungsrate darstellt. 1 ist sofort und 0 wird sich niemals bewegen.

Womit sowohl Beschleunigung als auch Verzögerung gut in einer gekrümmten statt in einer Linie gehandhabt werden können. Wenn Sie unterschiedliche Beschleunigungs- und Verzögerungsraten wünschen, können Sie IF-Anweisungen ausführen, die bestimmen, ob der Spieler versucht, sich nicht oder in die entgegengesetzte Richtung zu bewegen.

earok
quelle
1
Das ist eine sehr interessante Formel. Das muss ich mir für die Zukunft merken!
Ipsquiggle
+1 Sieht interessant aus, ich denke, ich könnte es in einen Code werfen, damit es funktioniert.
David Young
Sehr gute Formel. Ich werde das benutzen. Wo hast du es her? Oder haben Sie es selbst abgeleitet?
Riki
Entschuldigen Sie die Verzögerung bei der Beantwortung. Ich erinnere mich vage, dass ich mich vom Code einer der Blitz3D-Demos inspirieren ließ. Ich kann mich jedoch nicht erinnern, welche.
earok
3

Die Antworten hier ( vel = vel * 0.9) sind tatsächlich dämpfend , nicht das, was ich als "Verzögerung" bezeichnen würde .

Ich bremse oft so:

if ( Game.Input.isKeyDown( "w" ) )
{
    this.velocity.i = Math.max( -WALKSPEED, this.velocity.i - WALKFORCE);
}
else if ( Game.Input.isKeyDown( "d" ) )
{
    this.velocity.i = Math.min( WALKSPEED, this.velocity.i + WALKFORCE);
}
else
{
    if (this.velocity.i < 0)
    {
        this.velocity.i = Math.min( 0, this.velocity.i + WALKFORCE);
    }
    else if (this.velocity.i > 0)
    {
        this.velocity.i = Math.max( 0, this.velocity.i - WALKFORCE);
    }
}

Einige Vor- und Nachteile gegenüber Dämpfung:

Vorteile :

  • Die Beschleunigungsbeschleunigung und die Verlangsamungsbeschleunigung sind beide linear, was ein angenehm subtiles "Spielgefühl" vermittelt, das meiner Meinung nach keine Dämpfung bietet. Dies ist der wichtige Teil.
  • Der Charakter kommt nach einer vorhersehbaren Anzahl von Iterationen zu einem vorhersehbaren vollständigen Stopp.

Nachteile :

  • Dies ist schwieriger zu implementieren, wenn Sie eine nicht orthogonale Bewegung verwenden (wie es sich anhört?). Grundsätzlich müssen Sie einen Kraftvektor erhalten, der an der Geschwindigkeit ausgerichtet ist, Längen vergleichen und als angemessen subtrahieren oder auf Null setzen. (Wenn Sie möchten, dass dies mit Code erklärt wird, fragen Sie einfach.)
Ipsquiggle
quelle
1

Ganz einfach ausgedrückt, in Pseudocode:

if(no movement keys pressed) [Meaning we want to start to decelerate]
current speed *= 0.85 [Or some number between 0 and 1, the smaller the faster the deceleration]

Sie müssten jedoch prüfen, ob (aktuelle Geschwindigkeit <0,001f) oder etwas anderes und auf 0 setzen.

Die kommunistische Ente
quelle
Ich dachte, ich müsste auch einen Scheck ausstellen, aber es scheint ohne einen zu funktionieren.
Xavura