pour les collisions j'avais fait ça a une epoque
une procedure de "Super collision"
elle a la particularité d'indiquer exactement ou a lieu la collision sur un polygone de 4 cotés
je pense que ça repond a la question ....
garder en tete, qu'il s'agit d'une procedure de collision , donc le test n'a lieu qu'au moment de la colision
ça indique si on est dessous, dessus, a gauche , a droite et aussi en bas a gauche, en bas a droite , en haut a gauche, en haut a droite
et Dedans ou en dehors ....
bougez la souris pour voir ce qui est ecrit en haut a gauche de l'ecran
Code : Tout sélectionner
; prg realisé par Dobro
#dobro=1
#Police=1
#sprite=1
Declare.s super_collision(sprite_numero1, x_sprite1, y_sprite1, sprite_numero2, x_sprite2, y_sprite2)
; cette procedure renvoie du quelle coté le sprite a été touché !
; sprite_numero1= le numero du sprite 1 a tester
; largeur_spr1 = largeur en pixel du sprite numero 1
; hauteur_spr1 = hauteur en pixel du sprite numero 1
; x_sprite1 = coordonée X du sprite numero 1
; y_sprite1=coordonée Y du sprite numero 1
; --------------------------------------------------------------------------
; sprite_numero2= le numero du sprite 2 a tester
; largeur_spr2 = largeur en pixel du sprite numero 2
; hauteur_spr12 = hauteur en pixel du sprite numero 2
; x_sprite2 = coordonée X du sprite numero 2
; y_sprite2 coordonée Y du sprite numero 2
Enumeration
#Window
#sprite_cible
#sprite_souris
#sprite_text
EndEnumeration
Structure sprite
x.w
y.w
EndStructure
Dim sprite.sprite(1)
Dim ecran(640,400)
For x = 0 To 640 ; un écran de couleurs aléatoires
For y = 0 To 400
r=Random(255)
G=Random(255)
b=Random(255)
c=RGB(r,G,b)
ecran(x,y)= c
Next y
Next x
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(#Window, 0, 0, 800, 600, "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
Result = OpenWindowedScreen(WindowID(#Window),0,0, 800, 600, 1, 0,0)
CreateSprite( #sprite_cible, 64, 64) ; sprite exemple
StartDrawing(SpriteOutput( #sprite_cible) ) ; on dessine dedans
Box(0, 0, 64, 64, RGB($FF,$0,$80))
StopDrawing()
CreateSprite( #sprite_souris, 32, 32) ; sprite souris
StartDrawing(SpriteOutput( #sprite_souris) ) ; on dessine dedans
Box(0, 0, 64, 64,RGB($13,$F8,$7))
StopDrawing()
bord$="aucun bord"
CreateSprite(#sprite_text, 150,14) ; le text
StartDrawing(SpriteOutput(#sprite_text) ) ; on dessine dedans
DrawText(1,1,bord$,RGB(0,0,0), RGB(255,255,255))
StopDrawing()
Resultat = InitMouse()
Repeat
ExamineMouse()
Event=WindowEvent()
DisplaySprite(#sprite_cible, WindowWidth(#Window) /2+50, WindowHeight(#Window)/2+100)
sprite(1)\x=WindowWidth(#Window)/2+50
sprite(1)\y=WindowHeight(#Window)/2+100
DisplaySprite(#sprite_souris, MouseX(), MouseY())
DisplaySprite( #sprite_text, 10, 10)
bord$=super_collision(#sprite_cible, sprite(1)\x,sprite(1)\y, #sprite_souris,MouseX(), MouseY())
StartDrawing(SpriteOutput(#sprite_text) ) ; on dessine dedans
DrawText(1,1," ", RGB(0,0,0), RGB(255,255,255))
DrawText(1,1,bord$,RGB(0,0,0), RGB(255,255,255))
StopDrawing()
If MouseButton(2)
End
EndIf
FlipBuffers():; affiche l'ecran
ClearScreen(RGB(0, 0, 0)) :;efface l'ecran
Until Event=#PB_Event_CloseWindow
Procedure.s super_collision(sprite_numero1, x_sprite1, y_sprite1, sprite_numero2, x_sprite2, y_sprite2)
; code Dobro
spr1_milieu_x=x_sprite1+SpriteWidth(sprite_numero1) /2
spr1_milieu_y=y_sprite1+SpriteHeight(sprite_numero1)/2
spr2_milieu_x=x_sprite2+SpriteWidth(sprite_numero2)/2
spr2_milieu_y=y_sprite2+SpriteHeight(sprite_numero2)/2
spr1_hauteur=SpriteHeight(sprite_numero1)
spr1_largeur=SpriteWidth(sprite_numero1)
spr2_hauteur=SpriteHeight(sprite_numero2)
spr2_largeur=SpriteWidth(sprite_numero2)
If SpriteCollision(sprite_numero1,x_sprite1, y_sprite1,sprite_numero2,x_sprite2, y_sprite2)
If spr2_milieu_x<x_sprite1 And spr2_milieu_y<y_sprite1
bord$="haut-gauche a cheval "
Goto suite
EndIf
If spr2_milieu_x>(x_sprite1+spr1_largeur) And spr2_milieu_y<y_sprite1
bord$="haut-droit a cheval "
Goto suite
EndIf
If spr2_milieu_x>x_sprite1+spr1_largeur And spr2_milieu_y>y_sprite1+spr1_hauteur
bord$="bas-droit a cheval "
Goto suite
EndIf
If spr2_milieu_x<x_sprite1 And spr2_milieu_y>y_sprite1+spr1_hauteur
bord$="bas-gauche a cheval"
Goto suite
EndIf
If x_sprite2+spr2_largeur>x_sprite1 And x_sprite2<x_sprite1+spr1_largeur And spr2_milieu_y<y_sprite1
bord$="haut a cheval "
Goto suite
EndIf
If y_sprite2+spr2_hauteur>y_sprite1 And y_sprite2<y_sprite1+spr1_hauteur And spr2_milieu_x>x_sprite1+spr1_largeur
bord$="droit a cheval "
Goto suite
EndIf
If x_sprite2+spr2_largeur>x_sprite1 And x_sprite2<x_sprite1+spr1_largeur And spr2_milieu_y>y_sprite1+spr1_hauteur
bord$="bas a cheval "
Goto suite
EndIf
If y_sprite2+spr2_hauteur>y_sprite1 And y_sprite2<y_sprite1+spr1_hauteur And spr2_milieu_x<x_sprite1
bord$="gauche a cheval "
Goto suite
EndIf
If x_sprite2 > x_sprite1 And (x_sprite2+spr2_largeur) <x_sprite1+spr1_largeur
If y_sprite2>y_sprite1 and y_sprite2+spr2_hauteur<y_sprite1+spr1_hauteur
bord$="Dedans "
Goto suite
Endif
EndIf
Else
bord$=" en dehors"
EndIf
suite:
ProcedureReturn bord$
EndProcedure