Corona SDK:向上和向下移动播放器

时间:2014-02-05 19:37:38

标签: lua corona

我有一个在太空中航行的玩家。由于它是空间,因此没有重力,因此没有抛物线轨迹。玩家只是从左到右走水平线。玩家实际上并没有移动,但背景是,所以它看起来像他。 x值是固定的。

我有2个按钮可以帮助玩家避开像小行星这样的障碍物。一个按钮给予玩家向上的力量,另一个给向下的力量。以下是按下这些按钮时调用的函数。

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

function moveDown( 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

这种实现的问题在于,无论何时施加力,玩家都会朝着那个方向前进。然后你必须在相反的方向施加力,他将永远朝那个方向前进。那不是我想要的。我想要的是:

  • 当按下UP时,玩家在Y中上升到某个值(比如50 px)。然后玩家在新的高度从左到右保持水平方向。

  • 按下DOWN键时,播放器会降低某个值。然后玩家在新的高度从左到右保持水平方向。

实现这一目标的最佳方法是什么?我可以使用applyForce函数执行此操作还是有其他方法?提前感谢您的时间!

1 个答案:

答案 0 :(得分:1)

你必须记住F = ma:如果施加的力是0,a是0,这意味着速度不会改变。你有两个选择:

  1. 应用相反的力来降低速度,并在速度为0时停止。每个Body都有myBody.linearDamping因子,您可以设置为非零。如果这不起作用,你可以应用你自己的阻尼:你使它与Body的速度成比例,所以你需要一个enterFrame事件处理程序,它根据当前的速度更新力:

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

    这里“a”是阻尼,有些任意数字(0是你现在拥有的;它越大,玩家返回0速度的速度越快)。我没有检查applyForce()是添加(添加到现有力)还是绝对(替换现有)。但是你明白了。

  2. 直接移动玩家:

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

    当达到所需位置时,您仍然需要一个enterFrame处理程序来监视位置和setLinearVelocity(0,0)。

  3. 使用选项1,您将获得更平滑,更“逼真”的动作。