Oltre i progetti di gioco "principianti"


22

Stavo leggendo questa risposta sul tipo di matematica che uno sviluppatore di giochi dovrebbe conoscere e questa parte mi ha davvero colpito:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

È così che penserei di farlo, quindi immagino che mostri il mio livello di abilità. Almeno per i tipi di giochi 2D a scorrimento laterale in stile arcade che ho realizzato in passato, è tutto ciò di cui avevo bisogno. Questo e un po 'di trigonometria.

In effetti, non ho usato molta algebra lineare né ho mai sentito parlare di quaternioni prima di leggere quel post. È perché questi calcoli non si presentano fino a quando non lavori con il 3D o è perché i miei giochi 2D sono abbastanza semplici che mi sono sbarazzato di implementazioni ingenue.

Domanda di follow-up: se voglio familiarizzare con quel tipo di matematica, che tipo di progetti dovrei intraprendere? IE: scrivere un motore di gioco, lavorare su un gioco 3D, ecc.


1
khanacademy.org è ottimo per l'apprendimento della matematica per principianti e avanzati. Inoltre ci sono risultati! Niente come la teoria dei giochi per ravvivare qualsiasi università noiosa.
Deceleratedcaviar

Risposte:


16

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 fxe fysu 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).


Mi piace la tua idea di inserire un ritardo artificiale per i test. Inoltre, la gravità terrestre è 9,8, non 9,1
Steve

Fai attenzione a "non modellare ciò che pensi accada, modella ciò che accade" a meno che tu non stia scrivendo una simulazione reale. Ridimensionare in base alle necessità per il progetto. A volte "ciò che pensi accada" è una buona risposta per il tuo design.
caos Tecnico

@chaosTechnician a questo livello "cosa pensi che accada" è object.position++. Chiarirò la risposta.
Jonathan Dickinson,

-1 per instead of trying to make them move in the way you would think, rather look up the equation. Si tratta di capire le equazioni, non di cercarle. La cosa più importante è rendere divertente il gioco, e chissà, forse troverai qualche accelerazione variabile che rende la gravità più divertente. Ma sarà molto difficile ragionare su come farlo se non capisci le equazioni.
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft è esattamente quello che gli ho spiegato: non conoscere l'equazione in primo luogo significa che non puoi mai capirlo - e l'unico modo per capirli è usarli in una situazione reale.
Jonathan Dickinson,

3

Penso che parti della risposta a cui hai collegato siano un po 'elitarie nella loro presentazione. Esaltare le virtù della matematica vettoriale, quindi dire che un oggetto ha bisogno di una posizione, una direzione e un'accelerazione è incoerentemente specifico perché si riduce a qualcosa del genere object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime, che, fondamentalmente, non è così diverso object.position.x++. I quaternioni sono uno dei molti modi per rappresentare le rotazioni; Mi piacciono ma non sono essenziali per comprendere le rotazioni 3D. Nonostante ciò che implicheranno molti utenti di Quaternion, non sono il Santo Graal della matematica rotazionale.

I principi dell'algebra lineare sono presenti nel semplice movimento 2D, rotazione, ecc. Ma la matematica è più semplice perché ci sono solo due dimensioni. Ecco un esempio .

Esistono molti modi per apprendere / migliorare la tua conoscenza dell'algebra lineare:

  1. Ho considerato di frequentare un corso di algebra lineare ma il mio corso di studi è già piuttosto pesante, quindi non sono stato in grado di giustificare il lavoro extra.
  2. La mia comprensione dell'algebra lineare è cresciuta molto più significativamente quando ho seguito una serie di lezioni di programmazione per i motori di gioco. Per me, l'uso di vettori, matrici, ecc. È stato (generalmente parlando) più prevalente sul lato motore rispetto a quello di gioco. Ovviamente, questo non vuol dire che non ho usato le matrici nel codice di gioco, ma non le uso tutte le volte che ho nella codifica del motore. YMMV
  3. Ci sono anche molti libri che possono aiutarti a capire la matematica che dovresti conoscere. Mi piace questo libro che ha un capitolo intitolato "3D Math for Games".

Infine, se il design dei tuoi giochi non richiede la matematica complessa, non usarlo. :) Ma, naturalmente, non lasciare che ciò ti impedisca di approfondire la progettazione di un gioco che lo fa.


0

I quaternioni per il 2D sarebbero completamente esagerati, per non parlare del calcolo troppo costoso. La rotazione della bitmap (2D) è gestita implicitamente da molte piattaforme / librerie, perché è così fondamentale per scrivere qualsiasi applicazione, e anche dove non lo è, la rotazione delle bitmap 2D non è altro che un semplice trig. In 3D, le cose diventano notevolmente meno intuitive per l'essere umano medio, a meno che, naturalmente, non sia detto che l'essere umano sia cresciuto scrivendo codice 3D quando avrebbero dovuto uscire in sella alla bicicletta.

L'algebra lineare è applicabile al 2D come al 3D e dovrebbe essere qualcosa con cui hai familiarità anche se hai fatto solo matematica alle superiori. Se hai mai fatto intersezioni di linee o grafici periodici su una linea (integrazione), hai usato l'algebra lineare.

L'apprendimento della matematica 3D di solito inizia con il posizionamento di un oggetto semplice (come un cubo) nello spazio 3D e l'implementazione di una telecamera mobile in grado di visualizzare quell'oggetto da diverse prospettive e tale prospettiva può iniziare ortogonalmente per rendere le cose ancora più semplici. Si tratta di proiettare punti su un piano 3D che rappresenta lo schermo (formula qui , si estenderà questo agli assi x e z oltre a y). Davvero, questo è l'inizio della scrittura di qualsiasi motore 3D, indipendentemente dal tuo livello di esperienza. Flash e Processing.js sono due ottimi modi per prototipare qualcosa del genere facilmente.


0

Hai ragione sul fatto che l'algebra lineare e la matematica più complessa di solito coinvolgono la grafica 3D e lo spazio 3D. Ma c'è ancora più matematica che si può fare nei giochi 2D. La matematica della fisica può diventare piuttosto hardcore, e diventa più complessa se si considera la fisica del corpo molle e la dinamica della B-spline (e ancora in 2D, tenere presente)

Prova a costruire o analizzare una libreria di fisica che coprirà la gestione delle collisioni e la risposta per forme 2D comuni. L'algebra lineare è piuttosto utile per il calcolo dei vettori di traiettoria per le collisioni. Il prodotto punto è abbastanza correlato al cerchio unitario utilizzato nella trigonometria. Tuttavia, la complessità della fisica del corpo rigido aumenta esponenzialmente quando viene applicata in 3D.

La grafica 3D offre una maggiore comprensione di calcoli con matrici, quaternioni, algebra lineare e alcuni calcoli applicati. La prima cosa che probabilmente raccoglierai è usare le matrici per spostare e manipolare oggetti nello spazio 3D.


0

Se stai scrivendo giochi 2D, probabilmente stai già utilizzando l'algebra lineare .. semplicemente non lo sai! Imparare formalmente almeno le basi dei vettori è abbastanza facile, ma fa molto per semplificare il pensiero su movimenti altrimenti complessi.

Ad esempio, qui riceviamo molte domande su quali equazioni usare per simulare il movimento curvo, come ad esempio per un colpo di palla di cannone da un cannone o un missile homing. Ma se capisci i vettori, l'unica "equazione" di cui hai bisogno è quella di aggiungere due vettori insieme. Non solo, ma aggiungere cose come il trascinamento aereo o l'attrito diventa incredibilmente semplice: basta calcolare il vettore-trascinamento e aggiungerlo alla velocità. Presto!

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.