Come posso fare in modo che il giocatore salti più in alto se il tasto di salto viene tenuto premuto più a lungo? Attualmente sto solo riducendo la gravità finché si tiene premuto il tasto e il giocatore salta, ma sembra strano.
Come posso fare in modo che il giocatore salti più in alto se il tasto di salto viene tenuto premuto più a lungo? Attualmente sto solo riducendo la gravità finché si tiene premuto il tasto e il giocatore salta, ma sembra strano.
Risposte:
Per prima cosa devi decidere come vuoi che sia il salto.
Nella vita reale, l'altezza del salto è decisa nel momento in cui lasci il terreno. Non puoi continuare a saltare più in alto mentre sei già a mezz'aria.
Quindi, se riesci a controllare l'altezza del tuo salto mentre sei già in aria, otterrai una sorta di effetto "jet-pack".
Mi sembra di ricordare un sidescroller che aveva due diverse altezze di salto, penso che fosse uno dei giochi di super mario. Il salto più alto si è verificato quando hai tenuto premuto il pulsante di salto e il salto è stato in realtà un salto in due parti, a partire dal salto normale iniziale, seguito da un secondo impulso che ti ha portato più in alto.
Allora, come vuoi che sia il tuo salto? Che tipo di controllo vuoi che il giocatore abbia sul salto?
Quello che vorrei iniziare è questo:
Lasciare sola la gravità (cioè non cambiarla mai). Quando un giocatore preme il pulsante di salto, applica la forza di salto finché il giocatore sta premendo il pulsante di salto (fino a un certo limite di tempo). Quindi, quando il giocatore rilascia il pulsante di salto, non può applicare di nuovo alcuna forza di salto (cioè non può iniziare di nuovo un salto) fino a quando non tocca prima il terreno, a quel punto i salti vengono riattivati.
super meat boy
, penso che abbia lo stesso effetto di salto che desideri, sembra che finché tieni premuto il pulsante di salto si applica una forza al personaggio, è opposto alla gravità e più piccolo di esso, e il il riposo è come quello che ha detto alhovsky. se dovessi implementare qualcosa del genere, inizierei con qualcosa come il 60% -80% di gravità come forza di salto.
Ho visto alcune persone fare questo:
Crea una variabile (la chiamerò jumpTime
) (numero / doppio / float). Quando si preme il tasto di salto, impostare un jumpTime
certo numero (cioè 0.5
. Questo sarà il numero di secondi che avrà effetto sul mantenimento del tasto di salto).
Quindi, per ogni passaggio, impostare la velocità su jumpTime
moltiplicata per qualche altro numero e diminuire jumpTime
di delta
(la differenza di tempo tra ogni passaggio).
Ripeti fino a jumpTime
raggiungere zero o al di sotto, o quando il giocatore rilascia il tasto di salto. Dopo ciò accade, usa la fisica normale (applica un'accelerazione negativa costante fino a quando il giocatore non raggiunge il suolo).
Potrebbe essere necessario utilizzare tentativi ed errori (o "ipotesi logiche") per trovare valori adeguati per questi "alcuni numeri", a meno che non si sappia come farlo.
AGGIORNAMENTO: ho trovato il trucco che rende il salto un po 'più realistico (dato che in origine è lento salire ma poi scendere velocemente). Infinite Mario utilizza anche la seguente riga (293 di Character.js della versione JavaScript) ... this.Ya *= 0.85;
Questo è semplicemente come "trascinamento dell'aria" e limita / rallenta la velocità del personaggio quando è a mezz'aria. Quindi ogni frame, moltiplicare il y-velocità (velocità verticale) di un numero inferiore a uno in modo che rallenta quando ridiscendere verso il basso (e quindi sia andando verso l'alto e andando verso il basso durante un salto saranno simili e più realistico). Lo so, sono cattivo a spiegare ...
Quando il personaggio salta usando il metodo che ho descritto in precedenza, "sale" più velocemente e poi "ricade verso il basso". Il trascinamento, tuttavia, rallenta la velocità verticale. Poiché impostiamo la velocità verticale in modo che sia proporzionale a jumpTime
ogni fotogramma, questo trascinamento non influisce molto sulla prima metà del salto. Tuttavia nella metà successiva (ricadendo verso il basso), la velocità verticale non viene impostata su ogni fotogramma, ma semplicemente aggiunta da un altro numero (in questo caso è la costante gravitazionale). Pertanto, il trascinamento ha effetto nella caduta e poiché diminuisce la velocità (in qualsiasi direzione), rallenta la caduta, rendendola simile alla prima metà.
Esistono altri modi per risolvere questo problema, come diminuire l'effetto della gravità sul personaggio mentre cade. Tuttavia, dobbiamo scoprire quanto dovremmo ridurre la gravità.
Questo è quello che ho trovato (dalla linea 206 di Mario.java di 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;
}
La versione javascript è sostanzialmente la stessa https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js
Questo è simile al suggerimento di Olhovsky, ma in questo caso la forza sarà proporzionale al tempo trascorso dopo che il giocatore ha premuto il tasto di salto.
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;
Tuttavia, alcuni valori per le costanti (ad es. "GravityConstant" e "jumpConstant") daranno comunque un salto non realistico. Ma a volte i giochi non devono essere realistici! ( aggiornamento vedere la sezione di aggiornamento sopra)
Questa domanda ha già più di un anno, ma spero che questo aiuti!
Come ha detto Olhovsky, l'altezza del salto viene decisa nel momento in cui lasci il terreno, non dopo.
Se vuoi davvero evitare l'effetto jetpack, vedo solo due modi: una combinazione di tasti per saltare più in alto o cambiare sostanzialmente il modo in cui funziona il tasto di salto:
Invece di far saltare il giocatore non appena si preme il tasto, ritardare il salto fino al rilascio del tasto . Quindi, in sostanza, la durata della pressione del tasto controlla la tensione della molla nelle gambe del giocatore, che viene successivamente rilasciata.
Naturalmente, questo altera fondamentalmente le meccaniche di gioco e potrebbe non avere familiarità con il giocatore. Ma l'effetto potrebbe essere piuttosto interessante e potrebbe valere la pena di familiarità.
Ho trovato un'altra soluzione nella risposta di David Gouveia alla domanda " Come far saltare un personaggio? "
La sua idea era quella di impostare una velocità quando il giocatore preme il pulsante di salto. In ogni frame calcola solo la gravità. Tuttavia, quando il giocatore rilascia il pulsante, imposta la velocità su un valore inferiore se la velocità è maggiore di essa. La velocità viene ridotta solo di ciascun fotogramma dalla gravità.
Non dovrei rubare la sua risposta, quindi vai avanti e leggi il suo post. La sua soluzione è nella sezione " Salto di altezza variabile ".
Quindi davvero le persone hanno escogitato molti modi diversi per risolvere questo problema ...
http://excitemike.com/JumpingControlTester (illustra diversi meccanismi di salto in vari giochi)
http://meyermike.com/wp/?p=175 (discute anche del percorso di salto di Mario)
http://www.flatredball.com/frb/docs/index.php?title=Tutorials:Platforer:Variable-Height_Jumps (descrive 3 diversi metodi)
forse di più (non ho passato troppi risultati di ricerca, ma google "l'altezza di salto variabile" aiuta)