CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] tracé de ligne

-MasterLink-
-MasterLink-
Niveau 6
05 novembre 2007 à 15:43:58

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

Lapintade
Lapintade
Niveau 30
05 novembre 2007 à 16:33:46

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.

-MasterLink-
-MasterLink-
Niveau 6
05 novembre 2007 à 17:37:10

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"). :d) Oui je parlais bien des variables locales, merci donc pour l´info :-d

Il faut que tu nous explique ce que tu veux faire exactement et pourquoi et on te dira ce qui est le mieux. :d) 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. :d) 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. :d) Utiliser une equation? Tu aurais un exemple, je ne vois pas bien ce que tu veux dire :p)

Lapintade
Lapintade
Niveau 30
05 novembre 2007 à 21:29:51

"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.

Fvirtman
Fvirtman
Niveau 10
06 novembre 2007 à 00:54:17

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 ?

-MasterLink-
-MasterLink-
Niveau 6
06 novembre 2007 à 15:48:49

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. :d) 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). :d) 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. :d) 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 :p) )

En tout cas merci pour vos réponses

final-hearts
final-hearts
Niveau 10
06 novembre 2007 à 16:56:47

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

Kameha_0
Kameha_0
Niveau 2
06 novembre 2007 à 17:51:34

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. :-)))

-MasterLink-
-MasterLink-
Niveau 6
07 novembre 2007 à 15:14:13

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 :d) 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.
:d) 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... :p)

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?

-MasterLink-
-MasterLink-
Niveau 6
10 novembre 2007 à 12:05:43

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

-MasterLink-
-MasterLink-
Niveau 6
10 novembre 2007 à 12:20:08

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 ?

halo4ever
halo4ever
Niveau 6
10 novembre 2007 à 17:29:53

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

halo4ever
halo4ever
Niveau 6
10 novembre 2007 à 17:32:18

Desolee,

Maintenant, si le a est superieur a 1, ca signifie le nombre de pixel vers la droite pour un pixel vers le haut

:d)

Maintenant, si le a est superieur a 1, ca signifie le nombre de pixel vers le HAUT pour un pixel vers la DROITE.

-MasterLink-
-MasterLink-
Niveau 6
10 novembre 2007 à 17:42:20

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.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment