Création d'un masque de collision pour une image

Bonjour, le problème est assez "simple" ou plutôt court à expliquer. J'aimerais pouvoir positionner plusieurs images sans fond (png) dans une fenêtre, et pouvoir détecter par la suite quelle image est cliquée. J'aimerais n'utiliser que les classes standards de java, j'utilise ici javax.swing (mais je suis ouvert à d'autres propositions).
4 Replies
Maximeuuu
Maximeuuu13mo ago
Contexte Je pose un contexte mais je peux tout à fait changer d'outils : -> J'utilise un JFrame (que je veux transparent), avec un JPanel (transparent), je pose une image (à fond transparent) avec la classe awt.Graphics et un repaint(). Jusque là pas de problème, la fenêtre transparente n'est pas le problème non plus et quand je pose l'image elle s'affiche bien donc parfait. Bon par contre je ne sais pas comment récupérer les coordonnées de mon image ; son "hitbox". La solution la plus simple : créer un objet Rectangle, correspondant aux dimensions de l'image. Cependant l'image est complexe et ne correspond pas à un rectangle et je ne veux pas faire à la main un polygone adapté à cette image (vu que je veux en créer plusieurs différentes). Donc je suis un peu bloqué. Solutions ? J'ai évidemment déjà cherché un peu de mon coté et j'ai trouvé des solutions mais je ne pense pas que ça soit les meilleures solutions. Voici 2 propositions : 1. Utiliser plusieurs panels (transparents) avec chacun son propre Graphics, chaque panel contient une seule image et son propre MouseListener. Étonnamment, si je clique sur la partie du Panel "vide", ça ne détecte pas et si je clique sur l'image, ça détecte bien mon clic (avec précision). Cependant je suis obligé de créer un panel (et tout ce qui va avec) pour chaque images. 2. Utiliser un algorithme de détection des bords avant la génération de l'image, ainsi je génère automatiquement un polygone adapté (avec plus ou moins précision) à la forme de mon image ce qui me permet de connaitre ses coordonnées au niveau physique. Ca me semble être la solution la plus propre à coder, mais ça ne me semble pas optimisé. (j'ai déjà codé un jeu en cours avec cette méthode mais le jeu avait un nombre d'image limité et qui ne bougeaient pas).
Maximeuuu
Maximeuuu13mo ago
Vos conseils sont les bienvenus J'aimerais bien avoir vos avis, savoir si c'est possible, avoir des liens vers de la documentation, avoir des propositions... Je suis un étudiant donc je suis en pleins apprentissage de java entre autre mais je sais me débrouiller, chercher et me documenter. Et voici un lien vers mon projet si jamais vous voulez voir du code (je fais essentiellement des test pour l'instant) : https://github.com/Maximeuuu/Deskastre
GitHub
GitHub - Maximeuuu/Deskastre: Jeu en java de navigation spaciale.
Jeu en java de navigation spaciale. Contribute to Maximeuuu/Deskastre development by creating an account on GitHub.
hydrolien
hydrolien13mo ago
Je crois que par défaut le clic passe à travers les JComponent là ou ils sont transparents sur certains OS (au moins Windows) Si c’est pas le cas et que le click est attrapé par une sourcouche transparente, elle peut s’en rendre compte en vérifiant si le alpha du pixel clické est == 0, puis simuler un click sur la couche d’en dessous. Ainsi ce sera toujours la 1ère couche avec un pixel non transparent qui recevra le clic (après transmissiez depuis d’autres couches si nécessaire)
Maximeuuu
Maximeuuu13mo ago
linux aussi Après vérification, sur linux ça ne fonctionne pas (ça m'embête bien) Linux (Debian) : - Frame transparente - les clics ne passent pas au travers Windows (11) : - Frame transparente - les clics passent au travers
Want results from more Discord servers?
Add your server