2011-11-24 7 views
9



gravità con tempo di trasmissione, accelerazione e velocità guadagnando

Sto cercando di compiere una gravità, in cui è incluso tempo di trasmissione, e anche l'accelerazione.
Ho provato ad utilizzare al solito gravità, che sembra qualcosa di simile:

velocity += gravity * dt; 
position += velocity * dt; 


questo probabilmente funzionerà abbastanza buono per un normale gioco platform, ma sto cercando di fare un gioco ispirato a "Il gioco elicottero ", dove devi navigare attraverso un tunnel, senza toccare i muri.

quello che voglio fare in modo diverso, è che voglio essere in grado di risparmiare sulla velocità verso il basso, che verrà utilizzato durante il ritorno, quindi avrò un po 'di accelerazione all'inizio.
Voglio anche un po 'di tempo di trasmissione, quindi quando colpisci la parte superiore non ti costringerà a scendere così velocemente come sarebbe, se avessi usato la gravità dal campione di codice.

Questa immagine illustra la curva che vorrei avere:
Link to curve

Si prega di notare che l'intero controllo è fatto da un tasto, così per esempio si volerebbe in alto se si tiene premuto spazio e si tufferà se lo si rilascia.
Il personaggio non si sposta mai verso sinistra o verso destra, poiché avrà una posizione X statica sullo schermo, quindi i vettori non possono essere utilizzati.

Ho passato ore a cercare di farlo funzionare, ma senza successo. Ho anche provato a cercare su internet, ma senza fortuna.

Il gioco "Whale Trails" ha la gravità che desidero.
Ecco un link per un video del gioco: http://www.youtube.com/watch?v=5OQ0OWcuDJs

Non sono un ragazzo di fisica, quindi sarebbe bello se potessi dare un esempio del codice attuale
Spero che qualcuno possa aiutarmi a capire questo su.

+0

una domanda cattiva, ma che mostra un codice che illustra ciò che hai provato - e una descrizione del * come * non funziona - vi aiutano a ottenere risposte :) –

+0

Anche io non sono un ragazzo di fisica, ma credo che sia necessario approfondire un po 'la fisica per ottenere ciò che si desidera. Quindi penso che la fisica degli aerei dovrebbe andare nella direzione generale. Forse [questo] (http://www.ucmp.berkeley.edu/vertebrates/flight/physics.html) ti aiuta un po 'a trovare le parole corrette per cercare soluzioni al tuo problema. Anche nel nuovissimo Batman - Arkham City Game, hai un meccanismo simile, forse vale la pena di provarlo. – dowhilefor

+0

@djacobson era per lo più solo codice casuale, dato che non avevo idea di dove andare, quindi non andrebbe bene :) – Basic

risposta

4

La gravità è la forza che tira verso il basso gli oggetti. Il tuo giocatore è la forza che tira su gli oggetti. Di conseguenza il codice deve essere:

if(keyPressed) { 
    velocity += POWER_OF_PLAYER; 
} 

velocity += G; 
position += velocity; 

Questo è sufficiente per creare una curva come te illustrato. Ovviamente POWER_OF_PLAYER deve essere di un segno diverso e il valore assoluto deve essere maggiore per fare in modo che funzioni.

G = -9.81 
POWER_OF_PLAYER = 20 

Risparmiare energia è quindi un semplice controllo.

if(keyPressed) { 
    if(powerSaved > 0) { 
    velocity += POWER_OF_PLAYER; 
    powerSaved -= SOMETHING; 
    } 
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) { 
    powerSaved += SOMETHING; 
} 

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER dovrebbe essere qualcosa di meno o uguale a 0.

P.S. Ho assunto che il tuo asse Y inizi a terra e spari verso il cielo. I segni messi di conseguenza.

+0

Sono abbastanza sicuro di averlo provato, ma ci provo con il tuo codice e vedere se funziona :) – Basic

+0

Questa è la formula standard, la fisica del gioco è diversa. –

+0

La tua matematica è sbagliata. La gravità è una forza, cioè ha un'accelerazione di massa * delle unità, mentre la velocità ha unità di distanza nel tempo, quindi l'impostazione di 'velocità + = GRAVITÀ 'è fondamentalmente scorretta. – rcollyer

0

Sembra che la velocità del pesce sia costante.

provare quanto segue:

velocity è fisso e non dovrebbe cambiare (a meno che il pesce mangia un power-up velocità). angle = 0 equivale al volo livellato.

angle -= gravity * dt; 
if (angle < - Math.PI/2) { 
    angle = Math.PI/2; 
} 
if (keyPressed) { 
    angle += power * dt; 
} 

if (angle < - Math.PI/2) { 
    // Stop the player from doing a looping 
    angle = - Math.PI/2; 
} 
if (angle > Math.PI/2) { 
    // Stop the player from doing an inverted looping 
    angle = Math.PI/2; 
} 
// Move the fish (vertical component of velocity) 
position += velocity * dt * Math.sin(angle); 
// Move the background (horizontal component of velocity) 
background_position -= velocity * dt * Math.sin(angle); 
+0

Quando si utilizza il proprio codice, il lettore sta andando in modo retto, a meno che non venga premuto il tasto, che si abbasserà leggermente. – Basic

+0

Prova a rendere le modifiche nell'angolo più piccolo - 'angolo - = gravità * dt/100.0;' e 'angolo + = potenza * dt/100.0;' –

0

Sembra che incorpora 'ascensore' che si basa sulla velocità orizzontale e hanno il grilletto premere un movimento 'noseup' funzionerebbe sufficientemente bene.

Quindi lift sarebbe qualche costante k moltiplicato per la velocità orizzontale Vx e la velocità verticale Vy sarebbe la differenza di gravity e lift volte il cambiamento nel tempo dt

lift = k * Vx 
Vy += (lift - gravity) * dt 

def noseup 
    k = 0.01 #some small chunk 
    dx = k * Vx 
    dy = k * Vy 
    Vx -= dy 
    Vy += dx 

quando il piano (o altro) nasi in alto riduce sostanzialmente la velocità su un asse mentre aumenta l'altro sull'altro.

probabilmente non sarebbe una cattiva idea di gettare drag lì da qualche parte, così, ora che ci penso, avrebbe dovuto essere dipendente dalla velocità assoluta V = (Vx**2 + Vy**2)**0.5 ... e il peso è una parola migliore di gravità in questo caso (meno confuso, unità saggia) ma funziona credo.

Non esattamente "fisica" ma una stretta approssimazione che dovrebbe funzionare abbastanza bene. Gioca con i valori di k e vedi se riesci a farlo fare ciò che vuoi.

BTW dispiaciuto per il super scadente psuedocodarlo :-P

Non