2015-07-03 125 views
0

你好我的問題是如上所述。我有一個隨機生成的地下城與玩家和隨機塊。地牢中的所有房間都保存在包含房間數據的ROOMS 2D數組中。你有一個當前的Row和當前的Col,這是玩家所在的位置。我需要知道的是如何說如果在當前位置上方沒有空間,那麼改變外牆圖形以關閉沒有空間的出口/門。我有這個有點工作,但無論如何我改變它總是有一個房間,只是不會工作,如果我嘗試添加代碼。我現在所擁有的是if語句,如果聲明說如果房間[currentRow + 1] [currentCol](<將等於向下),所以如果存在一排,則通過執行gotoAndStop來更改圖形。因此,如何確定一個職位是否存在是最好的方法,因爲這樣會隨機回過頭來,出現諸如「職位未定義且沒有任何屬性」之類的錯誤。此外,我有非常髒的代碼,對不起,即時新的,生病嘗試後來清理它,但如果你們任何人都覺得喜歡它,我不會阻止你哈哈!Actionscript 3 - 如何檢查陣列位置是否已經存在

我對任何回覆感激不盡!這裏是我的房間級

package { 
import flash.display.MovieClip; 
import flash.events.Event; 



public class Room extends MovieClip{ 

    var room1:Array = new Array(); 
    var room2:Array = new Array(); 
    var room3:Array = new Array(); 
    var room4:Array = new Array(); 
    var room5:Array = new Array(); 
    var room6:Array = new Array(); 
    var room7:Array = new Array(); 
    var room8:Array = new Array(); 
    var room9:Array = new Array(); 
    var room10:Array = new Array(); 

    var currentRow:int = 0; 
    var currentCol:int = 0; 

    var box:Box; 
    var boxes:Array; 
    var ROOMS:Array; 
    var onTop:Boolean; 
    var moved:Boolean; 
    private var player:Player; 
    private var walls:Walls; 
    private var blocker1:Blocker; 
    private var blocker2:Blocker; 
    private var blocker3:Blocker; 
    private var blocker4:Blocker; 
    private var arrowImage:ArrowSymbol; 

    public function Room(){ 
     init(); 

     createRooms();//add the walls + boxes of first room to the first array value // later make floors array that contains all the rooms and room array that contains all the boxes and enemies + events 
     stage.addChild(ROOMS[currentRow][currentCol]); 
     Constants.wallsRef = ROOMS[currentRow][currentCol]; 
     addEventListener(Event.ENTER_FRAME, update); 
     stage.addChild(arrowCount); 
     stage.addChild(arrowImage); 

    } 
    function init(){ 
     Constants.stageRef=stage; 
     player = new Player(); 
     //add walls 
     walls = new Walls(); 
     Constants.wallsRef=walls; 


     blocker1 = new Blocker();//BLOCKER WHEN PLAYER TOUCHES IT CHANGES ROOM 
     blocker1.x = 350; 
     blocker1.y = 1; 
     stage.addChild(blocker1); 

     blocker2 = new Blocker(); 
     blocker2.x = 350; 
     blocker2.y = 619; 
     stage.addChild(blocker2); 

     blocker3 = new Blocker(); 
     blocker3.x = -30; 
     blocker3.y = 300; 
     blocker3.rotation = 90; 
     stage.addChild(blocker3); 

     blocker4 = new Blocker(); 
     blocker4.x = 700; 
     blocker4.y = 300; 
     blocker4.rotation = 90; 
     stage.addChild(blocker4); 

     Constants.blockerRef1 = blocker1; 
     Constants.blockerRef2 = blocker2; 
     Constants.blockerRef3 = blocker3; 
     Constants.blockerRef4 = blocker4; 
     //add player 

     player.x = 300; 
     player.y = 200; 
     stage.addChild(player); 

     arrowImage = new ArrowSymbol(); 
     arrowImage.x = 630; 
     arrowImage.y = 30; 



     box = new Box(); 
     boxes = new Array(); 
     ROOMS = new Array([room2], 
          [room6, room1, room5], /// THIS IS THE MAP OF THE FLOOR /// GOING UP ON THE GAME IS GOING DOWN ON IT 
          [room7, room8], 
          [room3, room9], 
          [room4]);//THIS WILL EVENTUALLY BE COMPLETELY RANDOMIZED// 

     onTop = false; 
     moved = false; 

    } 

    function update(e:Event){ 
     arrowCount.text = " " + Constants.arrowNumRef;//arrow amount left 
     closeUnnecessaryExits(); 

     //UP 
     if(Constants.blockerRef1.hitTestPoint(player.x,player.y) && moved != true){ 
      stage.removeChild(ROOMS[currentRow][currentCol]);//remove the room you are in so the new room doesnt overlap 
      currentRow++;//change where the player is in 
      stage.addChild(ROOMS[currentRow][currentCol]);//add new room 
      Constants.wallsRef = ROOMS[currentRow][currentCol];//add colision 
      player.y = 600; 
      stage.addChild(arrowCount); 
      stage.addChild(arrowImage); 
      trace(); 
      moved = true; 
     }else if(Constants.playerRef.hitTestObject(Constants.blockerRef1) == false && moved == true){ 
      moved = false; 
     } 

     //DOWN 
     if(Constants.blockerRef2.hitTestPoint(player.x,player.y) && moved != true){ 
      //this will be where i want to change rooms 
      stage.removeChild(ROOMS[currentRow][currentCol]); 
      currentRow--; 
      Constants.wallsRef = ROOMS[currentRow][currentCol]; 
      stage.addChild(ROOMS[currentRow][currentCol]); 
      player.y = 10;//change to 600 
      moved = true; 
      trace("changed rooms"); 
      stage.addChild(arrowCount); 
      stage.addChild(arrowImage); 
     }else if(Constants.playerRef.hitTestObject(Constants.blockerRef1) == false && moved == true){ 
      moved = false; 
     } 


     //LEFT 
     if(Constants.blockerRef3.hitTestPoint(player.x,player.y) && moved != true){ 
      stage.removeChild(ROOMS[currentRow][currentCol]);//remove the room you are in so the new room doesnt overlap 
      currentCol--;//change where the player is in 
      stage.addChild(ROOMS[currentRow][currentCol]);//add new room 
      Constants.wallsRef = ROOMS[currentRow][currentCol];//add colision 
      player.x = 600; 
      stage.addChild(arrowCount); 
      stage.addChild(arrowImage); 
      moved = true; 
     }else if(Constants.playerRef.hitTestObject(Constants.blockerRef1) == false && moved == true){ 
      moved = false; 
     } 

     //RIGHT 
     if(Constants.blockerRef4.hitTestPoint(player.x,player.y) && moved != true){ 
      //this will be where i want to change rooms 
      stage.removeChild(ROOMS[currentRow][currentCol]); 
      currentCol++; 
      Constants.wallsRef = ROOMS[currentRow][currentCol]; 
      stage.addChild(ROOMS[currentRow][currentCol]); 
      player.x = 10;//change to 600 
      moved = true; 
      trace("changed rooms"); 
      stage.addChild(arrowCount); 
      stage.addChild(arrowImage); 
     }else if(Constants.playerRef.hitTestObject(Constants.blockerRef1) == false && moved == true){ 
      moved = false; 
     } 
    } 

    function createRooms(){ 
     for(var r = 0; r <ROOMS.length; r++){ 
      walls = new Walls(); 
      addRandomBlocks(); 
      for(var c = 0; c < ROOMS[r].length; c++){ 
       walls = new Walls(); 
       addRandomBlocks(); 
       ROOMS[r][c] = walls; 
      } 



      trace(ROOMS[r][c]); 
     } 
    } 
    //     [room2, NaN], 
    //     [room6, room1, room5], /// THIS IS THE MAP OF THE FLOOR /// GOING UP ON THE GAME IS GOING DOWN ON IT 
    //     [room7, room8], 
    //     [room3, room9], 
    //     [room4]); 
    function closeUnnecessaryExits(){ 
     trace("ROW: " + currentRow + " COL: " + currentCol); 

     var up = ROOMS[currentRow + 1]; 
     var down = ROOMS[currentRow - 1]; 
     var right = ROOMS[currentRow][currentCol + 1]; 
     var left = ROOMS[currentRow][currentCol - 1]; 
     //check to see which outside wasall to use 
     if(ROOMS[currentRow + 1] == null && up && right && left){ 
      ROOMS[currentRow][currentCol].gotoAndStop(2); 
     }else if(down == null && left == null && right && up){ 
      ROOMS[currentRow][currentCol].gotoAndStop(3); 
     }else if(down == null && left == null && up == null && right){ 
      ROOMS[currentRow][currentCol].gotoAndStop(4); 
     }else if(left == null && down && right && up){// IF HAVING PROBLEMS THEN MAKE THIS MAKE SURE ALL OTHER SIDES ARE TRUE 
      ROOMS[currentRow][currentCol].gotoAndStop(5); 
     }else if(down == null && left == null && right == null && up){ 
      ROOMS[currentRow][currentCol].gotoAndStop(6); 
     }else if(down && up == null && right == null && left == null){ 
      ROOMS[currentRow][currentCol].gotoAndStop(7); 
     }else if(ROOMS[currentRow + 1][currentCol] == null && ROOMS[currentRow - 1][currentCol] && left && right){ 
      ROOMS[currentRow][currentCol].gotoAndStop(8); 
      trace("works 1"); 
     }else if(left && right && ROOMS[currentRow - 1][currentCol] == null && ROOMS[currentRow + 1][currentCol] == null){ 
      ROOMS[currentRow][currentCol].gotoAndStop(9); 
      trace("works 2"); 
     }else if(left && ROOMS[currentRow - 1][currentCol] && right == null && ROOMS[currentRow + 1][currentCol] == null){ 
      ROOMS[currentRow][currentCol].gotoAndStop(10);// LEFT DOWN 
      trace("works 3"); 
     }else if(left && ROOMS[currentRow + 1][currentCol] && ROOMS[currentRow - 1][currentCol] == null && right == null){ 
      ROOMS[currentRow][currentCol].gotoAndStop(11);//BROKEN left up 
      trace("working 4"); 
     }else if(left && ROOMS[currentRow + 1][currentCol] == null && ROOMS[currentRow - 1][currentCol] == null && right == null){ 
      ROOMS[currentRow][currentCol].gotoAndStop(12); 
      trace("works 5"); 
     }else if(right == null && left && up && down){ 
      ROOMS[currentRow][currentCol].gotoAndStop(13); 
      trace("works 6"); 
     } 
    } 

    function addRandomBlocks(){ 
     for(var e=0; e <Math.random() * 10; e++){ 
      //trace("started block"); 
      box = new Box(); 
      box.x = Math.random() * (615 - 100) + 100; 
      box.y = Math.random() * (500 - 120) + 120; 
      //colision for block to block 
      for(var col = 0; col < boxes.length; col++){ 
       if(box.hitTestObject(boxes[col])){ 
        onTop = false;/// THIS NEEDS TO BE TRUE FOR THE DETECTION TO WORK 
        //trace("THIS BOX IS ON TOP OF ANOTHER"); 
       } 
      } 
      if(onTop == false){ 
       boxes.push(box); 
       walls.addChild(box); 
       trace("BOX CREATED " + onTop); 
       //trace(boxes); 
      } 

     } 
    } 

} 

}

+0

ockerRef3',如果你已經有'blocker3'作爲該對象的引用?如果你可以(也應該)簡單地將'addChild'添加到'房間本身,因爲它'擴展了MovieClip',爲什麼'將addChild'全部加到'stage'(也是不好的練習)。一般來說,你的「課室」課程太過分了:創造了很多房間,做了一些碰撞。如果你將問題更清楚地分開,他們會更容易處理。 – null

+0

感謝評論,就像我說我只是有點通過教我自己學習,所以我有非常髒的代碼。我試圖改變這些東西。當我已經擁有它們時使用常量是因爲它曾經是在牆上的課程,但我搬了它,忘了改變它。所以我可以爲屏幕上需要的所有東西做「this.addChild()」?我應該如何更清楚地分辨問題。對不起我在這很糟糕,但我很樂意使用更好的練習 – DoctorDimonds

+0

@null你也認爲我應該完全不讓常量類,但然後我怎麼會得到我需要在我的所有類的東西? – DoctorDimonds

回答

2

你可以通過創建一個與分配,並在你的二維數組訪問值處理一些簡單的功能簡化您的代碼。一來檢查,如果一個二維數組中的元素存在可能看起來像:,

function cellExists(array:Array, x:int, y:int):Boolean { 
    return array[y] !== undefined && array[y][x] !== undefined; 
} 

使用像在您的示例:

if (cellExists(ROOMS, currentCol, currentRow)) { 
    // 
} 

雖然這種類型的任務,你將極大地從執行類受益它處理網格+細胞的數據,沿此線的東西,讓你開始:爲什麼你使用`Constants`全局對象(這是不好的做法),像`Constants.bl引用

public class Grid { 
    private var _content:Vector.<Vector.<Cell>>; 

    public function Grid(columns:int, rows:int) { 
     // Fill _content with empty slots based on columns, rows. 
    } 

    public function getCell(x:int, y:int):Cell {} 
    public function cellExists(x:int, y:int):Boolean {} 
} 
+0

嗯,當我創建只是cellExists函數,並執行if語句,它將工作,如果位置是存在但每當位置不存在itll給我的錯誤#1010一個術語是未定義的,沒有任何屬性。 – DoctorDimonds

+0

@ user2562898對。那麼試試更新的代碼吧。我沒有使用Flash /已經安裝了,所以我無法證明它。 – Marty

+0

非常感謝!它工作完美!另外爲什麼我應該添加在網格類? – DoctorDimonds