我有一个在太空中航行的玩家。由于它是空间,因此没有重力,因此没有抛物线轨迹。玩家只是从左到右走水平线。玩家实际上并没有移动,但背景是,所以它看起来像他。 x值是固定的。
我有2个按钮可以帮助玩家避开像小行星这样的障碍物。一个按钮给予玩家向上的力量,另一个给向下的力量。以下是按下这些按钮时调用的函数。
function moveUp( event ) if event.phase == "ended" thenplayer: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函数执行此操作还是有其他方法?提前感谢您的时间!
答案 0 :(得分:1)
你必须记住F = ma:如果施加的力是0,a是0,这意味着速度不会改变。你有两个选择:
应用相反的力来降低速度,并在速度为0时停止。每个Body都有myBody.linearDamping因子,您可以设置为非零。如果这不起作用,你可以应用你自己的阻尼:你使它与Body的速度成比例,所以你需要一个enterFrame事件处理程序,它根据当前的速度更新力:
function enterFrame(e)
local v = player:getLinearVelocity()
player:applyForce(- a * v)
end
这里“a”是阻尼,有些任意数字(0是你现在拥有的;它越大,玩家返回0速度的速度越快)。我没有检查applyForce()是添加(添加到现有力)还是绝对(替换现有)。但是你明白了。
直接移动玩家:
function moveUp( event )
if event.phase == "ended" then
player:setLinearVelocity(0, 8) -- pixels/sec
当达到所需位置时,您仍然需要一个enterFrame处理程序来监视位置和setLinearVelocity(0,0)。
使用选项1,您将获得更平滑,更“逼真”的动作。