2017-07-03 7 views
1

私のコードに問題があります。 (Love2Dフレームワーク) 私はリアルタイムで座標に従う小さな追従オブジェクトを作っています。 問題は、ベクトルに応じて動きの速度が変化していることです。 前方への移動は、左上への移動よりもわずかに高速です。 誰かが私を助けることができますか?私の間違いをマークしてください。 コード:LOVE2D、追従オブジェクトの非同期移動

function love.load() 
    player = love.graphics.newImage("player.png") 
    local f = love.graphics.newFont(20) 
    love.graphics.setFont(f) 
    love.graphics.setBackgroundColor(75,75,75) 
    x = 100 
    y = 100 
    x2 = 600 
    y2 = 600 
    speed = 300 
    speed2 = 100 
end 

function love.draw() 
    love.graphics.draw(player, x, y) 
    love.graphics.draw(player, x2, y2) 
end 

function love.update(dt) 
print(x, y, x2, y2) 
    if love.keyboard.isDown("right") then 
     x = x + (speed * dt) 
    end 
    if love.keyboard.isDown("left") then 
     x = x - (speed * dt) 
    end 

    if love.keyboard.isDown("down") then 
     y = y + (speed * dt) 
    end 
    if love.keyboard.isDown("up") then 
     y = y - (speed * dt) 
    end 

    if x < x2 and y < y2 then 
    x2 = x2 - (speed2 * dt) 
    y2 = y2 - (speed2 * dt) 
    end 

    if x > x2 and y < y2 then 
    x2 = x2 + (speed2 * dt) 
    y2 = y2 - (speed2 * dt) 
    end 

    if x > x2 and y > y2 then 
    x2 = x2 + (speed2 * dt) 
    y2 = y2 + (speed2 * dt) 
    end 

    if x < x2 and y > y2 then 
    x2 = x2 - (speed2 * dt) 
    y2 = y2 + (speed2 * dt) 
    end 
end 

答えて

0

この

if x < x2 and y < y2 then 
    x2 = x2 - (speed2 * dt) 
    y2 = y2 - (speed2 * dt) 
    end 

    if x > x2 and y < y2 then 
    x2 = x2 + (speed2 * dt) 
    y2 = y2 - (speed2 * dt) 
    end 

    if x > x2 and y > y2 then 
    x2 = x2 + (speed2 * dt) 
    y2 = y2 + (speed2 * dt) 
    end 

    if x < x2 and y > y2 then 
    x2 = x2 - (speed2 * dt) 
    y2 = y2 + (speed2 * dt) 
    end 

は問題の束を持っています。

速度差の原因となるのは、(x<x2)ですが、x>(x2+speed2*dt)の場合は、最初のブランチ(if x < x2 and y < y2 then …)を実行します。これにより、値が変更され、2番目のブランチ(if x > x2 and y < y2 then …)に到達します。つまり、y方向に2回移動します。 if x < x2 and y < y2 then … elseif x > x2 and y < y2 then …に変更して、他のブランチに入ることができないようにするか、数値計算を行い、if-チェーン全体を避​​けてください。

あなたが望むかもしれないし、現在持っていないかもしれないことは、特定の方向に歩くか、そうでないことです。つまり、フォロワーが移動できる方向は8通りあります。 (軸が整列しているか斜めになっているか - あなたが持っている4つのケースとdxまたはdyが(ほぼ)ゼロのときの状況)。

"直接あなたに向かって"移動したい場合は、任意の方向。

x方向とy方向の相対距離を使用する必要があります。 many common choices of distance definitionsがありますが、おそらくeuclidean distanceが必要です。 (その規範/距離の定義の下"shape" of the unit circleはそれがどちらの方向に動いている速度を決定、唯一のユークリッド距離は、「全方向に同じ」である。)

ので

local dx, dy = (x2-x), (y2-y) -- difference in both directions 
    local norm = 1/(dx^2+dy^2)^(1/2) -- length of the distance 
    dx, dy = dx*norm, dy*norm  -- relative contributions of x/y parts 
    x2, y2 = x2 - dx*speed*dt, y2 - dy*speed*dt 

で上記ブロックを交換し、距離の「通常の」概念を得ることができます。これにより、通常の動き速度の概念が得られます。これにより、プレーヤーに向かって移動するときに同じ速度が得られます。

関連する問題