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)
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