Optimisation Du Placement De Flèches : Guide Complet
Salut les amis ! On va parler d'améliorer le système de placement des flèches dans notre jeu. Actuellement, il y a quelques petits soucis : les flèches ne se placent pas exactement là où on veut, et il y a des zones d'interdiction un peu trop larges. Le but du jeu est de rendre le placement des flèches plus précis et plus intuitif. On va s'assurer que vous puissiez placer vos flèches exactement là où vous le souhaitez, tout en évitant les obstacles. Accrochez-vous, ça va être fun !
Le Problème Actuel : Zones Interdites et Précision
Le système actuel a quelques défauts. Premièrement, la zone d'interdiction autour des éléments comme les fusées (goals) est trop grande. On ne peut pas placer de flèches à deux cases de distance, ce qui limite un peu la stratégie. Deuxièmement, certains éléments essentiels ne sont pas pris en compte dans les zones interdites. Les murs (walls) et les flèches des autres joueurs ne bloquent pas le placement des flèches, ce qui peut mener à des situations gênantes. On va donc corriger ces problèmes pour rendre le jeu plus agréable et plus précis.
Fichier Source : src/player.ts:125
Le cœur du problème se trouve dans le fichier src/player.ts
, à la ligne 125. Cette ligne est celle qui vérifie si l'endroit où vous essayez de placer une flèche est une zone interdite. Actuellement, elle utilise un multiplicateur (* 2
) pour créer une zone d'interdiction plus large que nécessaire. De plus, elle ne prend pas en compte tous les éléments qui devraient bloquer le placement des flèches.
const isOnForbiddenPlace = forbiddenPlaces.some(obj => obj.collides({position} as MovingObject, obj.norm * 2));
Problèmes Clés à Résoudre
- Zone d'interdiction élargie : Le multiplicateur
* 2
crée une zone d'interdiction qui est trop large, empêchant le placement précis des flèches. - Absence des murs : Les
walls
ne sont pas inclus dans la liste des zones interdites. - Absence des flèches des autres joueurs : Les flèches des autres joueurs ne sont pas prises en compte dans les zones interdites.
On va voir comment résoudre ces problèmes en détail.
Solution Proposée : Amélioration et Précision
La solution proposée vise à améliorer la précision du placement des flèches et à étendre les zones d'interdiction pour inclure tous les éléments pertinents. Cela signifie que les joueurs pourront placer leurs flèches avec plus de contrôle et de stratégie.
1. Correction de la Zone de Collision : Précision au Pixel Près
On va remplacer la méthode actuelle de calcul des zones interdites par une méthode qui vérifie exactement la position de la flèche. Au lieu d'une zone d'interdiction large, on s'assurera que la flèche ne peut pas être placée sur la case exacte des éléments interdits.
Ancien code :
const isOnForbiddenPlace = forbiddenPlaces.some(obj => obj.collides({position} as MovingObject, obj.norm * 2));
Nouveau code :
const isOnForbiddenPlace = forbiddenPlaces.some(obj => {
const dx = Math.abs(obj.position[0] - position[0]);
const dy = Math.abs(obj.position[1] - position[1]);
return dx < obj.norm && dy < obj.norm;
});
Ce nouveau code calcule la distance exacte entre la position de la flèche et les éléments interdits. Si la distance est inférieure à la taille de l'élément, la flèche ne pourra pas être placée.
2. Extension des Éléments Interdits : Couverture Complète
On va modifier le code dans le fichier queue.ts
pour inclure les murs et les flèches des autres joueurs dans la liste des zones interdites. Cela empêchera les joueurs de placer des flèches sur ces éléments, améliorant ainsi la clarté et la jouabilité.
Ancien code (dans queue.ts
) :
playerArrow.arrow(payload, playerArrow.position, [...this.players.map(player => player.arrows).flat(), ...this.currentGame.currentStrategy.goals]);
Nouveau code (dans queue.ts
) :
const otherPlayersArrows = this.players
.filter(p => p.key !== playerArrow.key)
.map(player => player.arrows)
.flat();
const forbiddenPlaces = [
...otherPlayersArrows,
...this.currentGame.currentStrategy.goals,
...this.currentGame.currentStrategy.walls
];
playerArrow.arrow(payload, playerArrow.position, forbiddenPlaces);
Ce nouveau code récupère d'abord les flèches des autres joueurs. Ensuite, il crée une liste forbiddenPlaces
qui inclut les flèches des autres joueurs, les fusées et les murs. Finalement, la méthode playerArrow.arrow()
est appelée avec cette liste, s'assurant que le placement des flèches est bien vérifié contre tous ces éléments.
Critères d'Acceptation : Ce qu'on Veut Obtenir
Pour s'assurer que tout fonctionne comme prévu, on a quelques critères d'acceptation : ce sont des points à vérifier pour s'assurer que les changements ont bien été effectués. On va s'assurer que les flèches se placent exactement là où on veut, en respectant les règles du jeu.
- Placement précis : Les flèches ne peuvent être placées que sur les cases exactes, pas sur une zone élargie.
- Pas sur les murs : Impossible de placer une flèche sur un mur.
- Pas sur les fusées : Impossible de placer une flèche sur une fusée.
- Pas sur les flèches des autres joueurs : Impossible de placer une flèche sur la flèche d'un autre joueur.
- Remplacement possible : Possible de placer une flèche sur ses propres flèches (pour les remplacer).
- Limite inchangée : La limite de 3 flèches par joueur reste inchangée.
- Alignement : L'alignement sur la grille reste inchangé.
Impact sur le Jeu et Bénéfices
Ces améliorations vont avoir un impact positif sur l'expérience de jeu. Le placement des flèches sera plus précis, ce qui permettra aux joueurs d'exécuter des stratégies plus sophistiquées. En évitant les placements accidentels sur les murs ou les flèches des autres joueurs, on réduit les frustrations et on augmente le plaisir de jeu. De plus, en ayant un système de placement plus intuitif, les nouveaux joueurs pourront mieux comprendre les mécanismes du jeu.
Labels et Fichiers Concernés
- Label :
enhancement
(amélioration). - Fichiers concernés :
src/player.ts
(méthodearrow()
).src/queue.ts
(appel de la méthodearrow()
).