Mon premier jeu Part 4
Voici enfin venu la suite de notre superbe tutoriel : « comment faire son premier jeu ^^ ». Dans cette partie nous allons voir comment gérer les collisions, si vous avez suivi le tuto traduit par Ryoma ça devrait être vraiment facile pour vous puisque nous allons appliquer le même principe.
Avant de commencer la gestion des collisions nous allons d’abord créer les points d’arrivée de notre grenouille, en effet dans le frogger vous devez passer par cinq points situe tout en haut du niveau pour passer au suivant. Ici ce seront des amis à aller sauver.
Commençons par créer une classe victory pour chacun de nos personnages. Ensuite nous faisons exactement comme pour le héros ou les ennemis, mais sans logique de déplacements, en gros rien de bien spécial, personnellement je les ai animés, mais c’est comme vous voulez, l’animation change même lorsque vous les avez sauvés, mais comme cela ne représente pas une nouveauté je ne vous détaillerai pas le code, vous le retrouverez dans l’archive finale.
Maintenant passons a la gestion des collisions, la première chose à faire pour pouvoir savoir si deux éléments se rentrent dedans va être de connaitre leur position. Pour ce faire, nous allons créer dans chaque classe d’élément interactif un rectangle auquel nous accéderons grâce à un accesseur (pour ceux qui ne savent pas ce qu’est un accesseur, c’est une méthode qui permet l’accès dans une classe à une donnée d’une autre classe. Voici le code pour l’accesseur de notre rectangle de collision.
public Rectangle RectCol
{
get { return rectCol; }
}
La prochaine étape consiste à mettre à jour ce rectangle de collision histoire de connaitre à chaque instant la position exacte des éléments. Pour ce faire dans chaque classe nous allons mettre à jour les coordonnées du rectangle dans la méthode update, comme ceci :
rectCol = new Rectangle((int)pospers.X, (int)pospers.Y, 40, 24);
Les deux dernières variables dépendent de la taille du sprite. Dans le cas de la classe hero vous verrez une différence ce qui est normal puisque je ne gère que la collision sur la moitié du perso, de manière à simuler le fait qu’il se tient debout.
Maintenant que nous pouvons savoir où chaque élément se situe, nous allons pouvoir voir s’ils se rentrent dedans :p.
Dans notre cas nous allons gérer les collisions dans la classe principale je sais qu’il serait plus propre de faire ça dans une classe à part, mais au moment de coder cette partie j’étais a la bourre :p , par contre, je vous encourage à le faire si vous avez le temps.
J’ai oublié de préciser pour que les collisions ai un effet il faut que nous puissions tuer notre grenouille niark niark. Plaçons-nous donc dans notre classe héros nous allons créer un booléen dead initialise a faux (ça vaut mieux pour cette pauvre petite bête d’ailleurs :p) ainsi qu’un accesseur et un mutateur (le mutateur permettant de mettre a jour la variable dans la classe d’origine).
public int Dead
{
get { return dead; }
set { dead = value; }
}
Il faut aussi empêcher notre héro de bouger s’il est mort donc dans la méthode update ou nous gérons ses déplacements il nous faut rajouter une condition !dead. La dernière modification a faire est de créer une méthode DrawDead que nous appellerons après sa mort et qui nous permettra d’afficher un sprite de circonstance :p. bien entendu qui dis nouvelle texture dis ne pas oublier l’initialisation ^^.
void DrawDead(GameTime gametime)
{
spritePerso.Begin();
spritePerso.Draw(txtPerso_Dead, pospers, Color.White);
spritePerso.End();
}
Maintenant que nous sommes revenus dans notre classe principale, ajoutons des variables rectangles qui nous permettrons de récupérer les rectangles de collisions des classes. La manière (très moche) que j’ai utilisée consiste à faire une variable par élément, mais si vous voulez faire plus propre vous pouvez utiliser des listes de rectangle (une par type).
Maintenant nous allons devoir regarder les collisions en elle-même. Pour ce faire, nous allons créer des fonctions qui testeront si notre héros rentre en collision avec les différents éléments du jeu.
Commençons par la collision avec les ennemis, nous récupérons d’abord les rectangles de collision grâce a l’accesseur, puis nous regardons si le rectangle e notre héros croise celui d’un ennemi grâce a la méthode intersects, et si c’est le cas nous le tuons. Notre méthode va ressembler à l’exemple qui va suivre sauf qu’il faut faire cette démarche pour chaque ennemi.
void collisionEnnemy()
{
rectFrog = frogy.RectCol;
rectE1 = e1.RectCol;
if (rectFrog.Intersects(rectE1))
frogy.Dead = true;
}
Voilà notre grenouille peut maintenant se faire écraser par les méchants ennemis ^^. Dans le prochain tuto, nous verrons comment gérer les rondins de bois et la collision avec l’eau. En attendant, vous pouvez vous amuser avec l’archive du projet. À la prochaine.

décembre 9th, 2008 à 12:23
le lien pour telecharger le code renvoi vers le code du tuto3
pour ton accesseur sur dead vu qu’il se contente de renvoyer la valeur de dead ou de la recevoir il ne serait pas plus simple de déclarer directement dead en public?
et sinon le fait de faire des liste de rectangle au lieu d’utilisé une variable par retangle c pas que se soit “moins moche” ou “plus propre” c’est juste qu’on a plus besion d’ecrire qu’une seul fois la fonction de test de collision
janvier 13th, 2009 à 3:33
Désolé pour la réponse tradive je n’ais pas eu beaucoup de temps pour le site ces derniers temps.
En effet l’archive n’est pas la bonne, je remettrais la bonne si je la retrouve. Pour les getters tu as sans doute raison, mais je prefere gérer mes variables entre mes classes de cette maniére, je trouve cela plus clair, mais c’est une question de gout.
En tout cas encore merci pour tes commentaires, toujours constructifs ;).
août 13th, 2009 à 1:27
bonjour, je voudrai me lancer dans le développement de jeux video. Ce langage permet til une réelle fluidité de jeu? et ou trouver le tutorial ainsi que le soft? merci d’avance à ceux qui ont les réponses