|
|
|||||
Регистрация: Dec 2013
Сообщений: 49
|
Найти 3x3 и 4х4 соседей в массиве
Добрый вечер.
Подскажите как сделать поиск по квадрату 2d массиву 4x4 соседей делаю в игре механизм бомбы + ударная волна. В игре у меня 2 типа волны круговая это 3х3 и а 4х4 клетки это двойная волна от точки бомбы Пример 4х4 волны... я пока сделал вариант только 3х3 но он мне не нравится... пока не придумал как сократить ((( public function wpBoobm(fishka:Fishka):void { var arr:Array = new Array(); // Левая if ((fishka.col-1) >= 0 ) { arr.push( new Array(fishka.col - 1, fishka.row)); } // правая if ( (fishka.col+1) <= vars.GRID_SIZE_X ) { arr.push( new Array(fishka.col+1, fishka.row)); } // верх if ( (fishka.row -1) >=0 ) { arr.push( new Array(fishka.col, fishka.row - 1)); // Верх правая if ((fishka.col + 1) <= vars.GRID_SIZE_X) { arr.push( new Array(fishka.col + 1, fishka.row-1)); } // Верх левая if ((fishka.col -1) <= 0 ) { arr.push( new Array(fishka.col - 1, fishka.row-1)); } } // низ if ( (fishka.row +1) <= vars.GRID_SIZE_Y ) { arr.push(new Array(fishka.col, fishka.row + 1)) // Низ левая if ((fishka.col) -1 >=0 ) { arr.push( new Array(fishka.col - 1, fishka.row+1)); } // Низ правая if ((fishka.col +1) <= vars.GRID_SIZE_X ) { arr.push( new Array(fishka.col +1, fishka.row+1)); } } // Тек. arr.push( new Array(fishka.col, fishka.row)); for (var i:int = 0 ; i < arr.length; i++) { this.grid[arr[i][0]][arr[i][1]].switchType(3); } } Буду рад вашей помощи, заранее спасибо! Последний раз редактировалось kotyavo; 21.01.2014 в 00:40. |
|
|||||
[+4 06.05.14]
|
у каждой клетки должен быть свой уникальный ID что логично. Далее создаете карту волны, массив одномерный
[1 , 0 , 0 , 0 , 1 0 0 0 0 0 ... И т.д. Далее пишем алгоритм расчета волны от ID клетки. Все. То что у вас написано это конечно ерунда, делается это не то, чтобы короче, просто нужен алгоритм и реализация, а не просто набросок-превью
__________________
Марк Tween |
|
|||||
У меня была похожая зачада только с другим типом поля. Формулируется так:
Написать функцию, которая принимала бы размеры поля, координаты одной ячейки, два радиуса (внутренний и внешний), ссылку на массив ячеек и подсвечивала бы все ячейки находящиеся на заданном расстоянии от заданной ячейки. При этом, если внутренний радиус больше нуля, то ячейки, находящиеся в этом радиусе от заданной, не должны подсвечиваться. Функция также принимает дополнительный булевый параметр, который указывает на то, следует ли подсветить центральную ячейку. Сигнатура: void glowRadius(Cell ** cells, int width, int height, int centerX, int centerY, int r1, int r2, bool glowCenter); r1 - внутренний радиус, r2 - внешний радиус. Подсветить ячейку можно, скажем, так: cells[y][x].glow(); В случае некорректных входных данных функция просто завершает работу. Внутренний радиус должен быть строго меньше внешнего. На первом рисунку - собственно поле, на втором рисунке приведен результат следующих двух вызовов функции: glowRadius(cells, 8, 8, 2, 3, 1, 2, true); glowRadius(cells, 8, 8, 7, 6, 0, 2, false); На третьем рисунке представлен результат вызова функции glowRadius(cells, 8, 8, 2, 3, 2, 3, true); Рис. 1 Рис. 2 Рис. 3 А вот и сама функция, полагаю, это вам поможет. private function glowRadius(cells:DisplayObjectContainer, width:int, height:int, xc:int, yc:int, r1:int, r2:int, glowCenter:Boolean = false):void { // Проверка на неверные данные if (width <= 0 || height <= 0 || !cells || yc < 0 || yc >= height || xc < 0 || xc >= width || r1 < 0 || r2 < 0 || (r1 >= r2 && r2 > 0)) return; // Массив, в который будут собираться объекты вида { cell:cell, x:x, y:y } var array:Array = []; // Начальные значения переменных var lenStart:int = r2 * 2 + 1; var length:int = lenStart; var countDiscard:int = r1 * 2 + 1; var countAllow:int = length - countDiscard; var xs:int = xc - r2; var xe:int = xs + length - 1; var xcur:int = xs; var ycur:int = 0; var dy:int = 0; var cell:MovieClip; // Проходимся по вертикали r2 количество раз for (var a:int = 0; a <= r2 && r2 > 0; a++) { // Начинаем с центральной полосы for (var b:int = 0; b < length; b++) { if ((Math.abs(xs - xcur) < (countAllow / 2)) || (Math.abs(xe - xcur) < (countAllow / 2))) { if (dy == 0) { ycur = yc; if (xcur >= 0 && xcur < width) { cell = cells.getChildByName("cell_" + ycur + "_" + xcur) as MovieClip; array.push( { cell:cell, x:xcur, y:ycur } ); } } else { ycur = yc + dy; if (xcur >= 0 && xcur < width && ycur >= 0 && ycur < height) { cell = cells.getChildByName("cell_" + ycur + "_" + xcur) as MovieClip; array.push( { cell:cell, x:xcur, y:ycur } ); } ycur = yc - dy; if (xcur >= 0 && xcur < width && ycur >= 0 && ycur < height) { cell = cells.getChildByName("cell_" + ycur + "_" + xcur) as MovieClip; array.push( { cell:cell, x:xcur, y:ycur } ); } } } xcur++; } // При переходе на следующую полосу корректируем значения переменных if (((yc + a) % 2) > 0) xs++; xcur = xs; length--; countDiscard--; dy++; countAllow = length - (dy <= r1 ? countDiscard : 0); xe = xs + length - 1; } if (glowCenter && xc >= 0 && xc < width && yc >= 0 && yc < height) { cell = cells.getChildByName("cell_" + yc + "_" + xc) as MovieClip; array.push( { cell:cell, x:xc, y:yc } ); } // Далее делаем с массивом array все что угодно. } |
|
|||||
Что-нибудь такое?
function boom3x3(item:Item){ for (var i:int =item.col-1; i <= item.col+1; i++){ for (var j:int =item.row-1; j <= item.row+1; j++){ if (i <= GRID_SIZE_X && i >= 0 && j <= GRID_SIZE_Y && j >= 0 ){ var distance:int = Math.abs(item.col-i) + Math.abs(item.row-j); if (distance < 3){ grid[i][j].switchType(3); } } } } }
__________________
if (love is true) break my.heart; |
|
|||||
Регистрация: Dec 2013
Сообщений: 49
|
bav я ваш пример обязательно использую прикольно получается как только под него эффект придумаю.
Пока остановился на варианте Rzer Спасибо всем |
Часовой пояс GMT +4, время: 23:30. |
|
« Предыдущая тема | Следующая тема » |
|
|