Scrivere Game Engine da zero con OpenGL [chiuso]


15

Voglio iniziare a scrivere il mio motore di gioco da zero a scopo di apprendimento, quali sono i prerequisiti e come farlo, quali linguaggi di programmazione e cose che mi consigliate? Anche se hai buoni articoli e libri su questo sarà fantastico. Grazie in anticipo!

I miei linguaggi e strumenti di programmazione sono:

  • C / C ++ è bene usare solo C?
  • Pitone
  • OpenGL
  • Idiota
  • GDB

Cosa voglio imparare da esso:

  • Core Game Engine
  • Rendering / Grafica
  • Gioco / Regole
  • Input (tastiera / mouse / controller, ecc.)

In Rendering / Grafica:

  • 3D
  • Ombreggiatura
  • Illuminazione
  • texturing

Due punti: questa domanda, così com'è, è troppo ampia. Quali funzionalità vuoi, quali piattaforme vuoi supportare, quali paradigmi vuoi esplorare, quanta responsabilità vuoi mettere in un linguaggio di script (se presente) e tutta una serie di altre cose che io ' non mi preoccuperò di continuare a elencare.
Tetrad,

8
Due: c'è una comune saggezza prevalente sul fatto che altre persone emetteranno che non dovresti concentrarti sulla costruzione di un motore senza un gioco. Un motore senza gioco significa che non puoi provare che il tuo motore sia utile . I buoni motori richiedono alle persone di mangiare il proprio cibo per cani, per così dire. Un blog comunemente collegato a questo argomento viene approfondito: scientificninja.com/blog/write-games-not-engines
Tetrad

2
^ Non solo, ma scrivere un motore senza un gioco per motivare i requisiti delle funzionalità si traduce in creep funzionalità e cattiva progettazione delle API. Fino a quando non sai di cosa hai bisogno, suggerito dai requisiti di gioco, potresti non mettere cose utili nel tuo motore. Allo stesso modo, se non hai dovuto usare il motore per programmare, potresti trovare alcune delle tue decisioni davvero ingombranti.
ChrisE,

1
Non vedo il punto nelle tue inserzioni. Il fatto che tu conosca C / C ++ e Python ci aiuta, ma perché elencare che puoi usare il controllo versione e un debugger?
Il comunista Duck

2
@TheCommunistDuck: Ehi, è meglio di alcuni sviluppatori. :)
ChrisE,

Risposte:


11

Puoi scrivere un motore di gioco praticamente in qualsiasi lingua usando praticamente qualsiasi metodo di rendering. Potresti scrivere un motore di gioco in bash usando ad esempio l'output della console.

Quindi, penso che sarebbe meglio definire esattamente cosa vuoi imparare scrivendo il tuo motore. Ci sono molti "campi" nello sviluppo del gioco.

  • Core Game Engine

  • Rendering / Grafica

  • AI

  • Networking

  • Gioco / Regole

  • Suono

  • Input (tastiera / mouse / controller, ecc.)

ecc. Da lì puoi anche avere argomenti secondari. In Rendering / Grafica

  • 2d o 3d?

  • modellismo

  • Ombreggiatura

  • Illuminazione

  • texturing

  • GUI / Huds / interfacce.

  • ecc. ecc

Solo uno di questi sotto-argomenti potrebbe richiedere molte ore (o anni!) Di studio!

Quindi, prima di tutto definisci ciò che vuoi imparare. Inizia semplice.

Usa la lingua che preferisci, anche se alcuni sono più adatti per determinate attività. Ad esempio, il motore principale e il rendering sono probabilmente fatti meglio con un linguaggio di livello "inferiore" come C / C ++ (se hai bisogno di prestazioni); ma qualcosa come l'intelligenza artificiale o le regole del gioco potrebbe essere fatto meglio in un linguaggio di livello superiore. Nulla dice che non puoi mescolare e abbinare. Potresti scrivere il tuo motore in C ++, il tuo rendering in C (dal momento che funziona bene con OpenGL) e quindi usare LUA per lo scripting delle regole del gioco, ecc.

Per esempio, esiste un motore di gioco chiamato Slick2D. È scritto in Java ed è open source. È un esempio di un semplice motore 2d scritto e progettato davvero bene. Puoi imparare concetti di base da ciò, come loop di gioco, gestione degli stati di gioco, ecc.

Se sei a tuo agio con C / C ++; Suggerirei di dare un'occhiata a SDL / OpenGL. Gestisce alcune delle pulizie come input, suono, creazione di finestre, ecc. E può concentrarsi su altre cose.


4
Ahh, i giorni in cui stavo imparando il C ++ e i giochi per console erano incredibilmente divertenti ... [crea un nuovo progetto per console ...]
Nick Bedford,

Ho aggiornato la mia domanda, spero di darmi molte risorse fantastiche :)
Wazery,

4

SDL + OpenGL è una scelta eccellente per avviare un motore di gioco personalizzato.

Personalmente uso una versione C-ish di C ++ perché ho scoperto che funziona meglio per me. Con questo voglio dire che non uso alcuna eccezione. Ci sono due ragioni per questo: prima di tutto le eccezioni richiedono un codice sicuro d'eccezione che con OpenGL e SDL non è esattamente facile da raggiungere. Ancora più importante, tuttavia, in questo modo è molto semplice esporre oggetti C ++ sull'ABI C, il che è incredibilmente utile se si tenta di inserire un linguaggio di scripting nel mix.

Sono su una barca simile a te e ho scritto alcune delle mie avventure con SDL e OpenGL in un blog ( immersedcode.org ) nel caso in cui qualcun altro fosse interessato.

Per l'architettura generale ho due suggerimenti: se vuoi un motore 3D dai un'occhiata al libro "Game Engine Architecture" di Jason Lander. Se tutto ciò che desideri è 2D, mantieni il design il più semplice possibile e lasciati ispirare da XNA o altri progetti.

Infine: non chiamare OpenGL dappertutto. Fatti un favore e isolalo in un paio di posti in modo da avere la possibilità di passare da desktop OpenGL / OpenGL ES o anche DirectX in un secondo momento, se lo desideri.


0

Non usare C a meno che un dettaglio di implementazione non ti tenga sotto controllo. Altrimenti, usa C ++, perché è un linguaggio decisamente più capace e puoi sempre scegliere di non usare quelle funzionalità in un secondo momento. Personalmente non ho nulla a favore / contro Python, non l'ho mai usato.

Non consiglierei OpenGL contro DirectX perché DX ha un moderno approccio orientato agli oggetti, che è molto più pulito e più comprensibile / meno soggetto a errori. L'interfaccia offerta da OpenGL è estremamente scarsa in confronto.

L'ultima cosa che ho è che ho sentito da molte persone che mi fido del fatto che GDB faccia schifo, e che il debugger di Visual Studio sia di gran lunga il migliore. Questa non è la mia esperienza personale, quindi prendila con un po 'di sale.


4
"OpenGL vs. DX". Il fatto che DirectX sia più OO non è molto importante. Per quanto sia più comprensibile ... OpenGL (prima del 3) espone un'interfaccia abbastanza semplice, e una che è facile da scansionare in quanto è tutto in una metodologia imperativa in stile C. "Imposta la matrice di proiezione su questo. Inizia triangoli. Ecco un vert. Ecco un vert. Ecco un vert. Triangoli finali." La serie 1.x di API OpenGL è utile per bagnare i piedi nella programmazione grafica e, combinata con SDL (o persino GLUT ... urg), consente di ottenere un'app in 30-50 righe di codice.
ChrisE,

2
@ChrisE: Sicuro. C'è qualcosa che si chiama extern "C", e il suo uso appropriato rende la scrittura di un'interfaccia C piuttosto banale, specialmente per Python, dove esiste un convertitore all'interno di Boost che lo rende semplice. Che ne dici delle funzionalità del linguaggio C ++? Sono fantastici . Un maggiore uso delle funzionalità del linguaggio C ++ aumenta l'affidabilità di un progetto e la facilità di codifica massiccia per un compromesso di prestazioni molto più che accettabile. Le caratteristiche del linguaggio di C sono patetiche in confronto. Ad esempio, l'uso corretto di un moderno compilatore C ++ può garantire l' assenza di perdite di memoria. Fallo in C.
DeadMG

1
@DeadMG: Se OOP era davvero un grosso problema, la risposta qui è Java o C #, e non C ++. La cosa con cui non sono d'accordo è che l'uso delle funzionalità C ++ non rende magicamente il tuo codice migliore, più veloce o persino più affidabile; devi sapere come usare queste funzionalità e imparare una lingua oltre a progettare un motore è davvero un buon uso del tempo? No. Non per qualcuno che lo fa per la prima volta. Puoi imparare tutta la C in un giorno o due, comodamente, e non chiederti mai che cosa sta facendo la lingua. OpenGL, l'utile chiamata di base impostata in ogni caso, offre la stessa trasparenza.
ChrisE,

2
OOP non è un grosso problema, non nei motori di gioco ad alte prestazioni. Certo, è utile, ma spesso è l'astrazione sbagliata. Avere un buon flusso di dati, localizzazione e layout di memoria di solito è meglio. Mentre molti team utilizzano il C ++, non usano la maggior parte delle funzionalità del C ++. Nessuna eccezione, il minor numero possibile di virtual, nessun RTTI, nessun STL / Boost. Perché? Esecuzione prevedibile e veloce e codice ridotto su più piattaforme. Codifico in C e ci sono solo due aree in cui preferirei usare C ++: blocchi con ambito e array generici. Non vale la seccatura IMHO.
Vuoto

4
Su GL vs. D3D: non esiste uno stack matrice nel core GL3 / 4 e nessuno stack attrib. Sia GL che D3D sono associati alla stessa architettura hardware, ma GL è molto più sottile. Sicuramente la macchina a stati GL è un po 'una seccatura, ma lo è anche l'hardware reale;) Imparare qualcuno di loro va bene, e fino a quando capisci cosa sta realmente accadendo puoi passare facilmente all'altro (o a un'API della console).
Vuoto
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.