2017-07-03 4 views
1

J'ai un problème avec mon code. (Cadre Love2D) Je fais un petit objet suiveur, qui suit les coordonnées en temps réel. Le problème est que la vitesse de déplacement varie en fonction du vecteur. Comme aller de l'avant est légèrement plus rapide, que de se déplacer vers le haut à gauche. Quelqu'un peut-il m'aider? Marquez mon erreur s'il vous plaît. Le code:LOVE2D, Mouvement desync de l'objet suiveur

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 

Répondre

0

Ce

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 

a un tas de problèmes.

La cause de vos différences de vitesse est la suivante: si (x<x2), mais x>(x2+speed2*dt), vous allez parcourir la première branche (if x < x2 and y < y2 then …). Cela changera les valeurs de sorte que vous toucherez également la deuxième branche (if x > x2 and y < y2 then …), ce qui signifie que vous vous déplacez deux fois dans la direction y. Changez pour if x < x2 and y < y2 then … elseif x > x2 and y < y2 then … afin que vous ne puissiez pas tomber dans les autres branches, ou faites le calcul et évitez l'ensemble if -chain.

Une chose que vous pouvez ou ne voulez pas et que vous avez actuellement, c'est qu'il marche dans une certaine direction, ou ce n'est pas le cas. Ce qui signifie qu'il y a 8 directions possibles que le suiveur peut parcourir. (Axe-aligné ou en diagonale - les 4 cas que vous avez plus la situation où dx ou dy est (approximativement) zéro.)

Si vous voulez qu'il bouge "directement vers vous", le suiveur devrait pouvoir se déplacer dedans N'importe quelle direction.

Vous devrez utiliser les distances relatives dans les directions x et y. Il y a many common choices of distance definitions, mais vous voulez probablement le euclidean distance. (Le "shape" of the unit circle de cette définition norme/distance détermine la vitesse à laquelle il se déplace dans les deux sens, seule la distance euclidienne est « le même dans toutes les directions ».)

remplacer Ainsi, le bloc ci-dessus avec

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 

et vous obtiendrez la notion «normale» de la distance, qui vous donne la notion normale de la vitesse de déplacement, ce qui vous donne des vitesses identiques lorsque vous vous déplacez vers le joueur.