方法としては色々ありそうですが、私はベクトルの外積を使うのが好きです。
自分のブログのネタになりそうなので、汚いサンプルを書いてみました。
// 角度の補正が面倒なので、数学に合わせてラジアン0はx軸方向に並行とします。
// 考え方としては、自分の向きをaベクトル、自分から目標の向きをbベクトルとして、
// 外積を利用して、なす角のsinを求めます
; 自分の座標と向き
mx = 320.0
my = 240.0
mr = 0.0
*main
////ここからが重要/////
; 目標の座標(マウスカーソル)
tx = 0.0+mousex
ty = 0.0+mousey
; aベクトル(自分の向き)
ax = cos(mr)
ay = sin(mr)
; bベクトル(自分から目標の向き)
bx = tx-mx
by = ty-my
; abベクトルの外積
a∧b = ax*by - bx*ay
; abベクトルのなす角をsinθとして
; a∧b = |a||b|sinθ
sinθ = (a∧b)/sqrt(bx*bx+by*by)
; 向きが違うなら
if absf(sinθ)>=0.02 {
; 自分は旋回する
if sinθ>=0 {
mr += 0.02
} else {
mr -= 0.02
}
}
////ここまで////
redraw 0
color 255,255,255 : boxf
color 0,0,0
; 自分
line mx+cos(mr)*100,my+sin(mr)*100, mx,my
; 目標
pos tx-7,ty-9 : mes "◎"
; インジゲーター
pos 0,0
mes "mr : "+mr
mes "a("+ax+","+ay+")"
mes "b("+bx+","+by+")"
mes "a∧b : "+a∧b
mes "sinθ : "+sinθ
redraw
await 10
goto*main
この方法なら、自分が何回転するとしても、面倒なことを考えなくて済みます。
他の人の作ったゲームのソースを見れば、他にも色々な方法があるかもしれません。
プログラムの技術は人から盗んで学ぶものです(?)。