Culture Geek

Je code, tu codes… vous codez ? #6

Je code, tu codes… vous codez ? #6

Code du spawner des ennemis et découverte du modulo

 

Bonjour à toutes et à tous, et bienvenue dans cette nouvelle série d’articles qui traitera – en long, large et autres travers – de la programmation, et puisque nous sommes sur Cleek, nous parlerons bien entendu ici de l’art geek dans toute sa splendeur : le jeu vidéo et les étapes nécessaires pour créer le vôtre de A à Z !

Non, non, ne fuyez pas tout de suite, rassurez-vous, le développement de logiciels n’est en aucun cas, contrairement à certaines idées reçues, une affaire d’intellos reclus et monomaniaques ! En effet, quelques cuillères à soupe de logique, une ou deux onces de patience ainsi que quelques grammes de curiosité sont les seuls ingrédients requis pour développer la base d’un jeu vidéo.

Souvenez-vous de l’article de la semaine dernière, lorsque nous avons créé le « prefab » d’un ennemi : ce travail nous donne un modèle que nous allons réutiliser pour la plupart des vaisseaux basiques que nous croiserons dans notre jeu, et nous allons faire apparaître à intervalles réguliers des ennemis basés sur ce fameux « prefab ».

 

Vous reprendriez bien un peu de maths ?

 

Nous avons déjà abordé ensemble la création de nouveaux GameObject basés sur un prefab en particulier, dans le cas des tirs de notre Nyan-Cat : à chaque fois que le joueur pousse sur la barre d’espace de son clavier de ses petites mains, nous créons un nouvel objet « newShoot » (tout ceci se déroule dans le script « NyanFire »).

Reprenons le code suivant :

 

GameObject newShoot = (GameObject) GameObject.Instantiate(shoot, shootStartPosition, this.gameObject.transform.rotation);

newShoot.name = shoot.name;

newShoot.transform.parent = this.gameObject.transform.parent;

 

Cette portion de code nous permet donc d’appeler la méthode « Instantiate » de la classe « GameObject » pour créer une instance basée sur le prefab shoot, cette même instance que nous allons mettre dans l’objet newShoot. Dans Unity, nombreux seront les cas où vous aurez besoin de récupérer un prefab (fabriqué par vos mimines de codeurs en herbe ou tout simplement récupéré sur le net).

Commençons par créer un nouveau script que nous baptiserons « SpawnerEnnemis » et ouvrons notre fidèle Monodevelop. Copiez-y le code suivant :

 

cleek_image_prog6_1

 

Explications :

  • « ennemi1 » est un objet de type GameObject qui va contenir le prefab du vaisseau ennemi
  • « intervalle1 » est l’intervalle de temps entre deux apparitions d’ennemis, sachant que l’unité de temps que nous utilisons est le soixantième de seconde (si nous mettons 30 comme intervalle, deux ennemis devraient apparaître par seconde)
  • « compteur » est une variable qui va simplement grandir de 1 à chaque fois que nous passerons dans la fonction Update(), c’est-à-dire 60 fois par seconde ! Cette variable compteur nous permet de nous repérer dans le temps depuis le lancement du script.
  • « spawnPosition » est un object Vector3 comme nous en avons déjà croisé. Il nous servira à déplacer le point de départ de chaque nouvel ennemi (Si tous les vaisseaux apparaissent au même endroit, l’intérêt du jeu risque de s’en retrouver sacrément limité, n’est-il pas?).
  • « sens », comme nous l’avions vu à chaque fois qu’il était question de déplacement, nous permet de multiplier une vitesse, qui sera donc soit positive (vers le haut) soit négative (vers le bas). Il est important de noter que la valeur de sens s’inverse quand le spawnPosition touche l’un des bords de l’écran, afin qu’il n’en dépasse jamais les limites.

 

Grâce aux variables et objets déclarés en haut du script, la fonction Update() va en fait contrôler la valeur de compteur et vérifier si compteur est un multiple de intervalle1, et si c’est le cas, nous allons faire apparaître un nouveau vaisseau basé sur le prefab ennemi1.

 

compteur est un multiple de… j’ai pas compris !

 

Pas de stress, c’est normal de buter un peu sur cette notion la première fois que l’on y est confronté. Les conditions se présente de cette manière :

if(quelque chose) faire {action}

Le « quelque chose » peut être n’importe quoi, vous devez juste retenir que le résultat sera soit « vrai », soit « faux ». Dans le cas présent, la ligne « compteur % intervalle1 == 0 » se traduit comme suit :

le reste de la division entière (compteur divisé par intervalle1) est égal à zéro.

Cette opération, le reste d’une division entière, s’appelle le « modulo » et est symbolisée par le signe « % ».

Pour les plus récalcitrants aux mathématiques, il existe deux types de divisions que nous avons tous appris en école primaire : la division dont le résultat comportera des virgules, et sa sœur qui ne voudra que d’un résultat entier. Voyons un petit exemple :

5 / 2 = 2,5 -> 5 = 2 x 2,5

5 / 2 = 2 et il reste 1 -> 5 = 2 x 2 + 1

Et bien, le modulo nous permet de calculer le reste de la division entière (dans notre exemple, 5 modulo 2 = 1), et donc, en fonction de ce modulo, nous pouvons savoir si un nombre est multiple d’un autre, lorsque ce fameux modulo est égal à zéro !

 

mais… tout ça pour.. pourquoi au final ?

 

Nous souhaitons ajouter un nouvel ennemi à invertalles réguliers et si nous traduisons cela en condition mathématique, cela revient à vérifier si notre repère dans le temps est multiple de cet intervalle.

La fonction MoveSpawnPositionVertical(), quant à elle, va tout simplement bouger le Vector3 spawnPosition sur l’axe vertical afin que tous les ennemis ne sorte pas du même point de l’écran.

 

Sauvegardez le script, et revenez dans Unity. Nous allons simplement créer un GameObject vide dans la Hierarchy (clic droit, Create empty) que nous appellerons « Spawners ». Cet objet ne sera pas visible du tout, il s’agit de votre premier objet purement fonctionnel : il contiendra tous vos scripts de spawn, pour tous les réunir au même endroit (tout est question d’organisation lorsque l’on programme).

Associez-donc votre script « SpawnerEnnemis » à notre objet « Spawners » en glissant le script dans l’Inspector. Il est possible que toutes les variables publiques du script ne s’affichent pas tout de suite dans l’Inspector, mais ne vous inquiétez pas, essayer de lancer le jeu (bouton Play en haut, au centre de Unity). Une erreur va apparaître dans la console, ignorez-là, puisque vous pouvez désormais glisser votre prefab « EnnemiPrefab » dans le champ « ennemi1 » du script de spawn.

 

cleek_image_prog6_2

 

Lancez le jeu à nouveau, et surprise, des ennemis vont apparaître (un peu rapidement, mais vous pouvez modifier la valeur de « intervalle1 » si cela vous chante) du bord droite de l’écran pour se ruer sur notre Nyan-Cat !

 

Notre projet commence à ressembler à quelque chose, non ?

Notre projet commence à ressembler à quelque chose, non ?

 

La semaine prochaine, nous nous intéresserons à des ajouts que certains qualifieront d’agréments, mais qui font tout le sel de nombreux jeux : la musique et les effets sonores !

 

Culture Geek
Plus Culture Geek