
Messages : 282
GCPoints : 71266
|
Bon, voici mon premier tutoriel sur les collisions 2D, il ne s'agit pas du tutoriel complet, mais de la partie 1, je n'ai pas fini le reste.
Dites moi ce que vous en pensez, peut être que je ne suis pas clair du tout à certain moment, est-ce que ce premier schéma vous aide à comprendre? Peut-être que je m'éternise trop sur la commande Type au départ dites moi tout! je suis tout ouïe ^^
Détection de collision 2D
Dans cet article, je vais vous expliquer la méthode de collision la plus répandu sur le net.
Tout d'abord, voici quelques informations concernant mes schémas:
- le mur de collision est tracé en bleu.
- les points E1 et E2 sont les extrémités du mur.
- les pointillés bleus aux extrémités représentent le plan infini du mur.
- les ronds verts représentent le joueur.
- les chiffres 1, 2 et 3 dans les ronds verts représentent l'avancée du joueur dans le temps.
- les flèches vertes sont les directions du joueur.
- la ligne orange est la plus courte distance entre le joueur et le mur.
- le point P est donc la projection du joueur sur le mur.
Partie I
A) Pour commencer, on va créer un type de variable grâce aux commandes Type/EndType
Rappel de Type/EndType
Ces commandes permettent de créer un type de variable personnalisé, par exemple dans une variable "Mon_identite" on pourrait facilement stocké notre prénom, notre age, notre adresse, etc...
En gardant notre exemple, cela donne:
Code :
Type Type_Identite
Prenom as string `Variable de type texte
Age as integer `Variable de type nombre entier
Adresse as string `Variable de type texte
EndType
Puis on déclare la variable "Mon_identite" de type "Type_Identite"
Code :
Mon_identite as Type_Identite
La variable "Mon_identite" permet maintenant de stocker diverses informations,
Code :
Mon_identite.Prenom = "Merlin"
Mon_identite.Age = 100
Mon_identite.Adresse = "Dans une tour"
Mais revenons un peu à nos moutons...
Ces commandes vont avant tout nous servir dans notre programme pour créer des variables de type "Mur".
Mais de quelles informations avons nous besoin pour notre mur?
Tout d'abord, un mur a 2 extrémités, nous avons donc besoin de X1, Y1 pour E1 et X2, Y2 pour E2.
Ensuite, il nous faut des informations pour le calcul de collision, nous avons donc besoin de la longueur en x du mur(Lx), ça longueur en y(Ly), ça longueur au carré(L2) et ça longueur réelle(L).
Notre Type ressemblera alors à:
Code :
Type Type_Mur
X1 as float `Variable de type réel
Y1 as float `Variable de type réel
X2 as float `Variable de type réel
Y2 as float `Variable de type réel
Lx as float `Variable de type réel
Ly as float `Variable de type réel
L2 as float `Variable de type réel
L as float `Variable de type réel
EndType
On va maintenant stocké les informations d'un mur dans la variable "Mon_mur":
Code :
Mon_mur as Type_Mur
Mon_mur.X1 = 100
Mon_mur.Y1 = 100
Mon_mur.X2 = 300
Mon_mur.Y2 = 300
Mon_mur.Lx = Mon_mur.X2 - Mon_mur.X1
Mon_mur.Ly = Mon_mur.Y2 - Mon_mur.Y1
Mon_mur.L2 = Mon_mur.Lx^2 + Mon_mur.Ly^2
Mon_mur.L = Sqrt(Mon_mur.L2) `La commande Sqrt() renvoie la racine carrée d'un nombre
B) Nous allons maintenant créer 3 variables pour le joueur:
Code :
Joueur_x as float
Joueur_y as float
Taille as integer
Puis l'on va réglé la taille du joueur à 30:
Code :
Taille = 30
C) Ensuite, on va créé la fonction qui va nous permettre de projeter le joueur sur le mur, et donc de connaitre la plus courte distance du joueur au mur.
Schéma 1
Sur le schéma 1, la distance du joueur au mur en orange est la plus courte distance que l'on puisse avoir, cette distance est toujours perpendiculaire.
On constate que de l'étape 1 à l'étape 2, le joueur a avancé, mais à l'étape 3, les collisions n'étant pas encore présente, le joueur est passé de l'autre coté du mur et sa projection P n'est pas sur le mur mais sur un plan infini. Ce sera à nous de préciser au programme que notre mur n'a pas une longueur infini!
Mais occupons nous d'abord de créer notre fonction:
Nous avons besoins d'un coefficient qui va nous permettre de trouver la projection du joueur sur le mur. Voici la formule:
Code :
Coef as float
Coef = ((Joueur_x-Mur.X1)*Mur.Lx + (Joueur_y-Mur.Y1)*Mur.Ly) / Mur.L2
Ensuite, on va appliqué ce coefficient le long de notre mur en partant de sont origine X1 et Y1 pour pouvoir récupérer la position x et y de la projection:
Code :
Projection_x = Mur.X1 + Mur.Lx*coef
Projection_y = Mur.Y1 + Mur.Ly*coef
Puis nous allons calculer la distance du joueur au mur:
Code :
Distance = sqrt((Projection_x-Joueur_x)^2 + (Projection_y-Joueur_y)^2)
La Fonction ressemblera donc à ça:
Code :
Function Projection_du_joueur_sur_le_plan(Joueur_x as float, Joueur_y as float, Mur as Type_Mur)
Coef as float
Coef = ((Joueur_x-Mur.X1)*Mur.Lx + (Joueur_y-Mur.Y1)*Mur.Ly) / Mur.L2
Projection_x = Mur.X1 + Mur.Lx*coef
Projection_y = Mur.Y1 + Mur.Ly*coef
Distance = sqrt((Projection_x-Joueur_x)^2 + (Projection_y-Joueur_y)^2)
EndFunction
Attention, n'oubliez pas de déclarer les variables Projection_x, Projection_y et Distance de type nombre réel, et de les déclarer en Global.
Ajoutez les bien avant la boucle principale:
Code :
Global Projection_x as float
Global Projection_y as float
Global Distance as float
Et on fini la partie 1 avec un premier test:
Code :
sync on
sync rate 60
hide mouse
Type Type_Mur
X1 as float `Variable de type réel
Y1 as float `Variable de type réel
X2 as float `Variable de type réel
Y2 as float `Variable de type réel
Lx as float `Variable de type réel
Ly as float `Variable de type réel
L2 as float `Variable de type réel
L as float `Variable de type réel
EndType
Mon_mur as Type_Mur
Mon_mur.X1 = 100
Mon_mur.Y1 = 100
Mon_mur.X2 = 300
Mon_mur.Y2 = 300
Mon_mur.Lx = Mon_mur.X2 - Mon_mur.X1
Mon_mur.Ly = Mon_mur.Y2 - Mon_mur.Y1
Mon_mur.L2 = Mon_mur.Lx^2 + Mon_mur.Ly^2
Mon_mur.L = Sqrt(Mon_mur.L2)
Global Projection_x as float
Global Projection_y as float
Global Distance as float
Joueur_x as float
Joueur_y as float
taille as integer
Taille=30
do
rem On utilise les flèches pour se déplacer
if leftkey()=1 : a=a+3 : endif
if rightkey()=1 : a=a-3 : endif
if upkey()=1
Joueur_x=Joueur_x+cos(a)
Joueur_y=Joueur_y-sin(a)
endif
rem On utilise notre fonction pour calculer la projection
Projection_du_joueur_sur_le_plan(Joueur_x,Joueur_y,Mon_mur)
rem Affichage de la map
ink rgb(0,183,239)
line Mon_mur.X1,Mon_mur.Y1,Mon_mur.X2,Mon_mur.Y2
rem Affichage du joueur
ink rgb(34,177,76)
line Joueur_x,Joueur_y,Joueur_x+cos(a)*taille,Joueur_y-sin(a)*taille
circle Joueur_x,Joueur_y,taille
rem Affichage de la plus courte distance entre le joueur et le mur
ink rgb(255,127,0)
line Joueur_x,Joueur_y,Projection_x,Projection_y
Text 0,0,str$(Distance)
sync
cls
loop
Function Projection_du_joueur_sur_le_plan(Joueur_x as float, Joueur_y as float, Mur as Type_Mur)
Coef as float
Coef = ((Joueur_x-Mur.X1)*Mur.Lx + (Joueur_y-Mur.Y1)*Mur.Ly) / Mur.L2
Projection_x = Mur.X1 + Mur.Lx*Coef
Projection_y = Mur.Y1 + Mur.Ly*Coef
Distance = sqrt((Projection_x-Joueur_x)^2 + (Projection_y-Joueur_y)^2)
EndFunction
|