Come far saltare un personaggio?


45

Attualmente sto realizzando un gioco in C # usando Direct X 9.0. Il remake del gioco è Donkey Kong NES. Ho quasi completato tutto, ma sto avendo problemi con la fisica del salto di Mario. Ho delle variabili dichiarate per le coordinate Y e X.

Mi chiedevo se esistesse un metodo semplice per farlo. Ho cercato una risposta alta e bassa ma le risposte che ho trovato sono irrilevanti / o usano un linguaggio di programmazione diverso come XNA.

Al momento ho una variabile bool impostata per verificare se W è stato premuto, quindi questo farà scattare qualsiasi codice per farlo saltare. Ho fatto casino come.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Che non ha funzionato così bene. Ho cercato una risposta in alto e in basso e ora sono disperato, se qualcuno potesse indicarmi la giusta direzione verso una soluzione semplice. Sarebbe grandioso. Molto apprezzato per qualsiasi risposta.


5
Le risposte che usano un linguaggio di programmazione diverso non dovrebbero costituire un problema. L'algoritmo è ciò che interessa, non l'implementazione specifica ... a meno che tu non stia solo sperando di copiare e incollare senza capire nulla, cosa che spero sicuramente non lo sia! Essere in grado di leggere e adattare algoritmi da altri linguaggi di programmazione è un'ottima abilità.
ccxvii,

Risposte:


85

Prima di tutto, anche XNA usa C #, quindi è lo stesso linguaggio di programmazione. E sebbene l'API sottostante possa avere alcune differenze rispetto a DirectX, ciò non ha nulla a che fare con il salto, quindi gli stessi tutorial o risposte dovrebbero applicarsi qui. Inoltre, ci sono molti modi per implementarlo, a seconda di molti fattori. Quello che descriverò di seguito è solo una delle possibilità.

Requisiti di fisica di base

Per prima cosa hai bisogno di alcune variabili fisiche di base e calcoli sul tuo ciclo di aggiornamento. In particolare, è necessario definire posizione, velocità e gravità e il ciclo di aggiornamento dovrebbe fare qualcosa di più o meno simile a questo (rilevamento delle collisioni e risposta omessa per semplicità):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Salto ad altezza fissa

Ora il modo più semplice per eseguire un salto che ha sempre la stessa altezza, non importa per quanto tempo si preme il tasto, è semplicemente cambiare una volta la velocità verticale. Questo farà iniziare il personaggio a salire, mentre la gravità si prenderà automaticamente cura di abbatterlo:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Importante Non vuoi essere in grado di iniziare un salto se il tuo personaggio non è a terra, quindi dovrai aggiungere un segno di spunta.

Salto ad altezza variabile

Ma giochi come Mario e Sonic hanno un salto variabile in cui l'altezza del salto dipende dalla durata della pressione del pulsante. In questo caso dovrai gestire sia la pressione che il rilascio del tasto di salto. Potresti aggiungere qualcosa come:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Modificando tutti questi valori (cioè i numeri come 0.5, -12.0fo -6.0f) nel codice sopra puoi cambiare la sensazione del tuo salto, quanto salta in alto, quanto slancio mantiene anche dopo aver rilasciato il pulsante di salto, quanto velocemente cade, ecc. .

Importante Non chiamare queste funzioni in ogni frame. Chiamali una sola volta quando il tasto viene premuto o rilasciato. Altrimenti il ​​tuo personaggio volerà invece di saltare.

Esempio di lavoro

Ho appena creato un rapido esempio delle tecniche sopra descritte, che puoi provare sul tuo browser qui (premi il pulsante del mouse per saltare, rilascialo a metà strada per controllare l'altezza del salto). È in JS ma come ho già detto in precedenza, la lingua è irrilevante in questo caso.

http://jsfiddle.net/LyM87/


11
Potresti anche cogliere l'occasione per condividere questo fantastico articolo scritto pochi giorni fa con informazioni relative a questo argomento: La guida all'implementazione di platform 2D . E anche questo: Sonic Jumping .
David Gouveia,

2
L'articolo descrive un modo diverso di fare il salto variabile rispetto a quello che hai fatto nella tua risposta. Richiede di sopprimere la gravità o di continuare ad aggiungere l'impulso mentre si tiene premuto il pulsante. Di solito faccio quello che dice David nella sua risposta, ma c'è qualche idea sui metodi dell'articolo?
Jeff,

@Jeff Anche quello ha attirato la mia attenzione, ed è esattamente il motivo per cui ho detto che ci sono molti modi per implementarlo. Il primo articolo descrive due modi aggiuntivi per gestire lo stesso problema, mentre il modo in cui ho descritto si basa sul secondo articolo. Non so come si confrontino tra loro, anche se nessuno di loro è abbastanza facile da implementare. Alla fine, ho scelto questo metodo perché era più facile da spiegare e non richiedevo l'aggiunta di un timer o la gestione di più impulsi di grandezza decrescente.
David Gouveia,

La risposta può variare in base al gioco specifico e al numero di animazioni che vuoi fare. Metroid usa un salto di velocità costante: / discesa, ma lo maschera con un lavoro di animazione di alta qualità per renderlo liscio e "curvo" allo zenit. Molti altri platform usano salti a velocità variabile, che richiedono più lavoro per farlo funzionare bene.
Sean Middleditch,

1
questo è stato molto utile, 5 anni dopo :) e questa cosa del violino è molto bella - dovrei imparare JS!
Fluidità,

1

Come in fisica. Solo nel momento in cui premi jump keye il personaggio è a terra aggiungi velocità ascendente (si chiama impulso), ma fai cadere il personaggio per gravità tutto il tempo.

Se non vuoi che il personaggio salti ogni volta che colpisce il terreno - perché stai tenendo jump key- aggiungi la jump key is being pressedvariabile che cancelli dopo jump keyviene rilasciata e impostata dopo. pseudocodice:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Se avessi usato la tua strada:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Come donkey.ycambierà dipende dalla tua immaginazione. La velocità dovrebbe ridursi più in alto l'asino è nell'aria per farlo sembrare buono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.