PDA

Просмотр полной версии : Глубина отображения


sampo
26.01.2013, 21:25
пишу сапера,выставляю мины в цикле for ,необходимо спрятать их на нулевую глубину.
Помню что то вроде : setChildIndex(mine,0);
Попробовал,не вышло какие могут быть еще варианты?

вот сам код

//цикл выставления мин
for(var i1:int = 0 ; i1 < mineNumber ; i1++ ) {
var mine:Mine = new Mine(); //каждую иттерацию создаем минку
var locationMineX:int = 30 * Math.floor(Math.random()*mineNumber );//рандом координаты по х
var locationMineY:int = 30 * Math.floor(Math.random()*mineNumber );//рандом коорды по у
locationMineX = locationMineX - locationMineX % 30;//пересчитываем для кратности 30(размеру кнопки/мины)
locationMineY = locationMineY - locationMineY % 30;//пересчитываем для кратности 30(размеру кнопки/мины)
mine.x = clBtn.startLocationX + locationMineX;//используем коорды поля для начального отсчета
mine.y = locationMineY;
arrMine.push(clBtn.startLocationX + locationMineX,locationMineY);//добавляем в конец массива коорды
setIndexChild(mine,0); // ОШИБКА!ОПИСАНИЕ НИЖЕ.
addChild(mine)
}

ОШИБКА!
RangeError: Error #2006: Предоставленный индекс выходит за допустимые пределы.
at flash.display::DisplayObjectContainer/setChildIndex()

strangedk
26.01.2013, 23:37
setIndexChild(mine,0);
addChild(mine)

Вместо этого используйте addChildAt(mine, 0);

sampo
26.01.2013, 23:49
Не помогло

strangedk
27.01.2013, 00:28
addChildAt(mine, 1);

:D

Не ясно же, где находится вызов ф-ции, не ясно куда добавляется элемент.
сколько вообще объектов на сцене, посмотрите numChildren свойство у контейнера

sampo
27.01.2013, 02:27
на первом уровне всегда находятся элементы,но addChildAt(mine,0); почему то не работает.

Mkey
27.01.2013, 03:27
Зачем мины расставлять заранее? Можно же при открытие ячейки вставлять.

GBee
27.01.2013, 18:55
Не помогло

и ошибка та же?

Tails
27.01.2013, 19:17
В сапёре мины генерируются после первого нажатия на квадратик. Таким образом нельзя убиться при первом же клике.

GBee
27.01.2013, 22:36
В сапёре мины генерируются после первого нажатия на квадратик. Таким образом нельзя убиться при первом же клике.

Неправда. Кучу раз убивался. Откройте, да попробуйте.

Frost47rus
28.01.2013, 06:06
setIndexChild(mine,0);
addChild(mine)

Вы сами-то свой код читали? Или писали не глядя?
Сначала - добавить нужно. И только потом задавать индекс.
И, для справки:

setChildIndex

Добавлено через 31 минуту
Собственно, не совсем понятна логика построения игры.
Вместо того, чтобы расставлять мины под клетки - не проще ли сделать саму клетку носителем этой информации?
В таком случае, у вас клетка будет иметь 5 состояний:
-клетка закрытая
-клетка помеченная флагом
-клетка открытая
-клетка с цифрой
-бомба

Расставляете клетки:

var emptyCells:Vector.<GameCell> = new Vector.<GameCell>();
var bombCells:Vector.<GameCell> = new Vector.<GameCell>();
var bombMap:BitmapData = new BitmapData(tableWidth, tableHeight, true, 0);
var i:int, j:int;
for (i = 0; i < tableHeight; i++) {
for (j = 0; j < tableWidth; j++) {
var gameCell:GameCell = new GameCell();
gameCell.position = new Point(i, j);
emptyCells.push(gameCell);
}
}
for (i = 0; i < bombsToPlace; i++) {
var num:int = Math.floor(Math.random() * emptyCells.length);
var bombCell:GameCell = emptyCells[num];
bombCell.setBombState();
emptyCells.splice(num, 1);
bombCells.push(bombCell);
bombMap.setPixel(bombCell.position.x, bombCell.position.y, 1);
}

Дальше в цикле по бомбам можно пробежаться и, зная их координаты, достать соседние клетки по соответствующим координатам (-1, 0) (0, -1) (+1, 0) (0, +1) (-1, -1) (1, -1) (1, 1) (1, -1) - и назначить им какой-нибудь метод
gameCell.updateCounter();
В котором добавлять к счётчику единичку
Таким образом получите и счётчики на клетках. А дальше вешаете на контейнер 1 листенер.
По клику достаёте
var gameCell = event.target as GameCell;
И вызываете у неё какой-нибудь метод open();
Скажем, по коллбеку вызываете проверку логики. О_о
Вот и вся игра.

Psycho Tiger
28.01.2013, 11:50
Неправда. Кучу раз убивался. Откройте, да попробуйте.
Tails прав. Во всяком случае в вин сапёре до XP включительно.