Hi
i use the following code (from another forum topic) in my game, but it seems there is a bug. Sometimes, anglem > 360. No pb with this version, but i my game i use a pre-computed sin/cos into a table (0 to 360 degree) so it produce a bug when anglem > 360... (array out of bound). so...
1) is there a way to correct the code to have 0 <= anglem <= 360 ?
2) why cos() and sin() accept a value greater than 360 ? Is there a conversion before computed the sin or cos ? How to do this conversion myself ?
i'm crap with maths ! Thanks !
(initial topic http://www.blitzbasic.com/Community/posts.php?topic=57317#637433)
Global missile_x#=100.0,missile_y#=100.0, targetx#=100.0, targety#=100.0
Global anglem#=0 , anglet#, dist#
Global missilespeed#=4.0, turnrate#=2.0, missile_img
Graphics 640,480
SetMaskColor 255,0,255
While Not KeyHit(KEY_ESCAPE)
Cls
SetRotation anglem#
DrawRect missile_x,missile_y,20,5
SetRotation 0
movemissile()
Flip
Wend
Function movemissile()
Local dx, dy
targetx# = Float(MouseX())
targety# = Float(MouseY())
dx=targetx-missile_x
dy=targety-missile_y
anglet# = ATan2(dy,dx) ' dir between player and target
dist=Sqr((dx*dx)+(dy*dy))
' homing
While anglem > 360 anglem:-360 Wend
While anglem <= 0 anglem:+360 Wend
Local TE# = RotaryDir( anglem# , anglet)
If TE# < 0 Then anglem:- Turnrate
If TE# > 0 Then anglem:+ Turnrate
'
If anglem > 360 Then DrawText "anglem > 360 !!!!",0,20
xs# = Cos(anglem) * missilespeed
ys# = Sin(anglem) * missilespeed
missile_x# = missile_x + xs
missile_y# = missile_y + ys
If dist < 10.0
missile_x=targetx
missile_y=targety
DrawText "GOTCHA!",missile_x, missile_y+30
EndIf
DrawText "anglem=" + anglem, 0,0
End Function
Function RotaryDir#(SourceDir#,DestDir#)
Local Diff1#,Diff2#,Dir#
If SourceDir# > DestDir#
Diff1#=SourceDir-DestDir
diff2#=(360.0-SourceDir)+DestDir
If diff2<diff1
dir#=diff2
Else
dir#=diff1/-1
EndIf
Else
If SourceDir#<DestDir#
diff1=DestDir-SourceDir
diff2=(360.0-DestDir)+SourceDir
If diff2<diff1
dir#=diff2/-1
Else
dir#=diff1
EndIf
Else
dir=0
EndIf
EndIf
Return dir
End Function
|