2014-02-05 70 views
0

我有一個在太空中導航的播放器。由於它是空間,所以沒有重力因此沒有拋物線軌跡。玩家只是從左到右水平線。玩家實際上沒有移動,但背景是,所以看起來他是。 x值是固定的。Corona SDK:向上和向下移動播放器

我有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 

功能下移(事件) 如果event.phase ==「結束」,然後

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

這種實現的問題是,每當施加力的球員一直在持續那個方向。然後你必須朝相反的方向施加力量,他將永遠朝着那個方向前進。這不是我想要的。我要的是:

  • 時按了,玩家上升爲Y.一定值(比如50像素)然後玩家不斷去在水平方向上從左至右在新的高度。

  • 當按下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