これらの関数は遅いため、sin と cos を使用しないでください。したがって、データの計算に角度を使用することはできません (スプライトなどを回転させる場合にのみ必要になります)。
まず、x、y、xspeed、yspeed、速度 (px/秒)、および方向のプロパティを持つオブジェクトを作成する必要があります。
キャラクターが速度 = 5 の位置 (10,10) にいると仮定します。次に、位置 (50,40) でマウスをクリック (またはホバー) します。まず、dx と dy (デルタ) を取得する必要があります。
dx = mouse.x - character.x // 50 - 10 = 40
dy = mouse.y - character.y // 40 - 10 = 30
次に、キャラクターの位置からマウスの位置までの距離を取得します。
distance = sqrt(dx*dx + dy*dy) // sqrt(40*40 + 30*30) = sqrt(1600 + 900) =
// = sqrt(2500) = 50 (Pythagorean theorem)
これで、キャラクターの xspeed と yspeed を計算できます。
factor = distance / character.speed // 50 / 5 = 10
character.xspeed = dx / factor // 40 / 10 = 4
character.yspeed = dy / factor // 30 / 10 = 3
ここで、1 秒あたり 60 ティックの物理ループがあると仮定します (おそらく、物理ループはメイン ループから分離されていないため、単に fps カウントになります)。ティックごとに、キャラクター x は xspeed ずつ増加し、y は yspeed ずつ増加します (もちろんキーを押している場合)。したがって、1 秒後 (60 ティックかかります)、キャラクターは position になります(10 + 60*4, 10 + 60*3) = (250, 190)
。かなり速いので、キャラクターの速度を落としたり、fpsを下げたりできます(お勧めしません)。
キャラクターを (cRPG のように) マウスの位置で停止させたい場合は、タイマーまたはカウンターを使用します。キャラクターがマウスの位置に到達するのに必要なティック カウントは、以前factor
に計算された であり、これは に等しくなり10
ます。ループの 10 ティック後、文字位置は (50,40) になります。そのため、キャラクター オブジェクトに var ティックを作成し、すべてのループ ティックで 1 ずつ減分し、それが 0 になったらキャラクターの xspeed と yspeed を 0 にリセットして、それ以上動かないようにすることができます。もう 1 つの方法は、タイムアウトを使用することですが、それはさらに悪いことです。10/60s = 1/6s ~= 0.18s の直後にタイムアウト コールバック関数がキャラクターの xspeed と yspeed を 0 にリセットします。
角度が必要な場合は、dx/dy と tan を使用して計算できます。
この移動方法は、sin と cos を使用するよりもはるかに高速です。
もちろん、(character.x, character.y) の位置に文字を描画して動きを表現します。