Écriture du moteur de jeu à partir de zéro avec OpenGL [fermé]

15

Je veux commencer à écrire mon moteur de jeu à partir de zéro à des fins d'apprentissage, quelles sont les conditions préalables et comment le faire, quels langages de programmation et les choses que vous me recommandez? De plus, si vous avez de bons articles et des livres à ce sujet, ce sera formidable. Merci d'avance!

Mes langages et outils de programmation sont:

  • C / C ++ est-il bon d'utiliser uniquement du C?
  • Python
  • OpenGL
  • Git
  • GDB

Ce que je veux en apprendre:

  • Moteur de jeu principal
  • Rendu / Graphiques
  • Jeu / Règles
  • Entrée (clavier / souris / contrôleurs, etc.)

Dans le rendu / graphisme:

  • 3D
  • Ombres
  • Éclairage
  • Texturation
Wazery
la source
Deux points: cette question, telle qu'elle est, est trop large. Quelles fonctionnalités souhaitez-vous, quelle (s) plateforme (s) souhaitez-vous prendre en charge, quels paradigmes souhaitez-vous explorer, quelle responsabilité vous voulez mettre dans un langage de script (le cas échéant), et toute une série d'autres choses que je '' Je ne vais pas déranger continuer la liste.
Tetrad
8
Deux: Il y a une sagesse courante selon laquelle d'autres personnes vont dire que vous ne devriez pas vous concentrer sur la fabrication d'un moteur sans jeu. Un moteur sans jeu signifie que vous ne pouvez pas prouver que votre moteur est utile . Les bons moteurs obligent les gens à manger leur propre nourriture pour chiens, pour ainsi dire. Un blog communément lié à plus de cet argument est ici: scientificninja.com/blog/write-games-not-engines
Tetrad
2
^ Non seulement cela, mais l'écriture d'un moteur sans jeu pour motiver les exigences de fonctionnalités entraîne un fluage des fonctionnalités et une mauvaise conception de l'API. Jusqu'à ce que vous sachiez ce dont vous avez besoin, laissé entendre par les exigences du jeu, vous ne pouvez pas mettre des choses utiles dans votre moteur. De même, si vous n'avez pas eu à utiliser le moteur pour programmer, vous pourriez trouver certaines de vos décisions vraiment maladroites.
ChrisE
1
Je ne vois pas l'intérêt de vos annonces. Le fait que vous connaissiez C / C ++ et Python nous aide, mais pourquoi indiquer que vous pouvez utiliser le contrôle de version et un débogueur?
The Communist Duck
2
@TheCommunistDuck: Hé, c'est mieux que certains développeurs. :)
ChrisE

Réponses:

11

Vous pouvez écrire un moteur de jeu dans pratiquement n'importe quelle langue en utilisant pratiquement toutes les méthodes de rendu. Vous pouvez écrire un moteur de jeu en bash en utilisant la sortie console par exemple.

Donc, je pense qu'il serait préférable de définir exactement ce que vous voulez apprendre en écrivant votre propre moteur. Il y a beaucoup de "domaines" dans le développement de jeux.

  • Moteur de jeu principal

  • Rendu / Graphiques

  • AI

  • La mise en réseau

  • Jeu / Règles

  • Du son

  • Entrée (clavier / souris / contrôleurs, etc.)

etc. De là, vous pouvez même avoir des sous-thèmes. Dans le rendu / graphiques

  • 2D ou 3D?

  • La modélisation

  • Ombres

  • Éclairage

  • Texturation

  • GUI / Huds / Interfaces.

  • etc

Un seul de ces sous-sous-sujets pourrait consommer de nombreuses heures (ou années!) D'étude!

Donc, définissez d'abord ce que vous voulez apprendre. Commencez simplement.

Utilisez la langue avec laquelle vous êtes à l'aise, bien que certaines soient mieux adaptées à certaines tâches. Par exemple, le moteur principal et le rendu sont probablement mieux faits avec un langage de niveau "inférieur" comme C / C ++ (si vous avez besoin de performances); mais quelque chose comme l'IA ou les règles du jeu pourrait être mieux fait dans un langage de niveau supérieur. Rien ne dit que vous ne pouvez pas mélanger et assortir. Vous pouvez écrire votre moteur en C ++, votre rendu en C (car cela fonctionne bien avec OpenGL), puis utiliser LUA pour écrire vos règles de jeu, etc.

En ce qui concerne l'exemple, il existe un moteur de jeu appelé Slick2D. Il est écrit en Java et est open source. C'est un exemple d'un simple moteur 2D écrit et très bien conçu. Vous pouvez en apprendre des concepts de base, comme les boucles de jeu, la gestion des états de jeu, etc.

Si vous êtes à l'aise avec C / C ++; Je suggère de jeter un œil à SDL / OpenGL. Il gère une partie de l'entretien ménager comme l'entrée, le son, la création de fenêtres, etc. et peut se concentrer sur d'autres choses.

user697111
la source
4
Ahh les jours où j'apprenais le C ++ et les jeux de console étaient vraiment amusants ... [crée un nouveau projet de console ...]
Nick Bedford
J'ai mis à jour ma question, j'espère me donner beaucoup de ressources géniales :)
Wazery
4

SDL + OpenGL est un excellent choix pour démarrer un moteur de jeu personnalisé.

J'utilise personnellement une version C-ish de C ++ parce que j'ai découvert que cela fonctionne le mieux pour moi. J'entends par là que je n'utilise aucune exception. Il y a deux raisons à cela: d'abord et avant tout, les exceptions nécessitent un code d'exception tout au long du chemin qui, avec OpenGL et SDL, n'est pas exactement facile à réaliser. Plus important encore, de cette façon, il est très facile d'exposer des objets C ++ sur le C ABI, ce qui est extrêmement utile si vous essayez d'intégrer un langage de script dans le mix.

Je suis dans un bateau similaire à vous et j'ai écrit certaines de mes aventures avec SDL et OpenGL dans un blog ( immersedcode.org ) au cas où quelqu'un d'autre serait intéressé.

Pour l'architecture générale, j'ai deux suggestions: si vous voulez un moteur 3D, consultez le livre "Game Engine Architecture" de Jason Lander. Si tout ce que vous voulez est 2D, gardez la conception aussi simple que possible et laissez-vous inspirer par XNA ou d'autres projets.

Enfin: n'appelez pas OpenGL partout. Rendez-vous service et isolez-le en quelques endroits afin d'avoir la possibilité de basculer entre le bureau OpenGL / OpenGL ES ou même DirectX ultérieurement si vous le souhaitez.

Armin Ronacher
la source
0

N'utilisez pas C sauf si un détail d'implémentation vous y tient sous la menace d'une arme. Sinon, utilisez C ++, car c'est un langage beaucoup plus performant et vous pouvez toujours choisir de ne pas utiliser ces fonctionnalités plus tard. Personnellement, je n'ai rien pour / contre Python, je ne l'ai jamais utilisé.

Je ne recommanderais pas OpenGL contre DirectX parce que DX a une approche orientée objet moderne, qui est beaucoup plus propre et plus compréhensible / moins sujette aux erreurs. L'interface offerte par OpenGL est extrêmement pauvre en comparaison.

La dernière chose que j'ai, c'est que j'ai entendu de nombreuses personnes en qui j'ai confiance que GDB craint complètement, et le débogueur Visual Studio est de loin le meilleur. Ce n'est pas mon expérience personnelle, alors prenez-la avec un peu de sel.

DeadMG
la source
4
"OpenGL contre DX". Le fait que DirectX soit plus OO n'est pas vraiment important. Pour être plus compréhensible ... OpenGL (avant 3) expose une interface assez simple, et qui est facile à analyser car tout cela dans une méthodologie impérative de style C. "Réglez la matrice de projection sur ceci. Triangles de départ. Voici un vert. Voici un vert. Voici un vert. Triangles de fin." La série 1.x d'API OpenGL est bonne pour se mouiller les pieds dans la programmation graphique, et combinée avec SDL (ou même GLUT ... urg) vous permet d'obtenir une application dans 30 à 50 lignes de code.
ChrisE
2
@ChrisE: Bien sûr. Il y a quelque chose qui s'appelle extern "C", et son utilisation appropriée rend l'écriture d'une interface C plutôt triviale, en particulier pour Python, où un convertisseur existe dans Boost qui facilite la liaison. Et les fonctionnalités du langage C ++? Ils sont super . Une plus grande utilisation des fonctionnalités du langage C ++ augmente la fiabilité d'un projet et la facilité de codage massif pour un compromis de performances très mineur très acceptable. Les fonctionnalités du langage de C sont pathétiques en comparaison. Par exemple, l'utilisation correcte d'un compilateur C ++ moderne ne garantit aucune fuite de mémoire. Faites cela en C.
DeadMG
1
@DeadMG: Si la POO était vraiment un gros problème, la réponse ici est Java ou C #, et non C ++. La chose avec laquelle je ne suis pas d'accord, c'est que l'utilisation des fonctionnalités C ++ ne rend pas par magie votre code meilleur, plus rapide ou même plus fiable; il faut savoir utiliser ces fonctionnalités, et apprendre un langage en plus de concevoir un moteur est-il vraiment une bonne utilisation de son temps? Non. Pas pour quelqu'un qui fait ça pour la première fois. Vous pouvez apprendre tout C en un jour ou deux, confortablement, et ne jamais vous demander ce que fait le langage. OpenGL, l'appel de base utile en tout cas, offre la même transparence.
ChrisE
2
La POO n'est pas si grave, pas dans les moteurs de jeu haute performance. Bien sûr, c'est utile, mais c'est souvent la mauvaise abstraction. Il est généralement préférable d'avoir un bon flux de données, une localisation et une disposition de la mémoire de. Alors que de nombreuses équipes utilisent C ++, elles n'utilisent pas la plupart des fonctionnalités C ++. Aucune exception, aussi peu de virtuels que possible, pas de RTTI, pas de STL / Boost. Pourquoi? Exécution prévisible et rapide et petit code sur plusieurs plateformes. Je code en C et il n'y a que deux domaines dans lesquels je préférerais utiliser C ++: les verrous de portée et les tableaux génériques. Ne vaut pas la peine IMHO.
nul
4
Sur GL vs D3D: Il n'y a pas de pile matricielle dans le cœur GL3 / 4, et pas de pile attrib. GL et D3D sont mappés à la même architecture matérielle, mais GL se sent beaucoup plus mince. Bien sûr, la machine d'état GL est un peu compliquée, tout comme le matériel réel;) L'apprentissage de l'un d'eux est très bien, et tant que vous comprenez ce qui se passe réellement, vous pouvez facilement passer à l'autre (ou à une API de console).
nul