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

dimanche, le 27 juin 2010

XNA Connection - Une nouvelle version!

Comme vous avez pu le constater, une nouvelle version du site vient de paraître aujourd'hui (c'est aussi la principale raison du peu de news ces derniers temps, toute mon énergie était focalisée sur cette nouvelle mouture).

Cette nouvelle version a plusieurs vocations importantes, mais toujours avec une connotation communautaire, comme:

  • Plus se centraliser sur la communauté XNA  francophone naissante, en proposant notamment une sélection d'articles via des blogs et sites externes. J'ai fait pour le moment une pré-selection de blogs et sites français qui touchent au monde du développement indie, xna, ou xbox live! arcade. Si vous souhaitez proposer votre site, n'hésitez pas à me contacter (soit via Twitter, ou par mail, ou même via la page contribution), il m'est aisé de vous rajouter dans le flux communautaire.
  • Permettre une plus grande interaction avec les utilisateurs via des sondages, mais aussi en leur permettant de participer au site, grâce à la nouvelle page de contribution. Vous avez créé un jeu Xbox live! Indie Games? Faites en de la pub sur XNA Connection! Vous avez écrit un tutoriel que vous aimeriez partager à la communauté XNA? Publiez le chez nous! Vous avez trouvé un lien ou un blog intéressant? Dites le nous!
  • Proposer des médias concernant les jeux publiés régulièrement, grâce à la fonctionnalité "Les vidéos de la semaine", ainsi qu'une sélection de jeux parus dernièrement sur le Xbox Live! Indie Games.
  • Et des recommandations sur des accessoires et livres concernant la Xbox et le développement sur cette console.
  • Des fonctionnalités supplémentaires devraient apparaître bientôt, pour faciliter encore plus l'échange entre les développeurs indépendants et amateurs.

Notez bien que cette nouvelle version ne doit pas être exempte de bugs. Si jamais vous trouvez quelque chose qui semble ne pas fonctionner correctement, ou simplement si vous avez un commentaire sur l'ergonomie de la nouvelle version, n'hésitez pas à laisser un commentaire à la suite du billet!

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 ...

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 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 ...

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 ...

dimanche, le 24 janvier 2010

Tutoriel de gestion de la souris avec XNA

Il y a peu de temps, nous avions vu ensemble comment gérer les entrées clavier avec XNA. Pour cela nous avions créer un composant qui était implémenté en tant que Service. Nous allons aujourd'hui utiliser le même paradigme pour contrôler un autre périphérique utilisé sur le PC, à savoir la souris.

Nous utiliserons de nombreux concepts vu lors de la conception du composant clavier, il sera donc bon d'y jeter un coup d'œil pour faire le lien avec ce code.

Lire la suite ...

mardi, le 19 janvier 2010

Que serait un jeu si le joueur n'avait aucun moyen d'interagir avec lui? Une simple démo tournante, qui serait lancée deux, maximum trois fois n'est clairement pas intéressante dans la plupart des cas. C'est pourquoi nous allons aujourd'hui nous attacher à créer un composant, qui implémentera un service, capable de nous fournir l'état des touches du clavier.

Un tel composant aura besoin de plusieurs classes fournies par le framework XNA, à savoir la classe Keyboard et la structure KeyboardState, dont nous étendrons les possibilités via notre classe BufferedState que nous avions codée il y a quelques temps.

Lire la suite ...

mardi, le 5 janvier 2010

Cet article est une traduction de l'article anglais de Ska Software "A word about Xbox Live Community Games/Indies Games". Cet article a été publié avec l'aimable autorisation de l'auteur.

Je n'ai pas eu affaire au Xbox Live Community Games depuis un certain temps (cela va bientôt changer; j'ai juste besoin d'une pause sur mon Super Projet XNA 2.0 Secret), mais cela ne m'a pas empêché de lire quelques articles amusants fustigeant le service pour avoir promis amour, gloire et richesse sans fin, pour au final, enlever le pain de la bouche.

Lire la suite ...

mercredi, le 9 décembre 2009

Démarrer un programme externe avec Visual Studio Express

Il est parfois utile de démarrer un programme externe lors de la création de librairies de code, notamment lorsqu'il s'agit de tester ses librairies de gestion de contenu (content pipeline). Malheureusement, les versions Express de Visual Studio ne permettent pas d'effectuer ce genre de choses; en effet l'option "Démarrer un programme externe" ("Start external program" en anglais) n'est pas disponible pour ces versions.

Il existe toutefois quand même une astuce pour bénéficier de cette option avec les versions Express de Visual Studio, mais il faudra mettre un peu les mains dans le cambouis.

Après moult tests, il semblerait que cette fonctionnalité ne soit disponible que avec Visual Studio Express 2008. Nous cherchons encore un moyen de faire fonctionner cette astuce avec Visual Studio Express 2005.

Lire la suite ...

Comme les projets de librairie de classe, les projets d'extension du Content Pipeline de XNA ne peuvent être lancés directement. Toutefois, il est possible de les déboguer, après avoir suivi quelques étapes simples décrites ci-dessous.

Note: La boîte de dialogue "Démarrer un programme externe" ("Start external program" en anglais) située sur l'onglet débogage des propriétés de votre projet n'est pas accessible sur les versions Express de Visual Studio. Il est par contre possible de régler cette valeur manuellement avec Visual Studio 2008 Express (voir l'article à ce sujet).

Lire la suite ...