2013-07-24 1 views
0

Перед тем как снова возникнуть проблема. Итак, я делаю игру в короне. Я хочу, чтобы объект перемещался по прямой по координатам касания. Я знаю, что могу просто использовать функцию transition.to(), но физический движок не работает должным образом во время переходов. Я написал следующий код, но, конечно, круг не движется по прямому пути.Перемещение объекта в целевое местоположение по прямому пути

function controls(event) 
    if event.phase == "began" or event.phase == "moved" then 
     follow = true 
     touchX = event.x; touchY = event.y 
    end 

    if event.phase == "ended" then 
     follow = false 
    end 
end 

function playerMotion() 
    if follow == true then 
     if circle.y < touchY then 
      circle.y = circle.y + 1 
     elseif circle.y > touchY then 
      circle.y = circle.y - 1 
     end 

     if circle.x < touchX then 
      circle.x = circle.x + 1 
     elseif circle.x > touchX then 
      circle.x = circle.x - 1 
     end 
    end 
end 

Надеюсь, мой вопрос был достаточно ясным.

ответ

0

Вам понадобится нечто более сложное, чем эта функция. То, что это делает, просто «подходит» к месту назначения. Он не следует прямым путем.

Чтобы сделать то, что вы хотите сделать, вам нужно сделать несколько вещей:

  1. Найдите свою позицию.
  2. Найти место назначения.
  3. Рассчитать горизонтальное расстояние от начала pos до конца поз.
  4. То же, за исключением вертикального.
  5. Теперь, если бы вы добавили это в свой начальный объект, вы сразу же попали в пункт назначения. Как мы можем заставить его двигаться медленно? Просто разделите вертикальное и горизонтальное расстояние на переменную «скорость». Это скорость перемещения объекта в одном кадре.
  6. Для каждого кадра обновите объект, добавив только что найденный компонент x и y.
  7. Проверьте, достигли ли вы места назначения. При необходимости повторите шаг 6. (ИЛИ: отслеживайте, сколько горизонтальных и вертикальных расстояний вы путешествовали, и сравните их с исходным результатом.)

У вас есть это!

0

Попробуйте мое приложение-образец. Вы можете использовать это или получить представление о своем проекте.

Вы также можете проверить это в пустом проекте, чтобы увидеть, как он работает.

_W = display.contentWidth 
_H = display.contentHeight 

local physics = require("physics") 

physics.start() 
physics.setGravity(0,0) 

local circle = display.newCircle(0,0,20) 
circle.name = "circle" 
circle.x = _W/2 
circle.y = _H/2 
circle.tx = 0 
circle.ty = 0 
physics.addBody(circle) 
circle.linearDamping = 0 
circle.enterFrame = function(self,event) 
    print(self.x,self.tx) 

    --This condition will stop the circle on touch coordinates 
    --You can change the area value, this will detect if the circles's x and y is between the circles's tx and ty 
    --If area is 0, it may not stop the circle, area = 5 is safe, change if you want to 
    local area = 5 
    if self.x <= self.tx + area and self.x >= self.tx - area and 
     self.y <= self.ty + area and self.y >= self.ty - area then 
     circle:setLinearVelocity(0,0) --set velocity to (0,0) to fully stop the circle 
    end 
end 

--Add event listener for the monitoring the coordinates of the circle 
Runtime:addEventListener("enterFrame",circle) 


Runtime:addEventListener("touch",function(event) 
    if event.phase == "began" or event.phase == "moved" then 
     local x, y = event.x, event.y 
     local tx, ty = x-circle.x, y-circle.y --compute for the toX and toY coordinates 
     local sppedMultiplier = 1.5 --this will change the speed of the circle, 0 value will stop the circle 

     --sets the future destination of the circle 
     circle.tx = x 
     circle.ty = y 

     circle:setLinearVelocity(tx*delay,ty*delay) --this will set the velocity of the circle towards the computed touch coordinates on a straight path. 
    end 
end) 
Смежные вопросы