2011-12-15 95 views
1

我想創建一個玩家對象的邊界,用箭頭鍵控制,在我的遊戲中使用主舞臺的高度和寬度。例如,一個測試點位於玩家對象的邊界框的頂部邊緣,以便當玩家對象的頭部接觸到舞臺的頂部邊緣時,玩家不能再向北移動。玩家對象通過使用Flash舞臺編輯器手動實例化到舞臺的中心,因此它將在程序啓動之前從中心開始。使用hitTestPoint()與舞臺對象創建對象的邊界

問題是,在程序開始時,我不能再用箭頭鍵向上或向下移動播放器對象,但我仍然可以左右移動它。其目的是讓玩家向北移動,直到玩家對象的頭部接觸主舞臺的頂部邊緣。下面的代碼:

package 
{ 
     public class Main_Playground extends MovieClip 
     { 
     var vx:int; 
     var vy:int; 

     public function Main_Playground() 
     { 
      init(); 
     } 
     function init():void 
     { 
      //initialize variables 
      vx = 0; 
      vy = 0; 

      //Add event listeners 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
      stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 
      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     function onKeyDown(event:KeyboardEvent):void 
     { 
      if (event.keyCode == Keyboard.LEFT) 
      { 
       vx = -5; 
      } 
      else if (event.keyCode == Keyboard.RIGHT) 
      { 
       vx = 5; 
      } 
      else if (event.keyCode == Keyboard.UP) 
      { 
       vy = -5; 
      } 
      else if (event.keyCode == Keyboard.DOWN) 
      { 
       vy = 5; 
      } 
     } 
     function onKeyUp(event:KeyboardEvent):void 
     { 
      if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT) 
      { 
       vx = 0; 
      } 
      else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP) 
      { 
       vy = 0; 
      } 
     } 
     function onEnterFrame(event:Event):void 
     { 
      //Move the player 
      player.x += vx; 
      player.y += vy; 

      //determine top boundary 
      if (! stage.hitTestPoint(player.x, (player.y-(player.height/2)), true)){ 
       player.y -= vy; 
      } 
     } 
    } 
} 

回答

2

使用設置爲true的形狀標誌的階段目標是將產生錯誤:你測試,如有呈現在舞臺上的實際像素的撞擊點(這可能會返回false,除非在可見舞臺區域之外的物體恰好在指定的位置)。

當然,您可以將其設置爲false,然後再試一次(這樣做會更好,但仍然會出現問題,即您正在測試舞臺上呈現的所有內容的邊界框,而不是實際舞臺區域),但我可能會建議一種不同的方法?

這是更有效,特別是因爲你的精靈可能比舞臺小得多,測試玩家的邊框對舞臺的界限:

function onEnterFrame (ev:Event) : void { 
    player.x += vx; 
    player.y += vy; 

    var playerBounds:Rectangle = player.getBounds(stage); 
    if (playerBounds.left < 0 || playerBounds.right > stage.stageWidth) player.x -= vx; 
    if (playerBounds.top < 0 || playerBounds.bottom > stage.stageHeight) player.y -= vy; 
} 

玩家必須位於舞臺可見區域內當然,在啓動時,您可能必須將焦點放在舞臺上以確保捕獲鍵盤事件。

+0

我已經使用其他方法成功,但我很好奇'hitTestPoint`如何工作。我已經將hitTestPoint的第三個參數設置爲false。玩家對象現在可以向北移動,而不是停在舞臺的邊緣,而是被與玩家對象高度相同的不可見屏障阻擋。在「hitTestPoint」的第二個參數中,我將`player.height`分爲4,而玩家對象在向北行進時會離開舞臺邊界。 – user701510 2011-12-15 08:26:39