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

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

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

Регистрация: Aug 2012
Сообщений: 297
По умолчанию При удаление ненужных объектов из массива всё равно остаются ненужные объекты

Здравствуйте.

Цель: Сделать так, чтобы в определённом массиве были те объекты, которые находятся под прицелом.

Положение: Имеется два метода: один метод A добавляет в массив объекты, другой метод B проверяет какие объекты соприкасаются с прицелом и те, которые не соприкасаются удаляются.

Метод A:
Код AS3:
//Добавление всех врагов в массив:
private function additionEnemies():void
{
	const ENEMIESLENGTH:int = Aiming.enemies.length;
	for(var addition:int = 0; ENEMIESLENGTH> addition; addition++)
	{
		const FEEBLE:MovieClip = Aiming.enemies[addition];
		var are:Boolean = true;
		//Если аналогичного объекта нету в target, то:
		for each(var t:MovieClip in target)
		{
			if(FEEBLE== t)
			{
				are = false;
			}
		}
		//Добавляю объект.
		if(are)
		{
			target.push(FEEBLE);
		}
	}
}
Метод B:
Код AS3:
//Кто находится в области прицела:
private function beRegionEnemies():void
{
	const TARGETLENGTH:int = target.length;
	for(var addition:int = 0; addition < TARGETLENGTH; addition++)
	{
		const ENEMY:MovieClip = target[addition];
		var onePoint:Point = new Point();				//Определяю первую точку:
		var twoPoint:Point = new Point();				//Определяю вторую точку:
		var r:Number = -rotation*Math.PI/180;
 
		onePoint.x = ENEMY.x - x;
		onePoint.y = ENEMY.y - y;
 
		twoPoint.x = onePoint.x*Math.cos(r) - onePoint.y*Math.sin(r);
		twoPoint.y = onePoint.x*Math.sin(r) + onePoint.y*Math.cos(r);
 
		if(range >= getDistanceForesightAndTarget(twoPoint,new Point()) && limit > Math.abs(twoPoint.y))
		{
			ENEMY.deleted = false;
		}
		else
		{
			ENEMY.deleted = true;
		}
		target[addition] = ENEMY;
	}
 
	var ids:Array = [];
	for(var definition:int = 0; TARGETLENGTH > definition; definition++)
	{
		const DELETED:Boolean = target[definition].deleted;
		if(DELETED)
		{
			ids.push(definition);
		}
	}
	const IDSLENGTH:int = ids.length;
	for(var removal:int = 0; removal < IDSLENGTH; removal++)
	{
		const ID:int = ids[removal];
		target.splice(ID,1);
	}
	ids.splice(0,IDSLENGTH);
}
Проблема: Когда на сцене всего один объект, я навожу на него прицел и длина массива составляет 1, когда я убираю прицел с объекта, то длина соответственно становится 0. После того как добавляется второй объект длина массива уже автоматически становится равна 1, даже если я не навожу на объект прицел.

Вопрос: Как можно решить данную проблему?

Старый 15.09.2013, 13:37
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 2  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Метод А добавляет в массив target новый объект безусловно.
Цитата:
//Добавление всех врагов в массив:
Потому он и добавляется, собственно. Куда ему деваться-то? Вот если сразу после А вызвать метод В, и вновь добавленный объект окажется вне прицела, то, возможно, он будет удален из target. Правда, при этом от меня ускользает смысл его добавления в tаrget...
Вобщем как-то так, все что смогли мои телепатические способности, больше ничего сказать не могу. б-ррр.

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Вижу свой переписанный код)

Но я бы посоветовал как минимум сделать вот так
Код AS3:
//Кто находится в области прицела:
private function beRegionEnemies():void
{
	const TARGETLENGTH:int = target.length;
	for(var addition:int = 0; addition < TARGETLENGTH; addition++)
	{
		if (!target[addition]) continue;
 
		const ENEMY:MovieClip = target[addition];
		var onePoint:Point = new Point();				//Определяю первую точку:
		var twoPoint:Point = new Point();				//Определяю вторую точку:
		var r:Number = -rotation*Math.PI/180;
 
		onePoint.x = ENEMY.x - x;
		onePoint.y = ENEMY.y - y;
 
		twoPoint.x = onePoint.x*Math.cos(r) - onePoint.y*Math.sin(r);
		twoPoint.y = onePoint.x*Math.sin(r) + onePoint.y*Math.cos(r);
 
		if(range >= getDistanceForesightAndTarget(twoPoint,new Point()) && limit > Math.abs(twoPoint.y))
		{
			ENEMY.deleted = false;
		}
		else
		{
			ENEMY.deleted = true;
 
			delete target[addition]; // и не забываем что если в массив добавили
			// объекты с индексами 0,1,2,3 а потом удалили объект с индексом 2, то длина массива будет попрежнему 4, так как объект с индексом 2 просто стал = null
			// нужно либо "пересобирать" массив либо выполнять проверку которую я написал сразу после объявления цикла. Все остальные циклы не нужны
		}
		target[addition] = ENEMY;
	}
 
}
__________________
return this...

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

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

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


 


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


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