Le Deal du moment :
SSD interne Crucial BX500 2,5″ SATA – 500 ...
Voir le deal
29.99 €

Aller en bas
Sphinx
Sphinx
Membre

Nombre de messages : 69
Distinction : aucune
Date d'inscription : 08/03/2016
https://genie23.fr/js-rmmv/mes-plugins-rmmv/

RPG Maker MV [Sprite_Button] Bug de coordonnées si utilisés avec une ancre

Mer 5 Déc 2018 - 16:38
Bonjour à toutes et tous,

En développant un système pour un éventuel projet de jeu que j'ai, je me suis trouvé confronté à un bug dans l'utilisation des sprites button. Comme tous les sprites, un sprite button peut être placé en fonction de coordonnées X et Y. Jusque là, ca va.

Comme tous les sprites toujours, on peut définir les coordonnées d'une ancre. Cette ancre (propriétés anchor.x et anchor.y d'un sprite) permet de positionner le sprite non pas en fonction de son coin supérieur gauche, mais d'un autre point n'importe où sur le sprite. L'ancre n'est pas exprimée en pixels, mais en un nombre décimal compris entre 0 (en haut ou à gauche) et 1 (en bas ou à droite) qui détermine le point d'origine du sprite à partir duquel seront appliquées les coordonnées du sprite.

Ainsi, avec anchor.x = 0.5 et anchor.y = 0.5, le sprite ne sera pas placé en fonction de son coin supérieur gauche mais en fonction de son centre. Où est l'intérêt de se compliquer la vie avec cette ancre, me direz-vous. Dans mon cas, l'intérêt est double.

Tout d'abord, en placant le sprite en fonction de son centre, j'ai pu le centrer très facilement en m'épargnant la peine de soustraire aux coordonnées voulues la moitié de sa largeur et la moitié de sa hauteur.
Ensuite, comme l'un de mes objectifs était de réaliser une pendule analogique,  il fallait que je fasse tourner les aiguilles. Et bien sûr, mes aiguilles étant des images trouvées sur internet, le point de rotation de la dite aiguille était centré en largeur (à peu près) et assez bas en hauteur (à +/- 86% de la hauteur du sprite, soit un anchor.y ~ 0.86 pour l'une d'entre elle). J'aurais bien sûr pu recalculer les coordonnées X et Y de mes aiguilles en fonction de ce point de rotation et de l'angle appliqué à l'aiguille, mais il était plus simple pour moi d'en passer par une ancre.
En effet, le point autour duquel s'effectue la rotation du sprite est déterminé par la position de l'ancre, qui est, par défaut à 0;0, soit le coin supérieur gauche.


Mais quel est le soucis alors ? Pour mes aiguilles, il n'y a eu aucun problème une fois calculé les bonnes coordonnées de l'ancre, puisque ce sont des sprites ordinaires sans interaction. Par la suite, j'ai trouvé aussi plus pratique, pour centrer une ligne d'un nombre impair de sprites carrés, de les placer en fonction de leur centre (ainsi le sprite du milieu avait comme coordonnée horizontale la moitié exactement de la largeur de la fenêtre de jeu). Mais cette fois-ci, ce n'étaient pas de simples sprites, mais bien des boutons, cliquables ! Et c'est là que les ennuis ont commencé.

Car, après avoir farfouillé dans les entrailles de RMMV à la recherche du calcul des coordonnées de clic pour qu'il détermine si le joueur a bien cliqué sur un bouton, j'ai découvert que si la rotation prenait en compte la position de l'ancre, il n'en était rien pour le calcul des coordonnées de clic. Ainsi, un clic n'est pris en considération pour un bouton donné que si les coordonnées du clic se trouve, dans le coin supérieur gauche, à la position X;Y du sprite button, et, pour le coin inférieur droit, à une distance exacte du premier représentant la hauteur et la largeur du sprite. Aucun problème donc, tant que les coordonnées X;Y du sprite correspondent à son coin supérieur gauche.

Mais ce n'était plus mon cas. J'aurais pu me passer de cette ancre, et recalculer les positions de mes sprites en soustrayant la moitié de sa largeur et de sa hauteur, mais j'ai préféré corriger ce que je considère être un bug, un oubli des développeurs de RMMV. Voici donc ma correction, un simple plugin sans paramètre à intégrer à son projet RMMV qui calcule le décalage entre le coin supérieur gauche et la position de l'ancre, et qui rectifie les coordonnées en fonction de ce décalage :
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum