Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Tower defense - Faire avancer plusieurs formes suivant un pa


bozo7417 Invité

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


Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

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 :
Index  Coords  Ennemi
  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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ninestars Hors ligne Membre Points: 2462 Défis: 24 Message

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 !
Lephenixnoir En ligne Administrateur Points: 24572 Défis: 170 Message

Citer : Posté le 13/11/2016 00:32 | #


Ninestars a écrit :
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.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 220 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd