Tower defense - Faire avancer plusieurs formes suivant un pa
Posté le 12/11/2016 12:03
Bonjour tout le monde,
Voilà j'ai quelques questions sur un de mes projets de créer un tower defense. Jusqu'à maintenant tout va bien, le stade préparation est terminé et opérationnel.
Maintenant j'en suis à la phase où les ennemies arrivent et suivent un parcours
Maintenant là où je bloque c'est de faire suivre ce parcours à plusieurs ennemis, j'ai fais des recherches mais je n'ai rien trouvé qui pourrait correspondre à mes attentes. Il faudrait que chaque ennemie est
son propre déplacement (commun aux autres) afin de lui affecter par la suite une autre variable qui sera sa vie.
Voici donc le code que j'avais commencé à écrire qui est bon mais seulement pour un seul ennemie :
Précision :
- La première ligne de code est pour afficher le parcours
- Chaque "E6A6" représente un carré noire (afin de remettre le parcours en place après le passage de l'ennemie)
- Chaque "E6BC" représente l'ennemie
- Le nombre d'ennemi augmentera de 1 à chaque niveau
Merci à vous si vous trouvez une solution
ça fait 2 semaines que je suis bloqué dessus
Citer : Posté le 12/11/2016 12:16 | #
Si j'ai bien compris, ta matrice contient les numéros des cases par lesquelles les ennemis passent, dans l'ordre ? C'est un peu fastidieux à utiliser, je pense.
Tu pourrais peut-être utiliser plutôt des listes. Je pense notamment à une (deux) liste de coordonnées (soit deux listes (x, y), soit une liste en complexes x + iy, selon ton goût), et une liste d'ennemis. Voilà comment ça se passerait :
1 (x, y) 00
2 (x, y) 12
3 (x, y) 04
4 (x, y) 00
5 (x, y) 13
Fin --- --
La première liste contient les coordonnées de toutes les cases du parcours, dans l'ordre, et la seconde contient, disons les PV de l'ennemi qui est sur la case. Si tu veux enregistrer plus que des PV, tu peux ajouter une liste supplémentaire (défense par exemple) ou mettre dans la liste « Ennemi » une référence à des informations situées ailleurs. Mais peu importe.
Lorsque le temps avance d'une étape, tu avances chaque ennemi dans la seconde liste, sans toucher à la première (la première ne change jamais). Ainsi, l'ennemi qui descend d'une position dans la liste avance d'une case le long du parcours que tu as tracé sur la map. Lorsqu'un ennemi arrive en bout de la liste (à la ligne que j'ai appelé « Fin »), cela signifie qu'il a parcouru tout le trajet sans être tué. Ce que tu en fais après dépend des règles de ton jeu
Attention, si tu veux pouvoir faire descendre tous les ennemis dans ta liste sans écraser ceux qui sont déjà en-dessous, il faut parcourir la liste de bas en haut : tu pars de l'ennemi le plus bas, tu le fais descendre, ensuite tu passes à celui au-dessus, etc. Lorsque tu arrives à la première case, tu déplaces l'ennemi qui y est présent (s'il y en a un) sur la deuxième case. Et alors, tu peux décider (ou non) d'ajouter un nouvel ennemi dans la première case fraîchement libérée jusqu'à ce que tous les ennemis de ta vague soient entrés sur la map.
Citer : Posté le 12/11/2016 19:27 | #
Dans ce genre de situations, il faut minimiser les transferts en mémoire. Décaler toutes les informations des ennemis prend du temps, et plus le nombre d'ennemis augmente, pire ça sera.
Deplus, ton algorithme cherche son chemin, il scrute les 4 directions pour savoir où aller. Seulement tu connais ton chemin, autant faire que ton algo le sache aussi
Voici comment je vois les choses :
List 1 qui enregistre dans l'ordre les coordonnées de chaque case de ton chemin sur l'axe x
List 2 qui enregistre dans l'ordre les coordonnées de chaque case de ton chemin sur l'axe y
List 3 qui enregistre le numero de la case sur laquelle est une unité
List 4 qui enregistre la vie de l'unité.
Donc comment ça va marcher ?
Un exemple :
List 1 = {1,2,3,4}
List 2 = {1,1,1,1}
List 3 = {1,3,4}
List 4 = {100,84,23}
List 1 et 2 sont assez claires, ce sont les 4 premières case de ton parcours.
La List 3 indique que tu as 3 ennemis aux cases 1, 3 et 4 et que leur vie est respectivement 100, 84 et 23
A chaque étape temporelle de ton jeu, il suffit de faire +1 pour toutes les case de la List 3. (Et là tu beaucoup optimiser, regarde le lien "Effet de particule" de ma signature)
Pour tuer un ennemi, il suffit de mettre sa vie à 0 et de ne pas afficher les ennemis dont la vie vaut 0.
Pour rajouter un ennemi, soit tu rajoutes une case, soit tu ecris sur case dont la vie vaut 0, avec valeur 1 pour la List 3 et la valeur de vie max dans la List 4.
A ça il y a un tas d'avantages, tu peux même préremplir les List 3 et 4 avec tes ennemis dedans pour chaque niveau, et tu peux avoir plusieurs ennemis sur une même case. Donc chaque ennemi peut avoir sa propre vitesse (il suffit d'ajouter autre chose que 1 à chaque tour)
Ton jeu va prendre un coup fouet en vitesse !
Citer : Posté le 13/11/2016 00:32 | #
Décaler toutes les informations des ennemis prend du temps, et plus le nombre d'ennemis augmente, pire ça sera.
C'est une opération en une lecture et une réécriture. C'est du linéaire pur ; on ne peut pas faire mieux de toute façon. Mais c'est vrai que ton map est assez malin (bien joué), ça augmentera réellement la vitesse. Je demande quand même à voir l'impact par rapport à la vitesse du dessin.