Tutoriels et actualités sur la programmation de jeux vidéos avec XNA

lundi, le 19 juillet 2010

L'algorithme de bruit inventé par Ken Perlin et présenté au SIGGRAPH il y a déjà de cela plusieurs dizaines d'années est un des algorithmes les plus utilisés dans le monde du graphisme temps réel, notamment grâce aux effets qu'on peut en tirer et grâce à sa relative rapidité.

Le bruit de Perlin permet de générer des textures procédurales utilisées comme effet visuel pour augmenter le réalisme apparent.

De nombreuses utilisations sont possibles, la plus connue étant certainement celle permettant de générer un terrain aléatoire (cet algorithme sert par exemple de base pour la librairie libnoise), mais d'autres effets peuvent être obtenu si l'on combine le bruit de Perlin avec d'autres fonctions mathématiques, comme dans les vidéos suivantes ci-dessous.

Lire la suite ...

dimanche, le 30 mai 2010

Les effets de "parallax side scrolling" (défilement parallaxe en français) son notamment utilisés dans les jeux vidéos (notamment les jeux de plate-forme et les shoot'em up) pour simuler un effet de profondeur tout en évitant l'utilisation d'algorithmes 3D.

Cet effet est obtenu en superposant plusieurs couches (calques) représentant des objets à plus ou moins grande distance, que l'on fait se mouvoir selon une même direction, mais à des vitesses différentes.

Lire la suite ...

mardi, le 6 avril 2010

J'avais promis que dans ce tutoriel, nous attaquerions le vif du sujet, à savoir notre premier dessin en XNA. J'ai choisi de ne pas faire trop compliqué pour un premier rendu, et nous allons donc nous intéresser à la création d'un SplashScreen pour notre jeu.

Mais avant toute chose, il y a certains tutoriaux que je vous conseille de consulter, car ces derniers seront utilisés dans celui-ci:

Lire la suite ...

samedi, le 3 avril 2010

Tutoriel: Les transitions avec XNA

La finition d'un jeu dénote souvent de sa qualité intrinsèque. C'est dans les petits détails que l'on reconnait qu'un jeu a été fignolé, et que ses développeurs sont des perfectionnistes. Par exemple, un jeu dont le menu fourmille de milliers de petites animations attirera bien plus l'œil qu'un jeu dont le menu est une liste classe d'éléments sans aucune vie.

Nous allons donc voir ensemble comment gérer ces animations ensemble, afin de pouvoir donner un peu plus de vie à notre jeu. Mais avant de commencer, il serait bon de prendre connaissances des tutoriaux "Gestion du temps - Chronomètre et décompte avec XNA", "Les horloges", "Rajout de méthodes et d'évènements pour la gestion du temps", car le code utilisé ici se base sur ces derniers. De plus, ce tutoriel abuse de la notion de génériques, dont vous pourrez trouver une introduction sur le site de la MSDN.

La première technique d'animation qui coute peu en développement est l'utilisation d'effets de transitions. Quand vous voyez un effet de fondu, un agrandissement d'un sprite au cours du temps, ce genre d'effets est réalisés grâce à l'interpolation de deux variables en fonction du temps.

Ainsi, un fondu est réalisé en modifiant une valeur d'opacité de 0 à 1 sur une certaine période de temps. Un agrandissement d'un sprite est réalisé en modifiant une valeur indiquant l'agrandissement du sprite suivant le temps passé.

Le système transitions que nous allons voir ici formalise ces effets dans une classe nommée Easing.

Lire la suite ...

dimanche, le 28 mars 2010

Nous avons déjà vu dans les tutoriaux "Gestion du temps - chronomètre et décompte pour XNA" et "Utilisations d'horloges avec XNA" une première façon de gérer le temps sous XNA.

Nous allons aujourd'hui mettre à jour la classe TimerBase ainsi que la classe Timer vu dans ces deux tutos afin de les utiliser dans un système de transitions (easing en anglais) que nous verrons dans un tutoriel ultérieur.

Lire la suite ...

mardi, le 23 mars 2010

Les spécifications de XNA requièrent au minimum une carte graphique qui supporte le Shader Model version 1.1, et la plupart des exemples que vous trouverez sur le net (notamment ceux du creator's club) nécessitent un support du Shader Model version 2.0. Pour la Xbox 360, il n'y a pas de soucis, celle ci est équipée avec une carte graphique supportant le Shader Model version 3.0, et DirectX 10 défini le Shader Model version 4.0.

En théorie, vous ne pouvez pas faire tourner XNA sur des ordinateurs anciens qui n'ont pas la carte graphique nécessaire. Mais que se passe t'il quand vous vous retrouvez avec un vieux portable et une furieuse envie de compléter ce bout de code qui ne fonctionne pas depuis des jours, que vous avez une idée sur comment résoudre le problème, mais aucun moyen de le tester, car la carte graphique n'est pas assez puissante?

Lire la suite ...

mardi, le 16 mars 2010

L'émulateur Windows Phone 7, tel que présenté grâce à Visual Studio 2010C'est Valentin Billotte, qui ouvre le feu le premier en France avec son tutoriel sur l'installation de l'environnement de développement Visual Studio 2010 et XNA 4.0 pour la création de jeu vidéos sur Windows Phone 7.

On remarque que XNA Game Studio 4.0 dispose d'un émulateur (à moins que ce dernier soit déjà fourni avec VS 2010? Valentin, si tu pouvais nous apporter des précisions là dessus...) pour le Windows Phone, et vous n'avez donc pas besoin d'avoir un téléphone pour faire vos premiers développements (surtout que... ce téléphone n'est pas encore disponible pour le grand public...)

jeudi, le 4 mars 2010

Tutoriel de dessin de lignes avec XNA

Dans la série "je suis pas en avance", je demande un nouveau tutoriel de David Amador. Cette fois ci, le développeur XNA freelance nous explique comment tracer des lignes basiques dans un jeu XNA grâce à sa classe statique LineBatch.

Comme à son habitude, David nous fourni le code source complet de sa classe dans un exemple fonctionnel de tracé de lignes, qui se trouve en fait être une toute petite application de dessin, comme le montre cette vidéo:

Pour dessiner ses lignes, David utilise en fait un objet Texture2D dans lequel il stocke ses lignes. Je n'aurai personnellement pas utilisé cette technique, et je pense que j'aurai largement préférer des VertexBuffer dynamiques contenant la définition des points, ainsi que leur couleur (j'avais déjà utilisée cette technique pour représenter des repères dans un monde 3D, et cela marchait plutôt bien, j'essaierai d'en faire un tutoriel complet un jour...).

Je sais que je suis un peu en retard, mais pour ceux qui n'auraient pas vu le tutoriel de gestion des écrans de jeu par David Amador, il se trouve à cette adresse.

David utilise une technique assez spécifique qui lui permet d'éliminer les tests conditionnels en gérant les écrans via un ScreenManager. Le principe est le suivant: le ScreenManager contient toutes les instances d'écrans du jeu, et il peut basculer l'écran principal via une méthode spécifique, qui effectue un Shutdown() sur l'écran courant et Initialize() l'écran suivant.

Le code source d'utilisation de sa classe ScreenManager, qui sert aussi d'exemple à son tutoriel, est disponible en libre téléchargement sur son site.

Il est à noter que cette technique peut être parfaitement utilisée pour gérer des états plus génériques que des écrans du jeu ( splash screen, qui donne ensuite accès au main menu, puis à un niveau etc... ) qui sera intégrée dans notre première série de tutoriaux consacré au développement d'un jeu 2D.

mardi, le 2 mars 2010

Nous avons vu dernièrement comment créer des classes utilitaires pour nous faciliter la tâche de la gestion du temps, en permettant l'utilisateur d'appeler une fonction après n secondes. Toutefois, ce tutoriel n'est pas complet, et il est tout a fait possible de créer d'autres classes qui s'occupent de gérer le temps, basées sur le code écrit la dernière fois. Nous allons donc voir aujourd'hui comment appeler une fonction à intervalles régulier grâce à notre classe Timer.

Ceux d'entre vous connaissant le monde du développement web pourront faire l'analogie entre la classe Countdown et la méthode setTimeout de Javascript (dont il n'existe malheureusement pas d'équivalent en C#) et la classe Timer que nous allons écrire avec la méthode setInterval du même langage.

Lire la suite ...

lundi, le 1 mars 2010

Le site Progware.com a publié quelques tutos sur XNA, dont notamment:

Visiblement ces articles forment une série sur la création d'un moteur avec XNA, et l'auteur devrait publier prochainement d'autres articles concernant la programmation de jeux vidéos avec XNA. Si d'aventure Progware.com venait à publier de nouveaux tutoriaux, comptez sur nous pour vous prévenir.

Mise à jour: Ajout de trois nouveaux tutos concernant la détection de collision de sprites.

dimanche, le 28 février 2010

La gestion du temps dans un jeu vidéo est une chose que l'on retrouve partout. Que ce soit évident, comme un décompte avant un check-point dans un jeu de voiture, ou plus subtil, comme le temps d'un fondu progressif, la notion temporelle est utilisée intensément, et il en va de même pour un jeu XNA.

Heureusement pour nous, la méthode Update() et son objet GameTime passé en paramètre nous simplifie bien la vie, mais ce n'est pas suffisant pour faire du code propre. Après m'être renseigné sur le canal IRC #xna sur EFNet (qui rassemble une grande partie des développeurs XNA d'outre-manche et d'outre-Atlantique), je me suis rendu compte que la plupart du temps, les utilisateurs géraient le temps via des variables flottantes dans les GameComponent; cette méthode, très simple, a déjà fait ses preuves. Mais l'on peut mieux faire que:

  • Mode texte
  • Copier
  1. /// <summary>
  2. /// Allows the game to run logic such as updating the world,
  3. /// checking for collisions, gathering input, and playing audio.
  4. /// </summary>
  5. /// <param name="gameTime">Provides a snapshot of timing values.</param>
  6. protected override void Update(GameTime gameTime)
  7. {
  8. time += gameTime.ElapsedGameTime.TotalMilliseconds;
  9.  
  10. if (time >= 60000)
  11. {
  12. DoSomething();
  13. }

Nous allons voir dans cet article deux petites classes, qui seront extensibles à souhait, pour gérer le temps. Nous commencerons avec la classe TimerBase qui représente une implémentation abstraite de base de gestion du temps, et une classe Countdown, qui représente un décompte temporel, et qui permet d'appeler une méthode à la fin de ce décompte.

Lire la suite ...

jeudi, le 11 février 2010

Quand on développe un jeu sur Xbox, on n'a pas trop besoin de s'inquiéter des options de configuration; en effet, la Xbox étant une machine fermée, l'utilisateur final n'ira jamais changer de carte graphique, pour avoir une meilleure résolution ou de plus joli graphismes. Toutefois, avec les PC, c'est une autre galère: chaque utilisateur dispose d'un matériel différent, et même la configuration du clavier et de la souris peut changer suivant les pays (qui se souvient encore devoir taper le texte en "qwerty" parce que le jeu était programmé pour un clavier américain, laissant des souvenirs impérissables comme le "j'te niaue q lq kqlqsh111" de Counter Strike?)

Le but de notre tutoriel aujourd'hui est donc de pouvoir rajouter un système de configuration à notre jeu XNA. Par chance, sous Windows, nous ne sommes pas limité à la version compacte du Framework .Net, et nous pouvons donc utiliser toutes les classes fournies par Microsoft dans le Framework .Net pour arriver à nos fins. Par chance, il se trouve que la version 2.0 du framework .Net implémente déjà un système de configuration très (voire trop...) complet via l'espace de nom System.Configuration contenu dans la librairie du même nom (qu'il faudra donc ajouter à votre projet avant de continuer).

Lire la suite ...

mercredi, le 10 février 2010

S'il y a bien une chose qui manque dans les dizaines d'implémentations de collections du Framework.Net, c'est bien une implémentation de tableau circulaire; cela n'aurait pas été si grave si cette structure n'était pas si souvent utilisée dans la création de jeux-vidéos: en effet, l'on peut utiliser ce genre de structures pour différentes raisons:

  • Historique d'états: parfois, il est nécessaire de maintenir l'état de certaines variables sur la durée, comme par exemple, les positions du curseur de la souris, afin de lisser les mouvements de la souris (l'option "smooth moves" disponible dans la configuration de FPS) pour éviter, notamment, les saccades d'un capteur optique parfois un peu sensible
  • Historique d'état simplifié: souvent utilisé en conjonction avec les touches claviers, cet historique d'état ne stocke en fait que l'état courant et l'état précédent, mais est néanmoins très utile pour détecter des changement d'états du clavier; il est en effet parfois utile de détecter juste le changement d'état. Par exemple, imaginez un jeu ou l'on pilote un chasseur F-16; vous ne voudriez quand même que à chaque boucle de jeu, le F-16 lance un de ses missiles! Il est donc important de pouvoir capter le moment ou le joueur appuie sur une touche, mais de ne rien faire si la touche reste enfoncée. L'on obtient cet effet si la touche à vérifier est appuyée sur la frame courante, et qu'elle ne l'était pas sur la frame précédente. L'on peut comparer ce genre de choses à l'équivalent d'une détection d'un front montant ou descendant en électronique.
  • Les fenêtres de visualisations glissantes: ce sujet est beaucoup plus complexe et fera le sujet d'un autre article beaucoup plus développé.

Avant d'entreprendre ce tutoriel, le lecteur aura pris soin de se familiariser avec la notion de génériques si cette notion ne lui est pas familière. En effet la totalité des exemples cités dans la suite de l'article abusent de cette notion.

Lire la suite ...

Tutoriel: Composant de statistiques de rendu pour XNA

Il est utile, lorsqu'on développe un jeu vidéo, d'avoir des informations en temps réel sur l'état des périphériques internes (utilisation de la mémoire, utilisation du GPU et autres données); ces informations aident souvent le développeur à s'y retrouver lorsque des optimisations doivent être apportées à une partie ou un modèle du jeu.

Cet article vise donc à créer un Service qui nous fournira différentes statistiques sur l'état du GPU. Nous commencerons petit, en analysant le nombre d'image par secondes (FPS en anglais, pour "frame per second") affichés par notre jeu. Comme à notre habitude, nous utiliserons le paradigme Modèle - Vue - Contrôleur et nous séparerons le fournisseur de données de l'affichage de celle-ci (voir l'article correspondant), chose déléguée à un autre composant, que nous verrons dans un autre article.

Lire la suite ...

Victor Porof, à qui l'on doit déjà quelques autres tutoriaux notamment sur la gestion de terrains, vient de publier un nouveau billet sur son blog. Il s'attaque cette fois ci à un effet de post-processing, le motion blur (flou de mouvement). Le motion blur est souvent utilisé pour rajouter une impression de fluidité dans les mouvements. et est notamment utilisé dans certains jeux de voitures (le premier à ma connaissance l'ayant utilisé intensivement est Need For Speed Underground).

Exemple de motion blur avec Need For Speed Underground

Victor explore les différentes manières d'effectuer le flou de mouvement, et se base au final sur la différenciation de la position de la caméra entre deux frames (chose qui peut être réalisée par la classe BufferedState) pour connaitre le vecteur de mouvement à appliquer à un point donné de l'écran.

mardi, le 9 février 2010

Tutoriel: grille géodésique générée procéduralement

JeBuS vient de publier un tutoriel en 3 parties sur la génération d'une grille géodésique générée d'une manière procédurale. A l'origine, l'auteur souhaitait créer un jeu de type "Civilizations" mais dont le plateau, divisé en tuiles hexagonales serait une sphère (après tout, une planète est bien sphérique, et l'utilisation de cartes en deux dimensions pour ce genre de jeu était du souvent à des limitations techniques, levées aujourd'hui par la puissance des machines modernes). Le genre de plateau que l'on souhaite obtenir est donc un plateau similaire au dessin ci-dessous:

Planète à tuiles hexagonales

Si la technique pour générer ce genre de plateau vous intéresse, vous pouvez consulter les tutoriaux de JeBuS aux urls suivantes:

lundi, le 1 février 2010

C'est connu, les développeurs font souvent de mauvais artistes; parfois, ils essaient de se cacher derrière des techniques de rendus procédurales (surtout quand il n'y a pas d'artiste pour les seconder), et avec un peu de chance (et beaucoup de tweaks) le rendu arrive à être correct pour être inséré dans un jeu. C'est le cas de Dave Bollinger, qui a inventé une technique pour générer des sprites de vaisseaux spatiaux et de robots, qu'il nomme tout simplement PixelSpaceShips et PixelRobots. Cette technique a ensuite été récupérée par le site XNAFan.net et implémentée en XNA. Le résultat semble relativement convaincant (surtout si on aime le style old-school).

Nous restons persuadés que quelqu'un trouvera un gameplay assez déjanté à calquer sur cette librairie. Après tout, Arkedo a bien créé un jeu basé sur des gros pixels...

samedi, le 30 janvier 2010

Daniel Saidi vient de poster un nouveau tutoriel sur son blog, qui nous explique comment charger toutes les ressources compilées au format XNB par dossier; en effet, il nous arrive souvent d'avoir besoin de charger de nombreuses ressources, et la gestion de ces chargement peut vite être fastidieuse, surtout lorsqu'on souhaite gérer un chargement asynchrone de ces dernières.

Pour cela, l'auteur a implémenté son code en étendant la classe ContentManager, classe de base qui s'occupe de charger les ressources dans le framework XNA, et implémente la méthode LoadContent<T> afin que celle ci renvoie un Dictionary (table de hashage) composée de clefs représentant le nom du fichier et de valeurs objets représentant la ressource elle même.

mercredi, le 27 janvier 2010

Neil Reed vient de publier un tutoriel sur deux articles sur son blog (l'article originel contenait un bug qu'il a corrigé dans un billet ultérieur): il nous explique comment afficher une barre de vie via un tutoriel assez complet.

Son code se base sur l'utilisation du SpriteBatch avec une utilisation du Color tinting pour effectuer un rendu 2D par dessus l'écran courant, via l'utilisation de RenderTarget2D (ce qui crée quelques soucis de rendus si l'ordre de rendu n'est pas respecté). Nous avons même pu récupérer une petite vidéo de démonstration de son helper:

- page 1 de 3