2011-02-19 68 views
0

幾個星期我一直試圖讓我的自上而下的遊戲。它進行得很好,但在某個時候我想創建一個滾動的地圖,牆上到處都是。現在,爲了便於創建地圖(後來添加更多內容),我創建了一個名爲「Wall」的類,我將進行測試。這是有效的,當它點擊時,地圖必須停止滾動。到目前爲止它確實如此。的ActionScript 3 - 牆壁不衝突正確

現在,當玩家移動遠離物體,我希望地圖能夠再次滾動,這工作過,但現在玩家無法移動到播放器從附帶的一面。我知道這是因爲我需要定義玩家輸入的邊,以便告訴遊戲哪一個移動必須設置爲零。

你可以看到這裏的代碼:

public function AddWalls(player:MovieClip) 
{ 
    WallObjects = new Array(); 

    for (var i:int = 0; i < this.numChildren; i++) 
    { 
     var mc = this.getChildAt(i); 

     if (mc is Wall) 
     { 
      var wallobj:Object = new Object(); 
      wallobj.mc = mc; 

      wallobj.leftside = mc.x; 
      wallobj.rightside = mc.x + mc.width; 

      wallobj.topside = mc.y; 
      wallobj.bottomside = mc.y + mc.height; 

      wallobj.width = mc.width; 
      wallobj.height = mc.height; 

      WallObjects.push(wallobj); 
     } 
    } 
} 

public function EnableCollisionWithWalls():void 
{ 
    for (var k:int = 0; k < WallObjects.length; k++) 
    { 
     //if (player.y > WallObjects[k].topside && player.y < WallObjects[k].bottomside && player.x > WallObjects[k].leftside && player.x < WallObjects[k].rightside) 
     if (player.hitTestObject(WallObjects[k].mc)) 
     { 
      if (player.x > WallObjects[k].leftside && player.x < WallObjects[k].leftside+15) 
      { 
       Lefthit = true; 
       trace(DebugVar); 
       DebugVar++; 
       player.x = WallObjects[k].leftside; 
       Scroll_x = 0; 
      } 
      else 
       if (player.x < WallObjects[k].leftside -1 || (player.y > WallObjects[k].leftside)) 
       { 
        Lefthit = false; 

       } 

      if (player.hitTestObject(derp)) 
      { 
       Lefthit = false; 
      } 
     } 
    } 
} 

public function EnableMovement():void 
{ 
    map.x += Scroll_x; 
    map.y += Scroll_y; 

    for (var i:int = 0; i < this.numChildren; i++) 
    { 
     var mc = this.getChildAt(i); 
     if (mc is Wall) 
     { 
      mc.x += Scroll_x; 
      mc.y += Scroll_y; 
     } 
    } 
} 

public function MovementKeysDown(move:KeyboardEvent):void 
{ 
    var Speed:int = -5; 

    switch (move.keyCode) 
    { 
     case 37: // venstre knap 
      Scroll_x = -Speed; 
      break; 

     case 38: // op 
      Scroll_y = -Speed; 
      break; 

     case 39: // højre knap 
      Scroll_x = Speed; 
      if (Lefthit) 
      { 
       Scroll_x = 0; 
      } 
      break; 

     case 40: // ned 
      Scroll_y = Speed; 
      break; 

     default: 
    } 
} 

public function MovementKeysUp(move:KeyboardEvent):void 
{ 
    switch (move.keyCode) 
    { 
     case 37: 
      Scroll_x = 0; 
      break; 
     case 38: 
      Scroll_y = 0; 
      break; 
     case 39: 
      Scroll_x = 0; 
      break; 
     case 40: 
      Scroll_y = 0; 
      break; 
     default: 
     } 
    } 

可能是一些語法錯誤(因爲我刪除了在此編輯器的一些代碼)。 您可以看到current version here

在這個版本的滾動持續使用時間長。我確實想出了一個「解決方案」,通過檢查玩家是否距離動畫片夾1個像素,在命中測試中(出於某種原因,這是出於某種原因,我猜測它不應該,因爲它沒有命中),然後將Lefthit設置爲false。然而,這不是一個好的解決方案,如果你繼續向上或向下遠離動畫片段,你仍然無法繼續向右走......

我一直對此很困惑,所以我想那時我正在尋求幫助。我找不到如何控制運動自上而下的遊戲,具有滾動地圖+牆什麼:/

回答

0

最簡單的(但不是大多數資源型)解決方案(如果有反正牆壁單個存儲)正在遍歷牆壁,而不是使用Flash默認的hitTest(我不喜歡它自ActionScript 2以來的工作方式) - 只需檢查座標,並且如果看到在下一個模擬步驟中將出現碰撞,根據遊戲邏輯處理它。

該算法的最有用的優化是唯一獲得該接近的球員,因此可以影響到測試的碰撞牆上,過濾器/數據結構。

+0

我的第一個方法其實不是hitTest,而是座標。儘管如此,我還是無法讓玩家在沒有任何一個的情況下撞牆。導致遊戲繼續將當前命中轉爲錯誤,所以牆仍然移動,或者,目前的方向,你將無法再次前往:/ – Code