[Resolu] SpriteCollision et map()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[Resolu] SpriteCollision et map()

Message par blendman »

Salut

une autre question sur les sprites.
Voilà, j'utilise une map() pour stocker mes sprites (id, position, image...).

Et j'aimerais tester les collisions entre la souris (un sprite invisible de 1*1) et les sprites affichés (pour faire par exemple un système de bouton).
Le problème est que j'ai des sprites de fond qui font tout l'écran et que j'affiche en premier (pour qu'il soit recouvert par les autres sprites), c'est donc en général le premier élément testé dans la map et c'est toujours celui-ci que me renvoie ma procédure qui teste la collision entre le sprite de la souris et le sprite de ma map().

Ma question :
Comment puis-je faire pour tester les collisions en partant du dernier sprite créé (le plus proche de nous sur l'écran (celui dont le depth est le plus bas)) ?
Puis-je parcourir la map en sens inverse (en gros du dernier sprite testé au premier) ? si oui, comment ?

On ne peut pas trier les map() comme on trie les listes, donc je ne vois pas trop comment faire ^^.

Merci :)

EDIT : résolu avec la technique de Falsam (utiliser une map et une liste pour gérer le depth), merci ;)
Dernière modification par blendman le ven. 02/oct./2015 14:46, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SpriteCollision et map()

Message par falsam »

Hello Blendman. Ajoute un champs dans ta structure de map qui permet de dire si le sprite est physic ou pas ou non cliquable.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SpriteCollision et map()

Message par falsam »

blendman a écrit :On ne peut pas trier les map() comme on trie les listes, donc je ne vois pas trop comment faire ^^.

Code : Tout sélectionner

Structure User
  User.s
  Phone.s
EndStructure

Global NewList Users.User()
Global NewMap *Users.User()

Procedure UserAdd(User.s, Phone.s)
  AddMapElement(*Users(), User)
  *Users() = AddElement(Users())
  Users()\User = User
  Users()\Phone  = Phone
EndProcedure

UserAdd("Larache", "01.45.25.15.06")
UserAdd("Tricard", "04.39.69.25.10")
UserAdd("Olap", "02.63.24.54.13")
UserAdd("Agile", "06.31.22.92.92")

Debug #CRLF$+"# Map non triée"
ForEach *Users()
  Debug "  "+*Users()\User+" = "+*Users()\Phone
Next

SortStructuredList(Users(), #PB_Sort_Ascending|#PB_Sort_NoCase, OffsetOf(User\User), #PB_String)

Debug "# Map triée (En fait c'est bien la liste qui est triée)"
ForEach Users()
  Debug "  "+Users()\User+" = "+Users()\Phone
Next
Debug "Mais ça fait illusion"

Debug #CRLF$+"#Acces direct au téléphone de Larache"
Debug "Larache = "+*Users("Larache")\Phone
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: SpriteCollision et map()

Message par blendman »

C'est ce que je pensais faire : créer une liste pour le depth des sprites et c'est cette liste que je trierai et donc je me servirais pour le depth ou les collisions ;).

Je garde la map pour accéder facilement aux infos des sprites (par leur "id"), et j'utilise la liste pour certaines choses comme le depth, collision, etc..
Ajoute un champs dans ta structure de map qui permet de dire si le sprite est physic ou pas ou non cliquable.
Je vais ajouter des paramètres, mais le problème est que je fais un code très générique. De toute façon, ça ne résoudrait le problème qu'à moitié, car si un sprite A est physique et cliquable mais beaucoup plus grand qu'un autre B, tout en étant affiché derrière ce B, et bien je ne pourrais pas cliqué sur le B puisque le A (plus grand) est toujours celui qui est testé avant lui ^^.

Utiliser une liste pour le depth me semble être la solution, en plus, je devais gérer le depth, donc ça fait d'une pierre deux coups :D.
merci des infos, je vais tester ça ;)
Répondre