Ça fait maintenant 8 mois que je n’ai pas écrit d’articles sur ce blog. La raison principale est que je suis actuellement étudiant à la formation Gamagora. Plus précisément en Master 2 CIM Prog And Dev et que j’y consacre tout mon temps.

C’est une formation dédiée aux développement de jeux vidéo. Comme toute formation elle a des points forts et des points faibles mais je dois avouer que dans mon cas, je me sens comme un poisson dans l’eau. Tout ce que je faisais avant pendant mon temps libre, je le fais désormais au quotidien avec des gens passionnés et talentueux qui comme moi cherchent à se faire une place dans un monde difficile d’accès.

Depuis début février les cours ont cessé et les étudiants travaillent désormais sur des gros projets jusqu’à mi-mai. Le projet de mon groupe est visible à cette adresse: http://shadowdiver-game.com/. Shadow Diver est un jeu d’action aventure avec un personnage qui fait du skydiving dans un canyon sur Mars en 2190. Le jeu est développé avec la technologie Unreal Development Kit.

Par ailleurs je vous invite aussi à aller découvrir les deux autres projets Gamagora de cette année à savoir Rush For Office et Jia. Ces deux projets sont développés avec la technologie Unity. Pour terminer cet article, voici une liste de screenshots de différents travaux que j’ai réalisés au cours des mes TP cette année (algorithmes en C++/OpenGL dans la plupart des cas):

Lancer de rayons

Colisé érodé (surfaces implicites)

Croissance (surfaces implicites)

Sphères creusés (surfaces implicites)

Open Sky, jeu Flash réalisé en 1 mois

Salle de cours (Utilisation du moteur Ogre3D)

Shader de rendu différé en GLSL

J’ai terminé mon petit jeu d’échec et par la même occasion mon petit tour de découverte de Direct X 9. L’IA est loin d’être parfaite mais elle se défend. La représentation de mon échiquier est basé sur l’utilisation du filtre 0X88 (tableau de 120 cases). Pour les curieux, voilà un bon lien sur la représentation d’un échiquier:

http://www.cis.uab.edu/info/faculty/hyatt/boardrep.html.

Mon IA, elle, est basé sur un algorithme alpha-bêta amélioré. Le niveau 4 du jeu correspond à une profondeur de 6 dans l’arbre de recherche, le nombre de coups évalués par l’ordinateur  à ce niveau peut dépasser les 6 millions (en d’autres termes l’ordinateur passe 6 millions de fois dans l’algorithme pour jouer un coup). La rapidité dépend évidemment de la puissance de l’ordinateur. Sur mon ordinateur (2007 – Win XP – Intel Core 2 Duo E4500 @2.20GHz) une évaluation de 6 millions de coups prend environ 30 secondes. Ma fonction d’évaluation est assez basique et je n’ai pas de bibliothèque d’ouverture ou de fermeture de partie.

Voilà, voilà, si vous n’avez rien compris à ce que j’ai écrit, je vous conseille de programmer votre propre IA :) . Je pourrais encore optimiser l’ensemble mais je souhaite partir sur un outil qui risque de m’être indispensable dans les mois à venir… à savoir l’UDK.

Le jeu ne fonctionne que sous Windows (le point faible de Direct X) et nécessite la version 9 de direct X au minimum ainsi que la version 2.0 pour l’HLSL.

Le lien vers le jeu: 3D Chess Game.

Et quelques screenshots pour finir:

Menu

Menu

Skybox neige

Skybox neige

Une autre skybox

Une autre skybox

Le système de sélection

Le système de sélection

Quelques screenshots de l’avancée graphique de mon jeu d’échec :) . Je test quelques techniques parmi lesquelles la notion de lumière en utilisant la transmittance, la réflexion simple sur une texture (l’échiquier), ou encore la bonne vieille skybox avec réflexion sur les pièces. Je pense que je ne vais pas tarder à développer l’interface graphique et enfin l’IA (sans doute basé sur un algo alpha-béta pour commencer).

Lumière au centre de l'échiquier

Lumière au centre de l'échiquier

L'effet de transmittance avec une couleur rouge

L'effet de transmittance avec une couleur rouge

L'effet de transmittance avec une couleur bleu

L'effet de transmittance avec une couleur bleu

Réflexion des pièces sur l'échiquier

Réflexion des pièces sur l'échiquier

Utilisation d'une skybox

Utilisation d'une skybox

Réflexion de la skybox sur les pièces

Réflexion de la skybox sur les pièces

Je travaille actuellement sur un prototype de jeu d’échec en 3D afin de découvrir les capacités de DirectX 9. Les fonctionnalités de l’API sont relativement proche d’OpenGL, cependant je trouve Direct3D beaucoup plus simple à manipuler. Le système d’objet COM et le fait de ne pas avoir un énorme paquet d’extensions et de fonctions obsolètes simplifie le code par rapport à OpenGL. D’autre part DirectX est constitué de plusieurs api (Direct3D, DirectInput, etc.) qui facilitent la tâche du programmeur. Beaucoup de fonctionnalités sont déjà présentes dans le framework comme par exemple la possibilité d’écrire du texte rapidement.

Toutefois il m’est arrivé de regretter les vieilles méthodes du pipeline fixe d’OpenGL dans certains cas. C’est toujours pratique un « glVertex » quand on veut afficher un élément à l’écran pour débugger rapidement par exemple. Sous direct3D, on n’a pas le choix, on doit instancier un vertex buffer.

J’ai fait le tour de DirectX 9, en revanche j’ai encore beaucoup à apprendre avec les langages HLSL et GLSL. Je pense implémenter plusieurs rendu avec différents shaders pour mon jeu d’échec. Direct3D possède une classe spéciale (ID3DXEffect) très pratique pour utiliser HLSL de manière optimale.  J’ai aussi hâte de programmer la partie I.A. Je ne serais satisfait que lorsque mon ordinateur me battra à chaque partie :) . Sur un autre sujet j’ai commencé à lire le livre « L’art du Game Design » de Jesse Schell, le Game Design étant un sujet qui m’intéresse également. Je donnerais mon avis sur le livre quand je l’aurais lu en entier.

Quelques screenshots du livre et de mon jeu d’échec en plein développement :

L'art du Game Design

L'art du Game Design

Modélisation en mode wireframe

Modélisation en mode wireframe

Le rendu avec un shader de lumière classique (ambient+diffuse+specular)

Le rendu avec un shader de lumière classique (ambient+diffuse+specular)

Deuxième partie de ma scène de nature, toujours développée avec OpenGL en C++ mais sous Visual Studio 2010 cette fois. J’ai fini mon petit tour d’OpenGL et j’ai l’attention de découvrir DirectX (à travers la version 9.0) dans les jours à venir.

Pour la scène j’ai encore emprunté un élément de la nature scène de NVidia, à savoir les herbes. J’ai modifié la heightmap rapidement sous Photoshop, quand à la barque c’est un modèle 3ds. J’ai chargé le modèle avec la librairie ASSIMP et j’ai effectué le rendu graphique à travers un VBO tout en utilisant un shader pour la luminosité. J’ai ajouté un « material » pour donner une couleur marron  à la barque via 3ds max.

Quelques screenshots du résultat final:

Les herbes de la scène nature de NVidia

Les herbes de la scène nature de NVidia


Une barque dans l'eau (modèle 3ds)

Une barque dans l'eau (modèle 3ds)


Vue de la scène sous l'eau

Vue de la scène sous l'eau

Comme je l’avais dit dans mon précédent billet, j’ai commencé à développer une scène de nature « réaliste » en OpenGL/C++.  Le but est d’utiliser des techniques avancées pour rendre la scène le plus réaliste possible.  Ces techniques sont soit des techniques graphiques, généralement associées à la programmation GPU, soit des techniques d’optimisations qui permettent de garder un FPS correct.

Les techniques de rendu graphiques de la scène :

  • Terrain: heightmap avec LOD + gestion de la lumière
  • Ciel: Skydome dynamique avec teinte de l’horizon + nuages + soleil
  • Eau: surface dynamique avec réflexion et réfraction

Les 3 éléments de la scène utilisent des shaders pour le rendu final.

Pour les techniques d’optimisations, j’ai utilisé les VBOs, un FBO (pour l’eau) et je me suis contenté pour le moment du Frustum Culling pour le terrain et l’eau. Pour le ciel et les nuages, j’ai intégré les textures et shaders de la Nature Scene de NVidia, en revanche j’ai dessiné le dôme avec GL_TRIANGLE_STRIP qui semble être le meilleur choix pour dessiner les triangles.

J’ai l’attention de rajouter 3 éléments pour la prochaine partie, à savoir de l’herbe, des arbres, et un petit modèle 3D dans l’eau (une barque, un ponton, ce que je trouverai :) ).

Quelques screenshots du développement de la scène par ordre chronologique:

Triangles du terrain

Triangles du terrain

Axis Aligned Bounding Box du terrain

Axis Aligned Bounding Box du terrain

Eau avec réflexion et réfraction

Eau avec réflexion et réfraction

Triangles du Skydome

Triangles du Skydome

Ciel dynamique avec réflection dans l'eau

Ciel dynamique avec réflection dans l'eau

AABBs et TBNs

AABBs et TBNs

J’ai réussi à modifier les sources du petit FPS proposé dans le livre Beginning OpenGL Game Programming afin de le faire fonctionner sur mon vieux PC avec Windows XP et la SDL. Ça donne un petit jeu de shoot très basique ou il faut envoyer des roquettes sur des pauvres Ogres inoffensifs qui se mettront à fuir dès que le joueur approche trop. C’est vraiment simple comme jeu, après l’idée est là et les bases d’un FPS aussi. Je vais maintenant essayer de créer une scène réaliste avec des techniques de rendu avancé.

Quelques Screenshots:

Boum, un ogre de moins

Boum, un ogre de moins

Une cible facile

Une cible facile

Un tir + un décalage permet de voir les roquettes

Un tir + un décalage permet de voir les roquettes

Qu'il est bon d'être méchant ! Heu...

Qu'il est bon d'être méchant ! Heu...


Rivière pollué

Rivière pollué

Aller hop un petit article sur OpenGL ! :)

Je continue mon apprentissage d’OpenGL en autodidacte avec le langage C++. Je commence à mieux programmer dans ce langage d’ailleurs (utilisation des références dès que possible/templates/inline etc.). Quand à OpenGL, je suis limité à la version 2.1 sur mon PC fixe mais ça ne m’empêche pas de suivre des livres qui parlent de la version 3.1 ou 4.0. Contrairement à mon Tétris 3D, j’utilise uniquement les VBOs et les Shaders (j’ai du mal avec les shaders d’ailleurs, ce n’est pas facile à utiliser :? ) afin de ne pas utiliser les anciennes méthodes obsolètes d’OpenGL.

Le guide de référence OpenGL

Le guide de référence OpenGL

J’ai commencé par lire OpenGL Programming Guide qui est le « guide officiel » sur OpenGL. Ce livre détaille quasiment toutes les fonctionnalités d’OpenGL, c’est en quelque sorte une documentation complète de l’API, ce qui rend le livre assez lourd à lire. Je m’en sers donc comme je le ferais pour un dictionnaire i.e. quand je me pose une question sur un point précis. En tout cas c’est un très bon livre, cependant il ne parle pas de Jeux vidéo. J’ai donc acheté 2 autres livres sur OpenGL, cette fois ci en rapport avec les Jeux vidéo.


Beginning OpenGL Game Programming

Beginning OpenGL Game Programming

Le premier livre s’intitule Beginning OpenGL Game Programming, un vrai régal ! Je l’ai dévoré en une semaine et j’ai passé le reste de mon temps à convertir les codes sources du livres pour pouvoir les utiliser avec la SDL. C’est un petit livre (~300 pages) parfait pour les débutants car il ne rentre pas dans le détail et s’intéresse aux points clés d’OpenGL liés au jeu vidéo. Le dernier chapitre est même basé sur la création d’un jeu de shoot. En combinant les codes sources de ce livre avec des tutoriels de developpez, je me suis amusé à générer des cartes (heightmap) à partir d’image en noir et blanc plutôt que des fichiers de type raw.


More OpenGL Game Programming

More OpenGL Game Programming

Le deuxième livre s’intitule More OpenGL Game Programming, il fait environ deux fois la taille du livre précédent et couvre des sujets avancés de la programmation Jeux vidéo/OpenGL. Celui là je vais attendre un peu avant de le lire…

Je vais essayer de créer un petit jeu vidéo qui utilise les connaissances que j’ai accumulées grâce au premier livre. Je ne sais pas encore sur quel type de jeu je vais me pencher mais je vais trouver dans les jours à venir.




Voilà quelques screenshots tirés de mes bidouilles et des codes sources du premier livre:

Une image réprésentant une carte

Une image représentant une carte

Tracé de la carte (VBOs)

Tracé de la carte (VBOs)

Tracé de la carte (VBOs + Shaders)

Tracé de la carte (VBOs + Shaders)

Tracé de la carte (VBOs + Shaders + Textures)

Tracé de la carte (VBOs + Shaders + Textures)

Frustum culling + Ogres Quake 2

Frustum culling + Ogres Quake 2

Heightmap + Textures

Heightmap + Textures

Bonne année !

Mon premier jeu 2D était un jeu de tank en C en vue du haut assez basique où il fallait éliminer des véhicules qui passaient sur une plage -_-’. J’ai fait pas mal de chemin depuis avec des api pour la 2D comme Slick, SFML, SDL ou encore Flixel. J’ai pondu pas mal de prototype de jeux 2D (Top down shooter, jeu d’arcade, Rts, jeu de plateforme, jeu de combat, etc.). Je pense être en mesure de réaliser n’importe quel jeu en 2D, la difficulté réside surtout dans le réseau et l’ia.

Bref, j’ai décidé d’attaquer la 3D en essayant de commencer le plus bas possible pour apprendre le plus possible. Je n’ai donc pas utiliser de moteur 3D existant et je me suis attaqué directement au couple C++/OpenGL.

Quand on commence à développer des jeux, il y a une chose à respecter au début: commencer petit :) . C’est vrai pour la 2D et surtout pour la 3D. Le premier jeu n’est jamais un RTS ou un FPS complet quand on est seul à développer. Je n’avais jamais créer de Tétris, c’était donc l’occasion de le faire en 3D.

Je me suis inspiré de Blockout2 pour l’interface. J’ai découvert le jeu original à l’age de 7 ans sur le vieux macintosh de mes grand-parents, à l’époque je ne pensai qu’à jouer :) Au bout d’une semaine de C++ avec Eclipse j’avais ma propre version de Blockout:

Tétris 3D avec OpenGL

Tétris 3D avec OpenGL

Outre l’ordre des appels OpenGL dont il faut se méfier (OpenGL fonctionne comme une machine à état), une des grande difficulté pour un débutant en 3D (de mon point de vue) c’est l’ajout de mathématique (bon après chacun son niveau en maths :oops: ). Il faut donc maîtriser les objets mathématiques que sont les Vecteurs et les Matrices. Pour les translations et les rotations, le passage par ces objets est obligatoire.

Bon pour ceux qui pense qu’une matrice ca ressemble à ça:

La cuillère n'existe pas...
La cuillère n’existe pas…

Je les rassure tout de suite c’est beaucoup plus simple :) , en fait c’est un tableau 2D, généralement de 4*4 pour la 3D. Pour effectuer des translations et des rotations on multiplie les positions de nos objets (vecteur) par les matrices correspondantes (source de l’image ici):

Les matrices utilisés en 3D

Les matrices utilisés en 3D

Enfin une autre difficulté quand on est habitué à un certain niveau, c’est de se réhabituer au fait de ne pas posséder tout les outils nécessaires sous la main. On a beau chercher des appels du genre glOuvreUneFenetreBordel ou glEcritDuTexte2DSTP, et bah non ca n’existe pas rolleyes . Soit on réécrit la roue, soit on fait appel à des api externes comme GLUT, SDL, SFML ou encore les api de son OS. Ce qui laisse évidemment une liberté totale dans l’implémentation de son programme.

Je ne sais pas trop quoi faire pour la suite, peut être une scène avec un décor sympa pour utiliser les shaders. Je ne pense même pas avoir vu 5% des possibilités de la 3D et d’OpenGL. La route est longue mais je suis motivé :) .

Par ailleurs j’arrête le développement de Shonen Battle, si je continue le jeu pourrait vraiment devenir « complet et intéressant », hors je n’ai aucun droit sur les sprites utilisés.

Un petit post pour la version 0.2. Finalement j’ai un peu de temps à consacrer à l’évolution de ce jeu. Pas d’ajout de contenu pour la version 0.2 :( . En revanche :

  • Suppression d’une fuite mémoire (jeu stable peu importe le nombre de parties FPS ~50/60)
  • Temps de chargement au démarrage du jeu divisé par trois !!! :)
  • Chargement dynamique des ressources avant une bataille
  • Correction du bug avec le bankai de Renji
  • Curseur de sélection plus rapide

Le gros point fort de cette mise à jour réside dans le chargement dynamique des ressources (à ma surprise très rapide) qui réduit du coup la taille du fichier SWF de 33 mo à 11 mo et donc le temps de chargement du jeu. La suppression de la fuite mémoire est aussi une grosse avancée, peu importe le nombre de partie, le FPS reste stable :D .

Pour tester le jeu c’est par ici: Shonen Battle

© 2010 Vin789 Suffusion theme by Sayontan Sinha