Il vero trucco con questo è la scienza a livello di scuola superiore; che si dovrebbe aver fatto. Nel caso in cui non avessi effettuato una rapida ricerca su Google, ti avvieremo . Per spiegare come evitare la mentalità "da principiante", prendere l' esempio del lander lunare .
Dopo aver letto che [change in position] = [velocity] * [time passed]
diventa chiaro che sarebbe necessario tenere traccia di quelle variabili:
float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.
In seguito, applichi semplicemente la velocità alla posizione di ciascun fotogramma:
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;
Ora vorremmo modificare la velocità di ciascun fotogramma in modo da poter aggiungere gravità. Secondo la stessa identica fonte [change in velocity] = [acceleration] * [time passed]
. Pertanto possiamo applicare lo stesso principio esatto:
const float gravity = 9.8f; // The gravity of the earth.
// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;
Ora hai bisogno di un modo per il giocatore di controllare il suo veicolo spaziale. Leggendo di più sulla fisica di base imparerai che il movimento è il risultato della forza - non riesco a trovare una fonte ma [change in acceleration] = ([force] / [mass]) * time
(per quanto mi ricordo). Quindi, quando il giocatore preme un tasto, devi semplicemente impostare le variabili fx
e fy
su qualcosa e applicare l'equazione durante l'aggiornamento.
Alla fine devi pensare alla fisica attorno agli oggetti nel tuo gioco - e invece di cercare di farli muovere come pensi, piuttosto cerca l'equazione .
Nota per il futuro: ricorda che questo non è sicuramente il modo migliore per fare fisica (questo si chiama Euler Integration e può portare ad alcuni scenari strani a frame rate bassi) - devi esaminare altri modi di fare le cose (l'articolo ha un bella scrittura anche sulle basi nude). Tuttavia, continua con Euler Integration per ora, poiché significa che stai cercando di imparare una cosa in meno.
Quali giochi ti insegnerebbero a pensare nella mentalità corretta?
Come testeresti di aver fatto le cose correttamente e con la mentalità corretta? Inserisci un Sleep(10 milliseconds)
nel tuo loop di gioco e tutto dovrebbe ancora muoversi e reagire allo stesso modo dell'intero framerate.
Infine, tieni lontano dal 3D (e imponi quaternioni e matrici) fino a quando non avrai una buona esperienza con il funzionamento dei giochi 2D. Mi azzarderei a dire che molti sviluppatori di giochi non sanno davvero come funzionano i Quaternioni o le Matrici - ma semplicemente sanno come usarli - affrontarli molto più tardi (o mai, i giochi 2D sono molto divertenti e possono essere piuttosto riuscito). Non hai davvero bisogno di conoscere l'algebra lineare e così via per farlo al livello base (ma aiuta davvero, quindi vai ad alcune lezioni notturne se puoi).
Bonus finale: una cosa che il mio insegnante d'arte mi ha sempre detto è "non disegnare ciò che pensi di vedere, disegna ciò che vedi". La stessa cosa vale qui "non modellare ciò che pensi che accada ( object.position++
), modellare ciò che accade (` object.position + = velocità * tempo) "- almeno a limiti ragionevoli (non stai modellando un sistema perfettamente preciso, ma fai qualcosa che è una buona immitazione).