2016-10-25 4 views
0

Итак, я пытаюсь сделать сцены для уровня в моей игре автоматически генерируемым. Я сделал массив (обратите внимание, количество «плитки» на экране 16x16):Автоматическое построение уровня из массива

var background:Array=new Array(
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 
) 

И, как вы, вероятно, может сказать, каждый 1 или 0 соответствует, если плитка одна вещь или другой (там или нет в этом сценарии).

Я довольно плохой в следующей части, которую я сделал.

Я решил сделать это с использованием метода (kinda).

var bkgblocks:Sprite=new Sprite(); 
var bkgblocksw:Number=stage.stageWidth/16 
var bkgblocksh:Number=stage.stageHeight/16 

//the blocks are 45 pixels wide and tall 

var row:int=0; 
for(var i:int=0; i<background.length;i++){ 
    if((i+1)/16==int((i+1)/16)){ 
     //if i is divisible by 16 
     row++ 
    } 
    if(background[i]==1){ 
     bkgblocks.graphics.beginFill(0x000000) 
     bkgblocks.graphics.drawRect(I have no idea what to do here ,row*stage.stageHeight/16,bkgblocksw,bkgblocksh); 
     bkgblocks.graphics.endFill() 
     addChild(bkgblocks) 
    } 
} 

Как вы можете видеть, я понятия не имею, как и где разместить блоки!

У меня есть где разместить координату y, но x слишком запутан.

Я думал, что я мог бы сделать что-то вроде этого

i*(45/(row+1)) 

но перепутались полностью. Это, скорее, математический вопрос, извините, но если кто-нибудь может (или есть) понять это, я был бы признателен.

ответ

2

Кажется, вы запутаны с преобразованием координат 1D-2D.

Ширина вашего экрана (2D-координаты) равна Wdt. Таким образом, элемент с координатами (x, y) будет находиться в y * Wdt + x индексе 1D массива.

A[y * Wdt + x] corresponds to Screen[y][x] 

И обратно tranform:

x = index %% Wdt //integer modulus 
y = index \ Wdt //integer division 

Screen[index \ Wdt] [index %% Wdt] = A[index] 
3

Я обычно предпочитаю упаковки сетки в массив массивов, чтобы сделать его более удобочитаемый е. г.

var grid:Array = [ 
    [0, 0, 1, 0, 0], 
    [0, 1, 0, 1, 0], 
    [1, 0, 0, 0, 1], 
    [0, 1, 0, 1, 0], 
    [0, 0, 1, 0, 0] 
]; 

Если первый (внешний) массив содержит строки ячеек, каждая строка представлена ​​массивом
Таким образом, вы можете получить доступ к ячейке по телефону grid[y][x] и найти «реальный» координаты путем умножения x и y по const CELL_SIZE

Смежные вопросы