2017-07-03 3 views
1

Ich habe ein Problem in meinem Code. (Love2D framework) Ich mache kleine Follower-Objekte, die Koordinaten in Echtzeit verfolgen. Das Problem ist, dass sich die Bewegungsgeschwindigkeit abhängig vom Vektor ändert. Wie vorwärts bewegen ist etwas schneller, als nach oben-links bewegen. Kann mir jemand helfen? Markieren Sie bitte meinen Fehler. Der Code:LOVE2D, Desync Bewegung von Follower-Objekt

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 

Antwort

0

Diese

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 

hat eine Reihe von Problemen.

Die eine, die Ihre Geschwindigkeit Unterschiede verursacht hat, ist dies: wenn (x<x2), aber x>(x2+speed2*dt), werden Sie durch den ersten Zweig (if x < x2 and y < y2 then …) laufen. Dies wird die Werte ändern, so dass Sie auch den zweiten Zweig (if x > x2 and y < y2 then …) treffen, was bedeutet, dass Sie sich zweimal in der Richtung y bewegen. Wechseln Sie zu if x < x2 and y < y2 then … elseif x > x2 and y < y2 then …, damit Sie nicht in die anderen Zweige fallen können, oder rechnen Sie und vermeiden Sie die ganze if-Kette.

Eine Sache, die Sie wollen oder nicht wollen und derzeit haben, ist, dass es entweder in eine bestimmte Richtung geht oder nicht. Das heißt, es gibt 8 mögliche Richtungen, in die der Follower fahren kann. (Axis-aligned oder diagonal - die 4 Fälle, die Sie haben plus die Situation, wenn dx oder dy (ungefähr) Null ist)

Wenn Sie möchten, dass es sich "direkt auf Sie zu bewegt", sollte der Follower einziehen können irgendeine Richtung.

Sie müssen die relativen Abstände in x- und y-Richtung verwenden. Es gibt many common choices of distance definitions, aber Sie wollen wahrscheinlich die euclidean distance. (Die "shape" of the unit circle unter dieser Norm/Abstandsdefinition bestimmt, wie schnell ist es in beiden Richtungen zu bewegen, nur die euklidische Distanz ist „die in alle Richtungen gleich.“)

ersetzen also den obigen Block mit

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 

und Sie erhalten den "normalen" Begriff der Entfernung, der Ihnen die normale Vorstellung von der Bewegungsgeschwindigkeit vermittelt, die Ihnen beim Anfahren des Spielers die gleiche Geschwindigkeit verleiht.