Forum de la communauté SFML
Aide => Général => Discussion démarrée par: Nikogram le Novembre 02, 2012, 05:11:37 pm
-
Bonjour à tous.
Je code actuellement un jeu en 2D isométrique. Le monde affiché est un ensemble de blocs où une interaction à la souris est possible pour chacun d'eux. L'ensemble de cubes est un vector de vector d'objets de type "Entite" (Entite est la classe qui représente un cube).
Visuellement un bloc est un sprite représenté par une image de 40*34, où trois faces du cube sont représentés (image du sprite ici : http://dl.dropbox.com/u/98268173/0.png). quand plusieurs cubes sont côtes-à-côtes, le cube le plus "devant" se place sur le cube juste "derrière" et cache donc les faces de cotés pour que les faces de haut des deux cubes soient alignés et collés.
Maintenant passons à mon problème (qui ne vient pas de l'affichage des cubes). Actuellement pour savoir si la souris est sur l'un des cubes, je scanne le vecteur de vecteur avec un double for, et exécute la méthode gererInteraction() de la classe Entite à chaque tour, qui me renvoie un booléen qui m'indique si la souris se situe exactement sur le cube. Si c'est le cas j'arrête la boucle for (inutile d'aller plus loin).
Cependant vu que le jeu tourne à 60 fps, le test du vector utilise pas mal de ressources au niveau du processeur (car c'est enfaite un vector à 3 dimensions, mais pour pas compliquer les choses restons sur du 2 dimensions). J'aimerais donc gérer les interactions d'une manière beaucoup moins lourde est brutale (parce que là je ne suis qu'au début du codage du jeu).
Mon idée serait de récupérer les coordonnées (relative à mon tableau de vector, pas les coordonnées des sprites en fonction de la fenêtre) de tous les cubes où la souris se situe dans son rectangle de sprite, puis de les tester un par un (le test serait donc extrêmement moins lourd) et sans passer par une double boucle.
Cependant là je bloque pour ma méthode. Je ne vois pas comment récupérer un minimum de cubes sans tous les scanner et les comparer au curseur de la souris.
J'aimerais donc avoir votre avis et votre aide, et si vous voyez une méthode assez intéressante n'hésitez pas à m'en parler.
Merci d'avance.
PS : j'ai pas fourni de code car je suis parti sur un cas assez général, mais si vous voulez que je le poste pour voir plus en détail comment je gère les tests dites le.
-
Mon idée serait de récupérer les coordonnées (relative à mon tableau de vector, pas les coordonnées des sprites en fonction de la fenêtre) de tous les cubes où la souris se situe dans son rectangle de sprite, puis de les tester un par un (le test serait donc extrêmement moins lourd) et sans passer par une double boucle.
Rien compris...
Mais sinon pas besoin de tester plusieurs trucs exhaustivement, tu peux récupérer le bon bloc en O(1), suffit de convertir tes coordonées de la souris en les coordonées (X,Y,Z) de ton jeu en vue isométrique, ce qui est pas forcemment trivial si il y a de la hauteur en plus, mais que de toute façon tu vas devoir faire à un moment sinon tu seras tout le temps bloqué.
En fait le résultat va dépendre de comment l'angle exact de ta vue iso (ie de à quel point sont applatis tes cubes, qui seraient des carrés si tu avais un angle de 0° avec le sol)
-
suffit de convertir tes coordonées de la souris en les coordonées (X,Y,Z) de ton jeu en vue isométrique, ce qui est pas forcemment trivial si il y a de la hauteur en plus
Enfaite je pense que la hauteur n'est pas un problème, car ce n'est qu'un abaissement des cubes dans la fenêtre (je diminue leur coordonnées y en fonction de leur hauteur).
Par contre je ne vois pas comment transformer les coordonnées de la souris en coordonnées de mon plan iso (chaque cube représente une unité).
Sinon il semble que c'est du 45° pour la vue iso , tu peux vérifier avec l'image de mon premier post.
Autrement je poste mes sources si tu as besoin de plus d'infos : http://dl.dropbox.com/u/98268173/Sources.zip
(Si certaines parties du code ne sont pas claires, dit le)
Je vais réfléchir sur la transformation des coordonnées, mais si tu peut m'indiquer un peu comment m'y prendre ça m'aiderait.
-
J'ai finalement réussi à coder la méthode que je voulais utiliser.
Ca consiste à récupérer deux valeurs de x et trois valeurs de y (coordonnées en fonction de mon plan isométrique) puis d'exécuter la méthode gererInteractions() avec toutes les combinaisons possibles de ses coordonnées. Ca permet de tester (pour chaque hauteur) 6 cubes au lieux de 3025 (si c'est une map de 55*55 cubes).
Au final j'ai bien un gain de performance (moins de 1% de mon processeur est utilisé, au lieux de 10% avant, ce que était mon objectif).
Mais merci quand même pour tes conseils lezebulon :)