Voici une nouvelle version de CheckCollision : CheckCollisionAngle !À quoi ça sert vous me dîtes : si vous avez la version enregistrée, vous utilisez surement image_angle pour que l'angle de la sprite suive la direction de votre objet. C'est la même chose pour ce script, il détecte les collisions selon un angle passé en paramètre...
Un exemple : vous faîtes un petit jeu de tank, vous voulez savoir s'il y a
collision entre le Mur et l'avant du tank (ex: pour faire reculer le tank un peu s'il y a
collision). Le tank peut tourner à 360 degrés, donc l'avant du tank peut être entre 0 et 360 degres. Juste à appeler la fonction pour voir s'il y a
collision à droite (car dans l'image de mon tank, le devant du tank pointe vers la droite), entre mon tank et l'objet Mur selon la direction de mon objet!!!
//Script : CheckCollisionAngle
//Par Loucheman, Crédit apprécié si vous utilisez ce script !
//Verifie s'il y a
collision avec un objet dans une direction précise avec un angle
//gauche signifie le côté gauche de la sprite quand l'angle est de 0 degre...
//argument0 : Position X à vérifier : normalement X de l'objet mais peut être différent si pour vérifier un futur mouvement par exemple
//argument1 : Position Y à vérifier
//argument2 : direction à vérifier
// 1 = droite
// 2 = haut
// 3 = gauche
// 4 = bas
//argument3 : angle de la sprite
//argument4 : objet à vérifier si
collision//argument5 : precice
// true = vérification précise de la
collision// false = vérification non précise de la
collision//Exemple : obj = CheckCollisionAngle(x,y,3,direction,Mur,false)
// "x" veut dire x de mon objet
// "y+1" veut dire 1 pixel en dessous de mon objet
// "4" veut dire détection en bas du sprite de mon objet
// ***en donnant y+1 comme paramètre j'effectue un test de
collision// 1 pixel en dessous de bbox_bottom de mon objet...
// Angle de la sprite (normalement direction)
// "VMur" est l'objet avec lequel je veut tester s'il y a une
collision// "false" veut dire détection non précise de la
collision avec VMur
// ***Donc en utilisant la bounding box de VMur...
var X,Y,x1,y1,x2,y2,x1Angle,y1Angle,x2Angle,y2Angle;
X = argument0
Y = argument1
switch (argument2)
{
case
1://droite {
x1 = X - sprite_xoffset + sprite_get_bbox_right(sprite_index) //+ 1
y1 = Y - sprite_yoffset + sprite_get_bbox_top(sprite_index)-0
x2 = X - sprite_xoffset + sprite_get_bbox_right(sprite_index) //+ 1
y2 = Y - sprite_yoffset + sprite_get_bbox_bottom(sprite_index)+0
x1Angle = lengthdir_x(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
y1Angle = lengthdir_y(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
x2Angle = lengthdir_x(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
y2Angle = lengthdir_y(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
http://Controller.STR=string(X)+" / "+string(Y)+" / "+string(x1)+" / " + string(y1)+" / " + string(x2)+" / " + string(y2)+" / "
http://Controller.STR=string(x1Angle)+" / " + string(y1Angle)+" / " + string(x2Angle)+" / " + string(y2Angle)+" / "
return collision_line(X+x1Angle,Y+y1Angle,X+x2Angle,Y+y2Angle,argument4,argument5,true)
break
}
case
2://haut {
x1 = X - sprite_xoffset + sprite_get_bbox_left(sprite_index)+2
y1 = Y - sprite_yoffset + sprite_get_bbox_top(sprite_index) //- 1
x2 = X - sprite_xoffset + sprite_get_bbox_right(sprite_index) -2
y2 = Y - sprite_yoffset + sprite_get_bbox_top(sprite_index) //- 1
x1Angle = lengthdir_x(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
y1Angle = lengthdir_y(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
x2Angle = lengthdir_x(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
y2Angle = lengthdir_y(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
return collision_line(X+x1Angle,Y+y1Angle,X+x2Angle,Y+y2Angle,argument4,argument5,true)
break
}
case
3://gauche {
x1 = X - sprite_xoffset + sprite_get_bbox_left(sprite_index) //- 1
y1 = Y - sprite_yoffset + sprite_get_bbox_top(sprite_index) -0
x2 = X - sprite_xoffset + sprite_get_bbox_left(sprite_index) //- 1
y2 = Y - sprite_yoffset + sprite_get_bbox_bottom(sprite_index)+0
x1Angle = lengthdir_x(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
y1Angle = lengthdir_y(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
x2Angle = lengthdir_x(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
y2Angle = lengthdir_y(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
return collision_line(X+x1Angle,Y+y1Angle,X+x2Angle,Y+y2Angle,argument4,argument5,true)
break
}
case
4://bas {
x1 = X - sprite_xoffset + sprite_get_bbox_left(sprite_index) +2
y1 = Y - sprite_yoffset + sprite_get_bbox_bottom(sprite_index) //+ 1
x2 = X - sprite_xoffset + sprite_get_bbox_right(sprite_index) -2
y2 = Y - sprite_yoffset + sprite_get_bbox_bottom(sprite_index) //+ 1
x1Angle = lengthdir_x(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
y1Angle = lengthdir_y(point_distance(X,Y,x1,y1),argument3+point_direction(X,Y,x1,y1))
x2Angle = lengthdir_x(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
y2Angle = lengthdir_y(point_distance(X,Y,x2,y2),argument3+point_direction(X,Y,x2,y2))
return collision_line(X+x1Angle,Y+y1Angle,X+x2Angle,Y+y2Angle,argument4,argument5,true)
break
}
default :
{
show_message("Mauvaise utilisation de la fonction CheckCollision!!!")
}
}