PDA

Просмотр полной версии : При удаление ненужных объектов из массива всё равно остаются ненужные объекты


Dip52
14.09.2013, 15:24
Здравствуйте.

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

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

Метод A:
//Добавление всех врагов в массив:
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:
//Кто находится в области прицела:
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, даже если я не навожу на объект прицел.

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

alexcon314
15.09.2013, 13:37
Метод А добавляет в массив target новый объект безусловно.
//Добавление всех врагов в массив:
Потому он и добавляется, собственно. Куда ему деваться-то? Вот если сразу после А вызвать метод В, и вновь добавленный объект окажется вне прицела, то, возможно, он будет удален из target. Правда, при этом от меня ускользает смысл его добавления в tаrget...
Вобщем как-то так, все что смогли мои телепатические способности, больше ничего сказать не могу. б-ррр.

AlexCooper
16.09.2013, 13:22
Вижу свой переписанный код)

Но я бы посоветовал как минимум сделать вот так
//Кто находится в области прицела:
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;
}

}