Je fais un jeu Tower Defense en Flash sans chemin prédéfini.
Bien que ma grille soit 40x40 (petite?), A * a du mal à recalculer à chaque fois. J'ai donc fait ma propre modification pour faciliter le recalcul et le nombre de cellules touchées a chuté à environ 900 (lors de la modification près de la racine). Il se fige encore pendant une durée très courte, mais détectable, lorsqu'une nouvelle tour est placée.
Est-ce un problème d'implémentation, ou est-ce que le 40x40 est trop?
Éditer:
La structure de mon code:
- Toutes les données sont enregistrées dans un tableau 2D de cellules.
- Chaque cellule contient son parent dans la direction du chemin (1-8 dans le sens des aiguilles d'une montre) et le tableau codé au niveau du bit de ses enfants dans le chemin (chaque bit représente un enfant).
- La recherche est effectuée par A * avec l'estimation de la distance euclidienne.
Réponses:
Je ne peux pas commenter, mais premier profil dans Flex, tout le reste est une conjecture.
la source
Je suppose que la TD est «Tower Defense»
Je pense que A * va un peu trop loin pour cela.
Au début du jeu, remplissez la zone de jeu des points de sortie pour créer une carte de mouvement:
et le mouvement est toujours vers un carré avec une valeur inférieure.
Lorsque le joueur place une tour, mettez à jour chacun des huit carrés adjacents: pour chaque carré, définissez sa valeur de mouvement à un de plus que la valeur adjacente la plus basse. Si la valeur change, répétez le processus centré sur le carré mis à jour. Ensuite, pour vérifier que l'itinéraire vers la sortie n'est pas bloqué, assurez-vous que tous les carrés sont adjacents à un carré de valeur inférieure.
Lorsque le joueur supprime une tour, définissez la valeur de mouvement sur un de plus que le carré adjacent le plus bas et répétez le processus ci-dessus.
Une approche plus simple serait de refaire le remblayage.
la source
Étrange, je pensais avoir répondu à cela, mais la réponse semble avoir disparu. Faites votre algorithme de recherche de sorte qu'il puisse être mis à jour en plusieurs étapes, de sorte que lorsque vous placez une tour et jouez une animation, vous pouvez faire un peu chaque image et vous aurez entre une demi-seconde et une seconde pour mettre à jour votre Un * sans pause notable. C'est la latence - si vous ne pouvez pas l'accélérer, trouvez un moyen de le cacher. Jouer une animation tout en plaçant une tour serait naturel pour un jeu et imo un bon endroit pour le cacher.
la source
Pour commencer, vous pouvez changer votre tableau en vecteur - devrait vous donner quelques améliorations de vitesse. Postez le code et nous pourrons peut-être suggérer plus d'optimisations.
la source
Je suppose que votre ralentissement est dû au fait que vous calculez un chemin pour tous les personnages simultanément. Le calcul d'un chemin pour un personnage est rapide, mais s'il y a deux douzaines de personnages dans la scène, cela peut s'enliser.
Au lieu de cela, vous devez répartir la charge sur quelques images. Étalez vos mises à jour de l'IA afin que différents personnages mettent à jour leur chemin sur différentes images. Ce serait vraiment perceptible si un personnage ne réagissait qu'une seconde plus tard, mais une seule image ne provoquerait pas de mauvaises réactions.
la source