Salut
Je suis encore débutant mais pour j´essaie de m´améliorer et justement, je bosse en ce moment sur un petit moteur de jeu et l´éditeur de niveau, mais je bloque sur quelques points
Pour commencer, meme si c´est plus une question a part que pour le moteur, je me demandais si idéalement, au niveau optimisation, déclarer des variables dans les fonctions est propre, puisque a chaque passage, une variable va être créé et donc bouffer un peu de ram. Donc je me demandais si mon résonnement était juste, et si oui, est-ce que c´est négligeable?
Ensuite, sur le moteur : je m´occupe en ce moment des collisions, et pour cela, en plus des collision perso/objets, il est toujours utile de pouvoir tracer des lignes invisibles que le perso ne pourra pas dépasser.
J´ais donc écris une fonction a laquelle je donne 4 arguments (x et y du point de départ et d´arrivée) et la fonction se charge de tracer ma ligne et de vérifier chaques points de cette ligne si il n´y a pas collision avec le perso. A partir de ça j´ais deux questions.
La première, est au niveau de la vitesse d´exécution. Je me demandais si tester chaques points de la ligne, surtout si elle est longue et s´il y en a beaucoup, ne risquait pas de faire ramer l´appli au bout du compte.
Ce qui m´amène a la deuxième question : pour éviter de faire ramer, je me suis dit (logiquement) que j´allais protéger l´appel de la fonction si la ligne ne traverserait pas l´écran, et auquel cas il ne servirait a rien de tester les collisions, ni tracer la ligne. Mais justement, je ne vois pas comment, uniquement a partir de x et y du point de départ et d´arrivée, arriver a prévoir si un bout de la ligne passera dans l´écran. Par exemple si x1=-2 ; y1=600 ; x2=600 ; y2=-2 , les deux points sont en dehors de l´ecran mais un bout la ligne le traversera.
Donc comment faire pour prévoir ce cas?
Voila, merci d´avance
Hello
déclarer des variables dans les fonctions est propre
Tout depends quelle utilisation pour ces variables.
Pour des variables locales, c´est bien de les laisser dans les fonctions. Ca ira plus vite (car ca utilise la memoire appellée "pile").
"il est toujours utile de pouvoir tracer des lignes invisibles que le perso ne pourra pas dépasser."
Il faut que tu nous explique ce que tu veux faire exactement et pourquoi et on te dira ce qui est le mieux.
Mon premier conseil, c´est de bien separer l´affichage et la gestion des collisions. Ca separe les problemes et tu y verra deja plus clair.
Pour tes lignes, tu peux utiliser une equation, ce qui ira plus vite que tester chaque point.
Pour des variables locales, c´est bien de les laisser dans les fonctions. Ca ira plus vite (car ca utilise la memoire appellée "pile").
Oui je parlais bien des variables locales, merci donc pour l´info
Il faut que tu nous explique ce que tu veux faire exactement et pourquoi et on te dira ce qui est le mieux.
Je ne vois pas bien comment mieux expliquer, c´est juste une ligne "invisble" qui interdira au perso de se déplacer plus loin.
Mon premier conseil, c´est de bien separer l´affichage et la gestion des collisions. Ca separe les problemes et tu y verra deja plus clair.
Pas de problème de ce coté puisque les lignes n´ont pas d´affichage : elles se résument a 4 variables (x1,x2,y1 et y2)
Pour tes lignes, tu peux utiliser une equation, ce qui ira plus vite que tester chaque point.
Utiliser une equation? Tu aurais un exemple, je ne vois pas bien ce que tu veux dire ![]()
"c´est juste une ligne "invisble" qui interdira au perso de se déplacer plus loin."
Dis nous en un peu plus sur le jeu lui meme. 2D, 3D, 2D isometrique, un perso qui se deplace comment, qui est vu comment ? Bref soit un peu plus bavard.
Un screenshots c´est encore mieux.
Utiliser une equation? Tu aurais un exemple
Par exemple une ligne peut etre ecris sous la forme ax+by+c=0
et lorsque tu mets des valeurs x,y tu peux savoir si le point en question est d´un coté ou l´autre de la ligne (si le resultat est positif, ou negatif) ou meme sur la ligne (si le resultat est 0).
Dans ton cas ce ne sont pas des lignes infinies, donc il faut adapter pour tester si tu est bien dans le segment qui t´interresse.
Donc en gros ca revient a faire un seul test, plus qu´autant de test par lignes.
Alors tout d´abord : si les lignes a tester sont gentillement horizontales ou verticales, le calcul sera beaucoup plus simple : donc déja, isole bien les cas de collisions avec les lignes horizontales ou verticales, des collisions avec des lignes obliques.
Ton perso est représenté par une boite englobante ?
Si c´est le cas, avec des lignes horizontales ou verticales, c´est trivial [...]
Pour une ligne oblique, tu peux prendre une définition vectorielle de la ligne. La ligne AB sera définie par A + vecteur(AB).
Le vecteur AB se calcule facilement a partir de tes 4 parametres (2 soustractions)
Il te suffit de calculer l´intersection de cette ligne avec les 4 segments que composent la boite englobante : si il y a une intersection ou plus, alors tu touches.
Tu peux en outre savoir si tu touches a gauche ou a droite de la ligne (vectoriellement, elle a une direction), grace a un produit scalaire.
(je survole, tu me diras ce que tu veux exactement)
Pour "clipper" ta ligne : c´est a dire ton probleme "d´affichage" dans l´écran, meme si les points sont a l´extérieur, c´est la meme chose : calculer les intersections de la boite englobante... de l´écran !
Note : ce probleme n´aura plus lieu d´etre si tu calcules directement les points d´intersection de la ligne avec la boite englobante : que ta ligne fasse 3 millimetres ou 150 kilometres, le calcul d´intersection est le meme.
Tu maitrises bien tout ce qui est vecteurs ? systemes d´équations ?
Dis nous en un peu plus sur le jeu lui meme. 2D, 3D, 2D isometrique, un perso qui se deplace comment, qui est vu comment ? Bref soit un peu plus bavard.
Alors le "jeu" est en 2D normale, le perso se déplace avec la souris (1/40 de la distance perso -> souris par frame) mais sa ne change rien au niveau collision.
Par exemple une ligne peut etre ecris sous la forme ax+by+c=0
et lorsque tu mets des valeurs x,y tu peux savoir si le point en question est d´un coté ou l´autre de la ligne (si le resultat est positif, ou negatif) ou meme sur la ligne (si le resultat est 0).
En fait je dois faire une sorte de dérivée quoi...
Si non je n´ais pas vraiment compris, a quoi correspondent exactement les 5 lettres?
Il te suffit de calculer l´intersection de cette ligne avec les 4 segments que composent la boite englobante : si il y a une intersection ou plus, alors tu touches.
Le perso est bien représenté en bouding box , donc ce que tu dit revient a peu près a ma question de départ, a savoir comment prévoir qu´il y a intersection (sauf que je l´avais formulé un peu autrement
)
En tout cas merci pour vos réponses
si ton moteur de jeu comporte des collisions, ben elles peuvent aussi concerner les autres élément ,donc le fait de ne pas utiliser la partie qui n´est pas affichée à l´écran peut être une erreur selon l´utilisation de la ligne
Tu peux aussi utiliser le système de détection de collisions perso/objet en créant des objets "masques" frontières.
Tu te bases alors sur la détection de collision avec ce type d´objet pour bloquer le perso le long de frontières invisibles.
Ca a l´avantage d´utiliser le système de collision existant et te permet aussi d´avoir des frontières irrégulières (genre le bord d´une forêt).
Et ça sera aussi plus réaliste: se retrouver bloqué sur une ligne "invisible" sans réelle coïncidence avec le décor est énervant. ![]()
si ton moteur de jeu comporte des collisions, ben elles peuvent aussi concerner les autres élément ,donc le fait de ne pas utiliser la partie qui n´est pas affichée à l´écran peut être une erreur selon l´utilisation de la ligne
En fait je comptais justement ne rien faire marcher en dehors de l´ecran, donc rien a gérer de ce coté la.
Tu peux aussi utiliser le système de détection de collisions perso/objet en créant des objets "masques" frontières.
Effectivement je pourrais faire comme sa, mais je comptais aussi utiliser les lignes autrement que des frontiere, et me servir d´objet invisible dans ces cas là serait un peu idiot...
Sinon avec ma methode (tester chaque pixel individuellement) j´ais parfois le perso qui traverse la ligne. Je suppose que c´est du a la vitesse de déplacement qui fait que desfois il traverse cette ligne sans meme avoir été détécté en temps que "collsision". Donc je pense changer de methode et me tourner vers ce que lapintade avait dit (l´equation). Quelqu´un sait où je pourrais en savoir un peu plus là dessus?
Donc pour l´equation, si j´ais bien compris, X et Y représentent les coordonées X et Y du point a tester. J´aurais donc a effectuer 4 fois ce test pour les 4 coins du bouding box du perso. Mais je ne sais toujours pas a quoi correspondent a,b et c.
Quelqu´un peut m´aider
désolé pour le double post
Ok je pense avoir compris. L´equation au final devient (xb-xa)(y-ya)-(yb-ya)(x-xa),dites-moi si je me trompe, par contre, comment savoir de quel coté se trouve le point si l´equation n´est pas egale a 0 ?
Personnelement, je trouve l´equation y=ax+k plus simple a interpreter. J´explique:
- x et y, pas besoin d´expliquer.
- le a s´appele le taux de variation, il represente la "pente" de ta droite. Si le a=1, ta droite sera a 45 degree, car chaque point est un pixel a droite et un pixel en haut a comparer du point precedent.
ca ressemble a ca: /. Si le a=-1, pense a ca \. Maintenant, si le a est superieur a 1, ca signifie le nombre de pixel vers la droite pour un pixel vers le haut( si il est negatif, c´est pour chaque pixel vers le bas). EX. a=2, chaque pixel se deplace de deux pixel vers le haut, et dune pixel vers la droite. Si a=1/2, c le contraire, 2 vers la droite, 1 vers le haut.
-le k lui represente a quel "hauteur" se trouve ta droite lorsqu´elle est a gauche completement de ton ecran.
EX: y=2x+5 ----------> voila comment tes pixel ce placeront: (coordonnees) (0;5) (1;7) (2;9) (3;11) etc
EX: y=-1/2x+20 ---------> (0;20) (1;19.5) (2;19) (3,18.5) etc
Cette equation est la meme que ax+by+c=0, mais les parametres de celle-ci ne signifie rien
Desolee,
Maintenant, si le a est superieur a 1, ca signifie le nombre de pixel vers la droite pour un pixel vers le haut
Maintenant, si le a est superieur a 1, ca signifie le nombre de pixel vers le HAUT pour un pixel vers la DROITE.
Oui une fonction affine quoi.
Mais le but est de savoir s´il y a collision ou non entre la ligne et le perso. Donc d´après ce que j´ais compris, pour l´autre equation, il suffit d´appliquer l´equation au 4 coins du perso puis de tester si les 4 resultat sont du meme signe, s´il y en a un qui diffère des autres, alors il y a collision.
Par contre je ne vois pas trop comment le faire avec la tienne.