Flèche plantée dans une entité

a marqué ce sujet comme résolu.

Salut !

Actuellement je m’amuse à développer un petit jeu avec un château qui tire des salves de flèches sur des assaillants. Et je rencontre un petit problème au niveau mathématiques..

Lorsqu’un assaillant reçoit une flèche, cette flèche lui devient associée. Ensuite l’animation de mort du personnage se joue (une simple rotation), et j’aimerai que la flèche reste plantée au même endroit tout en suivant la rotation de l’assaillant.

J’ai réalisé un petit code qui devrait marcher (SPOILER: non), voici les grandes lignes de ce code:

  • J’ai un système de collision en pixel perfect alors je récupère le premier point d’impact trouvé entre la flèche et l’ennemi

  • Je calcul la différence entre les coordonnées du point d’impact et les coordonnés de la flèche

  • Ensuite je calcul les nouvelles coordonnées du point d’impact en fonction de la rotation (l’origine et le centre du sprite de l’ennemi) :

float angle = Math.toRadians(360 - dAngleDegree);

float xM = m_ptImpact.x - ptOrigin.x;
float yM = m_ptImpact.y - ptOrigin.y;

float x = (xM * Math.cos(angle) + yM * Math.sin(angle) + ptOrigin.x);
float y = (-xM * Math.sin(angle) + yM * Math.cos(angle) + ptOrigin.y);

return new Vector2(x, y);
  • Pour terminer je récupère les coordonnées de la flèche en faisant une différence avec le nouveau point d’impact calculé

Et .. à priori ça ne fonctionne pas tout le temps, voir l’image ci-dessous :

image.png
image.png

Je ne suis pas très bon en maths, donc il y a possiblement plus simple .. ou j’ai fait une erreur que je n’arrive pas à voir.. ^^

Merci d’avance pour ceux qui prendront le temps de regarder ! :)

+0 -0

Bonjour, c’est la coordonnée du sprite de ton personnage qu’il faut prendre (la "hitbox") - pas son point d’impact.

Le calcul est le suivant :

distanceOA=sqrt((AxOx)²+(AyOy)²)distance_{OA} = sqrt( (A_x - O_x)² + (A_y - O_y)² )

ax=ox+distanceOAcos(angle)a_x = o_x + distance_{OA} * cos(angle)

ay=oy+distanceOAsin(angle)a_y = o_y + distance_{OA} * sin(angle)

Sachant que aa correspond au centre de ta flèche et oo au centre de ton personnage (= centre de rotation). L’angle doit-être calculé au début et c’est elle que tu dois incrémenter. Penses également à appliquer la rotation sur ta flèche pour conserver son angle (depuis son centre aa).

Tu as un exemple sur mon codepen : https://codepen.io/Yarflam/pen/jQoLrY

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte