2015-12-31 32 views
0

我有兩個碰撞問題,玩家可以在多次按下移動鍵時發生故障,並且玩家的xy移動一旦接觸到物體的任何一側都會停止。它應該只停止xy,這取決於它觸摸哪一面。AS3 - 如何使用hitTestObject正確地停止玩家並根據碰撞區域限制玩家的移動?

雖然它接觸到邊界框的左側/右側,但仍應能夠上下移動。它接觸邊界框的頂部/底部時,它應該能夠左右移動。

球員ENTER_FRAME類中我的移動代碼:

private function onEnterFrame(event:Event):void 
{ 
    _vx = 0; 
    _vy = 0; 

    if (isRight) 
    { 
     _vx = 5; 
    } 

    if (isLeft) 
    { 
     _vx = -5; 
    } 

    if (isUp) 
    { 
     _vy = -5; 
    } 

    if (isDown) 
    { 
     _vy = 5; 
    } 

    x += _vx; 
    y += _vy; 

} 

在CollisionBase類我hitTestObject代碼ENTER_FRAME(基類MovieClips):

private function onEnterFrame(event:Event):void 
{ 
    if (MovieClip(parent).player.collisionArea.hitTestObject(this)) 
    { 
     if (MovieClip(parent).player.isLeft) 
     { 
      MovieClip(parent).player.x -= MovieClip(parent).player._vx; 
     } 

     if (MovieClip(parent).player.isRight) 
     { 
      MovieClip(parent).player.x -= MovieClip(parent).player._vx; 
     } 

     if (MovieClip(parent).player.isUp) 
     { 
      MovieClip(parent).player.y -= MovieClip(parent).player._vy; 
     } 

     if (MovieClip(parent).player.isDown) 
     { 
      MovieClip(parent).player.y -= MovieClip(parent).player._vy; 
     } 
    } 
} 

FLA文件:https://www.dropbox.com/s/k5dlxrsnvbrmtke/Subject.zip?dl=0

FLA文件包括一名玩家和一張牀與。。相撞。

回答

1

您的遊戲設計結構不完整。遊戲邏輯應該有一個ENTER_FRAME。取而代之的是,你有一個ENTER_FRAME爲玩家,一個ENTER_FRAME交換孩子,一個ENTER_FRAME在每個障礙。這個設計讓你頭痛不已,並將你的遊戲的表現放在地板上。

要解決該問題與hitTest做下的事情:

將這個代碼在CollisionBaseClass

private function onEnterFrame(event:Event):void 
{ 

    var player:MovieClip = MovieClip(this.parent).player; 

    if (player.collisionArea.hitTestObject(this)) player.collision = true; 
} 

這個屬性添加到PlayerClass

private var _collision:Boolean = false; 

public function set collision(value:Boolean):void{ 
    _collision = value; 
} 

接下來,在onEnterFrame函數的開頭添加這些行:

private function onEnterFrame(event:Event):void 
{ 

    if(_collision){ 

     x -= _vx; 
     y -= _vy; 

     _collision = false; 

     return; 

    } 

    _vx = 0; 
    _vy = 0; 

    if (isRight) 
    { 
    .... 

該問題已得到解決,但現在玩家在遇到障礙時會閃爍。發生這種情況是因爲玩家ENTER_FRAME移動了玩家,然後其他ENTER_FRAME檢查了碰撞(在CollisionBase.class中)以及在玩家ENTER_FRAME的下一個週期中玩家退後一步。如果你有一個ENTER_FRAME,這種事情永遠不會發生。

我建議你其他的選擇。看下面這個例子,看看它是怎麼回事,也許它給你一些想法;)

Download the example

+0

碰撞似乎對示例文件運作良好。然而,它不使用基類作爲障礙,而是使用mainclass。你能否更新一下這個例子,以便運動和碰撞代碼在玩家類和障礙物基類中起作用,而不是使用主類?我很抱歉,但我很困惑,無法使用它,謝謝! – Crook

+0

如果你想要,你可以爲障礙物設置一個'class',但是如果你看看這個例子,我試圖解釋的是:在Main Class中有所有的遊戲邏輯代碼'(主要ENTER_FRAME)更好。如果你有很多'ENTER_FRAMES',你會遇到很多麻煩。但是,如果您想這樣做,請按照我在帖子中提到的步驟使用您當前的遊戲邏輯修復您的遊戲。 – ElChiniNet

+0

我試過你的代碼,但我猜它是非常糟糕的?出於某種原因,我的播放器在接觸物體時停下來,不能移動。我用if(_collision){}。即使我沒有在代碼中加入任何東西,它也會讓我的角色停下來。 – Crook