Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.01.2014, 00:26
kotyavo вне форума Посмотреть профиль Отправить личное сообщение для kotyavo Найти все сообщения от kotyavo
  № 1  
Ответить с цитированием
kotyavo

Регистрация: Dec 2013
Сообщений: 49
По умолчанию Найти 3x3 и 4х4 соседей в массиве

Добрый вечер.
Подскажите как сделать поиск по квадрату 2d массиву 4x4 соседей делаю в игре механизм бомбы + ударная волна.

В игре у меня 2 типа волны круговая это 3х3 и а 4х4 клетки это двойная волна от точки бомбы

Пример 4х4 волны...
Код:
  0 0 0 
0 0 0 0 0
0 0 В 0 0
0 0 0 0 0
  0 0 0
я пока сделал вариант только 3х3 но он мне не нравится... пока не придумал как сократить (((
Код AS3:
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);
	}
}
Покажите как сделать 4х4
Буду рад вашей помощи, заранее спасибо!


Последний раз редактировалось kotyavo; 21.01.2014 в 00:40.
Старый 21.01.2014, 03:25
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
у каждой клетки должен быть свой уникальный ID что логично. Далее создаете карту волны, массив одномерный
[1 , 0 , 0 , 0 , 1
0 0 0 0 0 ...
И т.д.
Далее пишем алгоритм расчета волны от ID клетки. Все. То что у вас написано это конечно ерунда, делается это не то, чтобы короче, просто нужен алгоритм и реализация, а не просто набросок-превью
__________________
Марк Tween

Старый 21.01.2014, 14:16
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 3  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
У меня была похожая зачада только с другим типом поля. Формулируется так:
Написать функцию, которая принимала бы размеры поля, координаты одной ячейки, два радиуса (внутренний и внешний), ссылку на массив ячеек и подсвечивала бы все ячейки находящиеся на заданном расстоянии от заданной ячейки. При этом, если внутренний радиус больше нуля, то ячейки, находящиеся в этом радиусе от заданной, не должны подсвечиваться. Функция также принимает дополнительный булевый параметр, который указывает на то, следует ли подсветить центральную ячейку.
Сигнатура:
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


А вот и сама функция, полагаю, это вам поможет.
Код AS3:
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 все что угодно.
}

Старый 21.01.2014, 19:01
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 4  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Что-нибудь такое?
Код AS3:
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);
				}
			}
		}
	}
 
}

Старый 22.01.2014, 00:01
kotyavo вне форума Посмотреть профиль Отправить личное сообщение для kotyavo Найти все сообщения от kotyavo
  № 5  
Ответить с цитированием
kotyavo

Регистрация: Dec 2013
Сообщений: 49
bav я ваш пример обязательно использую прикольно получается как только под него эффект придумаю.

Пока остановился на варианте Rzer
Спасибо всем

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.