2015-09-25 34 views
0

我試圖做一個與多個平臺的格鬥遊戲。我已經成功地製作了控制,運動,(雙)跳,以及遊戲的重力部分。AS3着陸平穩下重力

問題是,當一個玩家跳到地面時,他們似乎比他們應該在平臺上深一點(他們應該着陸並停留在平臺表面上)。當玩家雙跳時這更明顯。

我知道爲什麼會發生這種情況;這是因爲有時hitTestObject需要一段時間來反應,當對象進入太快。

所以,我想到的第一件事就是讓玩家的腳y axis等於他登陸平臺頂部的y axis

雖然,該解決方案導致了一個相當生澀的着陸。

我的問題是:是否有辦法讓玩家在平臺的頂部表面平穩着陸?

有些事情我已經試過:

-Raising FPS,它只是取得了同樣的效果發生,但更迅速。

- 降低玩家掉落的速度,但這會讓遊戲變得不那麼有趣,所以我把它劃掉了。

這是我的相關代碼:

stage.addEventListener(Event.ENTER_FRAME, loop); 
var jumpConstant:Number = 30; 
var gravityConstant:Number = 1.8; 
function loop(e:Event):void //happens 
{ 
    if(player.leg1.foreleg1.foot1.hitTestObject(platforms.ground)||player.leg2.foreleg2.foot2.hitTestObject(platforms.ground)) //if either of the player's legs are colliding with the platform [ps: nested movieclips] 
    { 
     player.ySpeed = 0; //the player stops going downwards 
     player.y = platforms.y; //the player's y becomes the platform's y. don't worry, it puts the player in the right place, just not smoothly. 
     if (player.b_up) //if Up control button (W or Up Arrow) is being pressed 
     { 
      player.ySpeed = -player.jumpConstant; //make the player jump 

     } 
    else //if the player isn't colliding with the platform 
    { 
     player.ySpeed += player.gravityConstant; //the player is affected by gravity and is pulled downwards 
    } 

鏈接到遊戲中,如果你想嘗試一下,看看生澀的效果:

http://www.fastswf.com/-64Ux3I

+0

'hitTestObject'根據圖像的速度確實沒有任何形式的延遲 - 這是您的錯誤理解(或錯誤陳述)。它只是檢查兩個顯示對象是否重疊。 – xxbbcc

+0

是否在ySpeed增加之前或之後重置player.y的代碼?從瑞士法郎看來,這隻腳暫時低於平臺,導致它反彈回來。如果正確實施,它不應該得到那麼低 – VBCPP

+0

@xxbbcc顯然,我誤解了爲什麼hitTestObject會這樣做。我認爲這是hitTestObject中的一個bug ... Aaron的回答正確地解釋了爲什麼hitTestObject會這樣做。顯然,玩家只能在遠處碰撞平臺,感謝ySpeed中的增量。那麼,這是很好的知道。 –

回答

2

問題是,您只以ySpeed的增量檢查衝突。由於y的速度在每步下降1.8的過程中增加,所以你很快就會看到相隔很遠的碰撞檢查。如果你想像素精確的碰撞檢查,你需要檢查1px的增量碰撞。這意味着如果y速度爲10,則在一次循環更新期間需要10次碰撞檢查。在循環函數中使用for循環來完成此操作。

+0

非常感謝您的回答,它清除了很多事情。但...是否有更好的方法來檢查玩家是否與for循環相撞?我的意思是,檢查玩家是否與平臺每次碰撞10次......不應該使遊戲變慢/不應該對資源造成不利影響? –

+0

使用命中測試時沒有更好的方法。使用幾何和數學有更優雅的解決方案(例如參見Box2D和Continuous Collision Detection),但通常任何精確的解決方案都很昂貴。每幀10次命中測試實際上是一個非常小的成本,你應該只看到成千上萬的問題。還有許多優化技術...例如,您可以執行非常廣泛的碰撞檢查,並且如果廣泛找到碰撞,則可以找到精確的碰撞點。當涉及多個對象時,您也可以使用空間分區。 – Aaron

+0

好吧,非常感謝您的幫助^ - ^但最後一件事是,如果沒有太多要問...您是什麼意思的「空間分區」? –

0

你爲什麼不設置hitTestObject y座標位於地面之上,因此沉入地面會使它現在觸及地面。

+0

我一開始也想到了這一點,但這太不可靠了......另外,我誤解了爲什麼hitTestObject會這麼做:/ –

+1

嗯,我很高興你找到了答案。 :) – InfiniteParadox