[ok] Sprite selection (ou collision)
Publié : dim. 24/avr./2016 7:20
salut
J'aimerai savoir s'il existe une technique pour savoir si deux sprites entrent en collision après une rotation ou transformation ?
J'ai essayé avec la méthode spritepixelcollision(), spritecollision(), mais rien ne marche avec les transformations
En fait, j'aimerai juste savoir qd la souris se trouve au dessus d'un sprite (pour pouvoir le sélectionner par exemple) :
J'ai pensé utilisé une technique avec cos-sin pour x et sin+cos pour y, en vérifiant si la souris (mx,my) se trouve entre tous les pixels de chaque sprite, mais j'ai peur que ce soit super lourd.
Si vous avez une technique ou une piste, ça m'intéresse grandement
J'aimerai savoir s'il existe une technique pour savoir si deux sprites entrent en collision après une rotation ou transformation ?
J'ai essayé avec la méthode spritepixelcollision(), spritecollision(), mais rien ne marche avec les transformations

En fait, j'aimerai juste savoir qd la souris se trouve au dessus d'un sprite (pour pouvoir le sélectionner par exemple) :
Code : Tout sélectionner
#Window_main = 0
If InitSprite() =0 Or InitKeyboard() =0
End
EndIf
Procedure SpriteTransformation(Sprite.i, X.f, Y.f, Width.f, Height.f, Angle.f)
; by stargate
Protected Cos.f = Cos(Radian(Angle))
Protected Sin.f = Sin(Radian(Angle))
TransformSprite(Sprite, X*Cos-Y*Sin, X*Sin+Y*Cos, (X+Width)*Cos-Y*Sin, (X+Width)*Sin+Y*Cos, (X+Width)*Cos-(Y+Height)*Sin,
(X+Width)*Sin+(Y+Height)*Cos, X*Cos-(Y+Height)*Sin, X*Sin+(Y+Height)*Cos)
EndProcedure
flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
WinW =1024
WinH =768
If OpenWindow(#Window_main,0,0,WinW,WinH, "Sprite selection", Flag) = 0
End
EndIf
If OpenWindowedScreen(WindowID(0), 0,0,WinW,WinH) = 0
End
EndIf
LoadSprite(0,#PB_Compiler_Home+"Examples\Sources\Data\PurebasicLogo.bmp",#PB_Sprite_PixelCollision)
CopySprite(0,1,#PB_Sprite_PixelCollision)
W =SpriteWidth(0)
H =SpriteHeight(0)
r.d = 1
x = 150
y = 150
x1 = 450
y1 = 400
CreateSprite(2,200,40,#PB_Sprite_PixelCollision)
cursor = 3
CreateSprite(cursor,4,4,#PB_Sprite_PixelCollision)
If StartDrawing(SpriteOutput(3))
Box(0,0,OutputWidth(),OutputHeight(),RGBA(255,255,255,255))
StopDrawing()
EndIf
Repeat
Repeat
EventID = WindowEvent()
Select EventID
Case #PB_Event_CloseWindow
End
EndSelect
Until event = 0
ClearScreen(RGB(50,50,50))
mx = WindowMouseX(0)
my = WindowMouseY(0)
DisplayTransparentSprite(cursor,mx,my,255,RGBA(255,255,255,255))
txt$ = ""
;If (mx>=x And mx<=x+w And my>=y And my<=y+h) Or SpritePixelCollision(0,mx,my,cursor,mx,my)
If SpritePixelCollision(0,x,y,cursor,mx,my) <> 0
txt$ = "mouse over sprite0"
EndIf
txt1$=""
;If (mx>=x1 And mx<=x1+w And my>=y1 And my<=y1+h) Or SpritePixelCollision(1,mx,my,cursor,mx,my)
If SpritePixelCollision(1,x1,y1,cursor,mx,my) <> 0
txt1$ = "mouse over sprite1"
EndIf
If StartDrawing(SpriteOutput(2))
Box(0,0,OutputWidth(),OutputHeight(),0)
DrawText(0,0,txt$+" | " +txt1$)
StopDrawing()
EndIf
DisplayTransparentSprite(0,x,y,255,#Red)
SpriteTransformation(1, -10,-(h*r)/2, w*r, h*r ,60)
DisplaySprite(1,x1,y1)
DisplaySprite(2,0,0)
FlipBuffers()
Until Quit = 1
Si vous avez une technique ou une piste, ça m'intéresse grandement
