Déplacer plusieurs objets ensembles avec l'extension « Associations d'objets »

Dans ce tutoriel, nous allons créer un objet « char » composé d'un sprite représentant sa base et d'un second représentant sa tourelle. Pour cela, nous allons utiliser l'extension « Associations d'objets » qui permet d'associer des instances d'objets entre elles de façon virtuelle (cela ne permet de déplacer les instances automatiquement, nous devrons ajouter cela manuellement avec les événements).

Préparatifs

Dans cette première section, nous allons préparer notre jeu et créer les objets dont nous aurons besoin. La procédure n'est pas très détaillée car cela n'est pas le coeur du tutoriel. Si vous éprouvez des difficultés à réaliser ces instructions, vous pouvez lire les tutoriels de base du logiciel ainsi que sa documentation en ligne.

Création du projet et téléchargement des ressources

Dans un premier temps, je vous invite à télécharger cette archive contenant les images que nous allons utiliser. Ensuite, créez un nouveau projet sur GDevelop et ajoutez ces images dedans. Activez aussi l'extension « Associations d'objets » dans la partie « Extensions » du projet.

Création des objets « Sprites »

Dans la scène principale du projet, créez deux objets « Sprites » que vous appellerez respectivement « Char » et « Tourelle ». Dans le premier, ajoutez l'image « tankGreenoutline.png » et dans le second l'image « barrelGreenoutline.png ».

Réouvrez l'éditeur du sprite « Char » et ajoutez un point appelé « position_tourelle » au centre du disque vert foncé (la position doit être quelque chose comme 37;41). C'est là que l'autre objet, « Tourelle » devra être placé automatiquement par le jeu.

Enfin, dans l'éditeur de l'objet « Tourelle », déplacez les points « Origin » et « Centre » vers le futur axe de rotation de la tourelle, c'est-à-dire l'extrémité gauche de l'image (approximativement à la position 11;12).

Le point « Origin » permet de définir l'endroit qui doit être considéré comme la position de l'objet. Ainsi, la position de la tourelle se fera par rapport à ce point au lieu du coin haut-gauche de l'objet. Quant au point « Centre », il permet de définir l'axe de rotation de l'objet (par défaut au centre). Ici, la tourelle devra bien tourner par rapport à son extrémité gauche.

Dernière étape, ajoutez le comportement « Mouvement vu du dessus » à l'objet « Char » : cela permettre de tester facilement le déplacement des instances de « Char » lors de l'aperçu grâce aux touches fléchées.

Ajout sur la scène

Placez maintenant plusieurs instances de l'objet « Char » sur la scène (pas l'objet « Tourelle, vous allez comprendre pourquoi après).

Un sacré champ de bataille !

Ce que nous allons faire

Le but de ce tutoriel va être de faire en sorte que pour chaque instance de l'objet « Char » placée sur la scène, une instance de « Tourelle » soit créée et la suive.

Pour cela, nous allons utiliser les conditions et actions fournies par l'extension « Associations d'objets » ainsi que des boucles « Pour chaque » pour manipuler chaque instance d'un objet indépendamment des autres.

L'extension « Associations d'objets »

L'extension « Associations d'objets » permet de lier « virtuellement » des instances d'objets entre elles et d'accéder à l'une à partir de l'autre. Par « virtuellement », j'entends que les objets ne sont pas liés au sens de leurs positions et de leurs déplacements. C'est juste un lien en mémoire qui permettra grâce à une condition de retrouver l'instance de l'objet associée à un autre.

Ce sera donc à nous d'utiliser les fonctionnalités de l'extension associées aux actions de positionnement afin de créer et déplacer la tourelle avec le char.

Les événements

Création et association des tourelles

Le premier événement va permettre de créer une instance de l'objet « Tourelle » pour chaque instance de l'objet « Char » au lancement de la scène. Nous allons donc utiliser un événement « Pour chaque ». Ajoutez l'événement en mettant « Char » comme objet puis ajoutez comme condition « Au lancement de la scène ».

Ensuite, ajoutez l'action permettant de créer une nouvelle instance de l'objet « Tourelle » à la position du point « position_tourelle » de l'objet « Char » (« Tous les objets > Objets > Créer un objet »).

Char.PointX(positiontourelle) et Char.PointY(positiontourelle) permettent d'obtenir les coordonnées X et Y du point appelé « position_tourelle » de l'objet « Char »

Ajoutez l'action permettant de modifier le plan de l'objet « Tourelle » nouvellement créé afin qu'il soit bien visible devant le « Char ».

Enfin, il nous reste plus qu'à associer l'instance de « Tourelle » que nous venons de créer via l'action précédente à l'instance de « Char » actuellement traitée par l'événement « Pour chaque ». Pour cela, ajoutez l'action « Lier deux objets » (catégorie « Associations d'objets ». Mettez les deux objets en paramètre. C'est cette action qui va lier l'objet « Char » actuellement parcouru par l'événement « Pour chaque » et l'objet « Tourelle » nouvellement créé.

L'événement doit être comme suit :

L'événement permettant de créer les tourelles au lancement de la scène

Si vous testez maintenant, vous devriez constater que les tourelles sont bien créées sur chaque instances de « Char » mais qu'elles ne se déplacent pas avec pour le moment. C'est normal, nous allons gérer le déplacement des tourelles dans la section suivante.

Déplacement des tourelles avec les chars

Maintenant, nous allons créer un deuxième événement qui va gérer le placement des tourelles sur les chars après leurs déplacements.

Comme dans le premier événement, nous devons traiter chaque instance de « Char » indépendamment des autres, ajoutez par conséquent un événement « Pour chaque » en précisant « Char » comme objet. Ensuite, ajoutez l'action de positionnement afin de placer la tourelle au bon emplacement sur le char (sur le point « position_tourelle », comme lors de la création des tourelles).

Testez et vous allez constater un problème : les tourelles sont toutes sur un seul des chars. En fait, à chaque tour de l'événement « Pour chaque », toutes les instances de « Tourelle » vont être replacées sur le « Char » actuellement traité par l'événement : à la fin, toutes les tourelles sont placées sur le dernier char à avoir été parcouru par l'événement « Pour chaque ».

Il manque une condition ! C'est là que l'association que nous avons réalisée dans le premier événement entre une instance de « Char » et une instance de « Tourelle » va nous être utile. En effet, nous allons ajouter au deuxième événement une condition permettant de filtrer parmi les instances de « Tourelle » celle qui est associée à l'instance de « Char » en cours de traitement par l'événement « Pour chaque ».

Cette condition se trouve dans la catégorie « Associations d'objets » et s'appelle « Prendre en compte les objets liés ». Ajoutez cette condition en précisant « Tourelle » en premier paramètre et « Char » en second.

L'ordre des deux paramètres est important ici ! GDevelop va filtrer les objets du premier paramètre qui sont liés aux instances actuellement traitées du second paramètre. Nous voulons bien filtrer la tourelle liée au char traité.

L'événement doit ressembler à cela :

Vous pouvez maintenant tester, les tourelles bougent bien avec leur char :

Suppression des tourelles avec leur char

Un troisième événement va permettre de gérer la suppression des tourelles quand un char est détruit. Dans le cadre de ce tutoriel, nous allons dire qu'un char doit être détruit quand la souris clique dessus. Sans faire attention à la tourelle, nous obtenons l'événement suivant :

Le problème est que la tourelle reste après la disparition de l'instance de « Char ».

Pour régler ce soucis, il existe deux solutions :

  • la première est simple : cela consiste à récupérer la tourelle correspondante (dans le même événement) via la condition d'association et de la supprimer. Mais elle doit être refaite pour chaque « mort » possible du char (si on rajoute le fait qu'un char est détruit si on le fait sortir de l'écran, il faudra recopier des conditions et actions pour supprimer la tourelle). Voici l'événement correspondant :

  • la seconde est plus générale. Elle consiste à vérifier si pour chaque instance de « Tourelle » indépendamment, une instance de « Char » y est encore associée. En effet, la condition permettant de récupérer les objets associés devient fausse quand elle ne trouve pas d'instance associée. Avec cette solution, il suffira de supprimer une instance de « Char » dans le ou les événements que l'on souhaite pour que la tourelle soit automatiquement supprimée. Voici les événements (le premier est juste l'événement qui supprime le char et le second est l'astuce permettant de supprimer les tourelles des chars qui n'existent plus) :

La condition est bien inversée dans le seconde méthode.
L'utilisation du « Pour chaque » dans la seconde solution est obligatoire car, sinon la condition d'association retournerait toujours vrai tant qu'au moins une instance de « Char » serait présente (la condition trouverait toujours une instance de « Char » associée à une « Tourelle »).

Améliorations possibles pour créer un jeu

Vous avez désormais tous les éléments pour utiliser l'extensions « Associations d'objets » de la meilleure des manières. A partir de ce qui a déjà été fait, vous pouvez créer un jeu en :

  • ne gardant qu'un char contrôlé par le joueur ;
  • ajoutant des chars ennemis (avec la même méthode de gestion des tourelles) ;
  • tournant la tourelle vers la souris (avec une vitesse de rotation définie pour plus de réalisme)
  • permettant de tirer des projectiles qui vont détruire les chars ennemis
  • en déplaçant les chars ennemis
  • en permettant aux chars ennemis de tirer un projectile vers le joueur

Voici un jeu d'exemple créé avec ce tutoriel et en ajoutant un certain nombre des propositions ci-dessus : Télécharger le jeu d'exemple

Crédit images : les images utilisées par le jeu et par le tutoriel ont été réalisées par Kenney et peuvent être trouvées en intégralité à cette adresse. Elles ont été tournées de 90° pour être utilisées dans GDevelop plus facilement.

Autres utilisations possibles de l'extension « Associations d'objets »

Même si le déplacement d'objets lié est l'utilité première de cette extension, il existe d'autres problèmes qui peuvent être résolus avec cette dernière. Par exemple :

  • associer un projectile à l'objet du joueur qui l'a tiré afin de pouvoir augmenter le score du bon joueur ;
  • associer un projectile à un joueur pour qu'il ne fasse pas toucher par ses propres projectiles ;

Bonne création avec GDevelop. :-D