Ladesprung in 2D-Spiel – wie Kraftkurve natürlich machen?

OP #8106676

Hallo zusammen, ich bin Jeff, Hobby-Entwickler. In meinem kleinen 2D-Projekt hält man eine Taste gedrückt, um Kraft für einen Sprung aufzuladen. Linear fühlt es sich steif an, quadratisch zu ungenau. Welche Kurve nutzt ihr, damit es sich natürlich anfühlt? Danke für Tipps!

Jeff W. schrieb:

Linear fühlt es sich steif an, quadratisch zu ungenau.

Dein Rechner wird im Rahmen seiner Möglichkeiten genau das rechnen, was du ihm sagst, d.h. was in deinem (unbekannten) Algorithmus bzw. Programm steckt.
Was das Anfühlen betrifft: Orientiere dich an der Physik. Die ist Menschen seit hunderttausenden von Jahren vertraut. Wenn die Auflösung nicht reicht, erhöhe sie.

: Bearbeitet durch User

Jeff W. schrieb:

Welche Kurve nutzt ihr, damit es sich natürlich anfühlt?

Die Kraft einer (einfachen) Feder ist linear vom Weg abhängig. Da dein Taster wohl kaum auf Kraft reagiert, bleibt nur die Zeit statt Weg übrig. Also dann auch linear.
Doppelt so lange drücken -> doppelt so viel Kraft

Persönliche Seite

Die "Spannung" ist linear wegen der Höhenänderung (mit g = const), aber die Entfaltung der Beschleunigung bei einem Sprung ist es nicht, weil der Beinwinkel sich ändert. Das muss realistisch rein. Im Groben geht die Sprunghöhe mit der Wurzel der "Ladung", aber die Beschleunigung ist gegen Ende höher. Im Integral sehe ich an eine Potenz (2/3).

Servus. Welche Engine nutzt du? Vermutlich steuert bei dir die Haltezeit die Absprunggeschwindigkeit,oder? Die Sprunghöhe wächst aber mit dem Quadrat der Geschwindigkeit (h = v²/2g). Halb aufgeladen ergibt deshalb nur ein Viertel der Höhe. Darum passiert am Anfang wenig, und am Ende wird es zu grob.

Lass die Haltezeit die Sprunghöhe bestimmen und berechne die Geschwindigkeit daraus -->

1
// Taste drücken: Aufladen starten
2
if (jumpPressed && onGround) {
3
    charging = true;
4
    holdTime = 0;
5
}
6

7
// Taste gehalten: Zeit aufaddieren (jeden Frame)
8
if (charging && jumpHeld) {
9
    holdTime += deltaTime;
10
}
11

12
// Taste losgelassen: springen
13
if (charging && jumpReleased) {
14
    t  = clamp(holdTime / maxChargeTime, 0, 1);   // Ladung 0..1
15
    k  = 1 - pow(1 - t, 2);                       // Ease-out-Kurve, Exponent zum Tunen
16
    h  = lerp(minHeight, maxHeight, k);           // gewünschte Sprunghöhe
17
    v0 = sqrt(2 * gravity * h);                   // nötige Absprunggeschwindigkeit
18
    velocity.y = v0;                              // Sprung auslösen
19
    charging = false;
20
}

Die Ease-out-Kurve sorgt dafür, dass der Sprung am Anfang schnell reagiert und sich zum Ende hin fein dosieren lässt. Ladezeit kurz vllt so 0,5–1 Sekunde und gib beim Aufladen sichtbares Feedback, zB mit einem Balken.Mit dem Exponenten dann entsprechend anpassen.

: Bearbeitet durch User

Antwort schreiben

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.