Probleme avec canon/projectile est PointX/PointY(Origin)

Hep !

Rapport un souci j’ai trouvé une piste d’astuce, mais qui me fait me heurter encore au probleme de ces PointX et PointY des sprites codés en dur…

En gros j’ai un canon qui tire à 360 degrés, les projectiles tirés ont dimension de 44x20px :

  • chaque projectile tiré est créé au bout du canon sur canon.PointX(bout_du_canon);canon.PointY(bout_du_canon)
  • le projectile à sa création est orienté vers sa cible, soit cible.PointX(Centre);cible.PointY(Centre).

Vu la taille du projectile, il apparait donc en décalé par rapport au bout du canon, de manière très aléatoire, puisque qu’apparemment l’action “orienter” utilise le “Centre” de l’objet projectile pour la rotation.

La seule solution que j’ai trouvé en dur, c’est de changer le point de la sprite Origin pour lui donner les mêmes coordonnées que le point Centre ; ce qui induit une édition de la sprite… Et dans mon cas c’est pas satisfaisant du tout !

Bon j’ai bien essayé de faire une formule de correction en fonction de la largeur/hauteur du projectile, mais c’est encore pire, si l’angle du canon/projectile est entre -30 et 30 ça marche, mais pour tous les autres angles le projectile apparait aléatoirement tantôt décalé à droite ou gauche, et même pire il bouge également sur sur l’autre axe (on a l’impression que le projectile est tiré au centre) !

Bon en ça, je me doute(et c’est le but de ce poste) qu’il y a une solution en faisant un calcul mais on dirait que même le point bout_du_canon me joue une farce…

Sinon l’autre solution, c’est peut-etre une évolution envisageable sous GD… que PointX et PointY ne soient plus en dur sur les noms des points, et que l’ont puisse grace à une action modifier les valeurs de ces points.
Si j’arrivais simplement à dire un truc du genre :
-“faire projectile.PointX(un_point),projectile.PointY(un_point) à projectile.PointX(un_autre_point),projectile.PointY(un_autre_point)”

  • ou même “faire XXX;XXX à projectile.PointX(un_point_au_hasard);projectile.PointY(un_point_au_hasard)” ça serait vraiment super uber sympa :slight_smile:.

Après viens un autre problème au niveau des points : “je veux les modifier uniquement pour une frame d’une animation” ou “je veux les modifier uniquement pour une animation” ou “je veux les modifier dans deux animations” ou "je veux les modifier dans deux directions d’une animation…

Pour ce que tu expliques, c’est complètement inutile.
Si j’ai bien compris, ceci devrait fonctionner :

Mettre projectile à char.PointX(canon) - projectile.PointX(Centre) ; char.PointY(canon) - projectile.PointY(Centre) 

Attention à faire cela dans une action séparée de l’action de création du projectile : sinon il ne sera pas encore créé quand la position de son point “Centre” sera demandée.

Si je prends ce que tu me donnes, bizarrement ça ne marche pas ! les tirs partent tous du coin supérieur gauche de l’écran (soit 0;0), et bien entendu je bouge la position du projectile après sa création.

Et du coup, avant de tester ta solution qui pourtant est simple, j’avais fait ça :
Faire = canon.PointX(bout_du_canon) - (projectile.Width()/2) ; canon.PointY(bout_du_canon) - (projectile.Height()/2) à la position de l’objet projectile

Ca fonctionne (comme devrait fonctionner ton exemple encore plus logique et simple) mais c’est pas encore parfait, y’a des projectiles vraiment décalés entre 90° et 180°, mais je ne m’explique pas pourquoi ta méthode avec PointX(Centre) donne ce résultat…

EDIT : c’est un truc de fou, en fait sur l’angle 180° à 90° nikkel, mais dans cet autre angle mort le projectile spawn genre à des fois plus d’un cm de là où il devrait !

Bon j’ai tjrs pas la réponse du pourquoi Width()/2 fonctionne et pas PointX(Centre)…

Je crois néanmoins avoir trouvé le probleme, il est perceptif : mon canon tourne à une vitesse angulaire de 2160°, et il ne tire que si la cible est dans un angle de tolérance de max 10°, donc on se retrouve avec le canon qui tire alors qu’il est en rotation, d’où l’impression d’avoir un tir qui sort d’un cm à coté… Je me doutais que ce paramètre joauit mais je pensais pas à ce point (notamment quand je réduis l’échelle du temps)…

Donc on dirait que le problème est solutionné… donc :

  1. probleme d’angle et viotesse de rotation du canon (donc j’ai créé une condition pour que la rotation se fasse en 2 temps à 2 vitesse différente)

  2. en utilisant PointX()/PointY() et -projectile.Width() ou Height() divisé par 2.


Pour en revenir à ma suggestion et ce que tu disais sur les sprites :

ca serait pas un probleme ? au contraire ça serait top puisque dores et déjà les points de la sprite sont propre à chaque animation ? on pourrait tout controller avec des boucles “tant que” voir des actions spécifiques.

modifier le point p sur toutes les images de l’animation n
modifier le point p sur limage i de l’animation n

Etc. J’aurais ce genre de controle sur les sprites je serais ravi :slight_smile: Encore mieux si je pouvais faire la même sur les poins des masques de collision !