2014-02-05 4 views
0

У меня есть плеер, который перемещается в космос. Так как это пространство, то нет гравитации, поэтому нет параболической траектории. Игрок просто идет по горизонтальной линии слева направо. Игрок на самом деле не движется, но фон, так что он выглядит так, как будто он есть. Значение x фиксировано.Corona SDK: Перемещение игрока вверх и вниз

У меня есть две кнопки, которые помогают игроку избежать препятствий, таких как астероиды. Одна кнопка дает игроку усилие вверх, а другое - нисходящую силу. Ниже перечислены функции, вызываемые при нажатии этих кнопок.

 
function moveUp(event) 
     if event.phase == "ended" then

  player:applyForce(0, 8, player.x, player.y) 
      player:setSequence("jump") 
      jumpChannel = audio.play(jumpSound) 
     end 
    return true 
end 

функция MoveDown (событие) если event.phase == "закончилась", то

player:applyForce(0, -8, player.x, player.y) player:setSequence("jump") jumpChannel = audio.play(jumpSound) end return true end

Проблема с этой реализации является то, что всякий раз, когда применяется сила, игрок продолжает идти в это направление. Затем вы должны применить силу в противоположном направлении, и он будет продолжать двигаться в этом направлении навсегда. Это не то, чего я хочу. То, что я хочу это:

  • при нажатии UP, игрок выходит на определенное значение (скажем, 50 рх) в Y. Тогда игрок продолжает идти в горизонтальном направлении слева направо на новой высоте.

  • При нажатии кнопки DOWN игрок понижает определенное значение. Затем игрок продолжает двигаться в горизонтальном направлении слева направо на новой высоте.

Каков наилучший способ для этого? Могу ли я это сделать с помощью функции applyForce или есть другой метод? Спасибо заранее за ваше время!

ответ

1

Вы должны помнить, что F = ma: при приложении силы 0, a равно 0, что означает, что скорость не изменяется. У вас есть два варианта:

  1. применить противоположную силу, которая будет уменьшать скорость, и остановки, когда скорость равна 0. Каждого органа myBody.linearDamping фактора, который вы могли бы установить ненулевой. Если это не работает, вы можете применить свое собственное демпфирование: вы делаете это пропорционально скорость тела, так что вам нужен обработчик события enterFrame, который обновляет силу на основании текущей скорости:

    function enterFrame(e) 
        local v = player:getLinearVelocity() 
        player:applyForce(- a * v) 
    end 
    

    здесь «в» затухает, какое-то произвольное число (0 - это то, что у вас есть сейчас, чем больше оно, тем быстрее игрок возвращается к скорости 0). Я не проверял, является ли applyForce() аддитивным (добавляет к существующим силам) или абсолютным (заменяет существующие). Но ты получил идею.

  2. непосредственно переместить игрока:

    function moveUp(event) 
        if event.phase == "ended" then 
         player:setLinearVelocity(0, 8) -- pixels/sec 
    

    Вы все еще нужен обработчик enterFrame для контроля положения и setLinearVelocity (0,0), когда желаемое положение, достигнутое.

вы получите более гладкой, более «реалистичными» движение с опцией 1.

+0

Использование силы всегда более плавным и реалистичным. Коэффициент linearDamping работает как шарм. Спасибо, чувак, я очень ценю это! – Henok

Смежные вопросы