2013-05-08 139 views
0

爲了讓事情變得快速,我有一個玩家和敵人在一起的瓷磚佈置。敵人隨機移動

public static var floor1:Array = new Array(7); 
     floor1[0] = [0,1,1,1,1,1,0]; 
     floor1[1] = [1,1,1,1,1,1,1]; 
     floor1[2] = [1,1,1,0,1,1,1]; 
     floor1[3] = [1,1,0,0,0,1,1]; 
     floor1[4] = [1,1,1,0,1,1,1]; 
     floor1[5] = [1,1,1,1,1,1,1]; 
     floor1[6] = [0,1,1,1,1,1,0]; 
     public function Main() 
     { 

      var tilew:int = 60; 
      var tileh:int = 60; 

      for (var i:int=0; i<floor1.length; i++) 
      { 
       for (var u:int=0; u<floor1[i].length; u++) 
       { 
        var cell:MovieClip = new Tile(); 
        cell.gotoAndStop(floor1[i][u]); 
        cell.x = ((u-i)*tileh); 
        cell.y = ((u+i)*tilew/2); 
        addChild(cell); 


        cell.addEventListener(MouseEvent.ROLL_OVER, mouseover); 
        cell.addEventListener(MouseEvent.ROLL_OUT, mouseout); 
        cell.addEventListener(MouseEvent.CLICK, mouseclick); 
        cell.addEventListener(Event.ENTER_FRAME, beginfloor1); 


       } 
      } 

      var player:Player = new Player(); 
     addChild(player); 
     player.mouseEnabled = false; 
     player.x = 5 * (tileh); 
     player.y = 5 * (tilew/2); 


     var enemy:Enemy = new Enemy(); 

     addChild(enemy); 
     enemy.mouseEnabled = false; 
     enemy.x = 9 * (tileh); 
     enemy.y = 9 * (tileh/2); 

我的目標是讓敵人在他的範圍內隨機移動瓷磚。我所做的是創建一個名爲enemyVisionArea的方形圖形,用於檢查哪個瓷磚擊中敵人,基本上是圍繞瓷磚。

我有一個計時器功能,告訴敵人每5秒移動一次,如果玩家不在他附近,並且他在旁邊有可用的方塊。

function timerenemy (event:TimerEvent){ 
       if (enemy.enemyVisionArea.hitTestObject(enemyMover) && !player.visionPoint.hitTestObject(enemyMover.tileMiddle)) 
        { 
         enemy.x = (enemyMover.x)+55; 
         enemy.y = (enemyMover.y)+20; 
         trace("moved"); 

        } 
      } 

enemyMover是一個變量,我使它等於瓦片對象。

function beginfloor1(event:Event) 
      { 
       enemyMover = event.currentTarget as Tile; 

      } 

它只是停留在原地。我只是想讓敵人自己在敵方視野區域的任何一塊瓦片上擊中附近的一塊瓦片。 beginfloor1函數似乎沒有工作。有沒有什麼辦法可以將enemyMover = event.currentTarget聲明爲Tile並讓敵人移動到其enemyVisionArea進行測試的隨機區塊上?

如果這是令人困惑的,我可以發佈完整的代碼。

回答

1

您正在分配49個按順序調用的框架監聽器,並且它們都將一個變量更改爲它們所連接的單元。當然,最後一塊是始終分配的。

我希望你希望敵人檢查是否有可用的瓷磚移動到。你本質上是檢查一個是enemyMover的瓷磚 - 你如何確定那個瓷磚是什麼?你必須檢查敵人周圍的所有可用區域,製作一個列表並從列表中選擇一個不是當前區域的區域,然後將敵人移動到那裏。

所以,首先你需要一個完整的tileset從某個地方尋址。最好的方法是申報一個班級var tileset:Array並填寫你製作新瓷磚的地方。從代碼中刪除Event.ENTER_FRAME監聽器,因爲它沒用。然後,在敵人的timerevent中,如果敵人位於敵人的視野範圍內(hitTestObject,我使用明確的距離網格或協調方式 - 更快),請檢查所有tileset,如果是這樣,您將它們添加到您在該函數中創建的TEMPORARY數組中。當然,如果你的敵人在目前處理的單元格中,你會忽略它 - 你必須移動你的敵人,而不是讓他站在原地。然後,選擇(不知何故,由你決定)你的敵人應該移動到什麼單元格並執行移動。是的,如果你想讓你的敵人隨機移動,請通過Math.floor(Math.random()*selectedcells.length)索引隨機選擇一個單元格。

+0

感謝您的回答。用數組替換enemyMover是有意義的,因爲它不止一個tile。關於psuedo tileset數組變量,我想讓它等於floor1變量數組嗎? – Bindlestick 2013-05-08 21:44:58

+0

'floor1'只是一組索引,而你需要一個相應的'Tile'對象來引用。但是,使用'floor1'和tileset會幫助你過濾不可行的瓷磚。 – Vesper 2013-05-09 06:55:18

+0

我將如何使tileset等於一個Tile對象?我已經嘗試在之前進行賦值,並且它說數組不能等於影片剪輯 – Bindlestick 2013-05-10 18:37:50