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.
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.
Antworten:
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.
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.
Ich habe einige Leute gesehen, die dies taten:
Erstellen Sie eine Variable (ich werde es nennen jumpTime
) (number / double / float). Wenn die Sprungtaste gedrückt wird, stellen Sie jumpTime
eine bestimmte Zahl ein (dh 0.5
die Anzahl der Sekunden, die das Halten der Sprungtaste beeinflusst).
Stellen Sie dann für jeden Schritt die Geschwindigkeit auf jumpTime
multipliziert mit einer anderen Zahl ein und verringern Sie sie jumpTime
um delta
(die Zeitdifferenz zwischen den einzelnen Schritten).
Wiederholen Sie diesen Vorgang, bis Sie jumpTime
Null 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 jumpTime
jedem 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.
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.
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!
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.
Ich habe in David Gouveias Antwort auf die Frage " Wie kann man einen Charakter zum Springen bringen? " Eine andere Lösung gefunden.
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 ...
http://excitemike.com/JumpingControlTester (zeigt verschiedene Sprungmechanismen in verschiedenen Spielen)
http://meyermike.com/wp/?p=175 (beschreibt auch Marios Sprungpfad)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (beschreibt 3 verschiedene Methoden)
möglicherweise mehr (habe nicht zu viele Suchergebnisse durchgesehen, aber googeln "variable Sprunghöhe" hilft)