Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   При удаление ненужных объектов из массива всё равно остаются ненужные объекты (http://www.flasher.ru/forum/showthread.php?t=203306)

Dip52 14.09.2013 15:24

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

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

Положение: Имеется два метода: один метод 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, даже если я не навожу на объект прицел.

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

alexcon314 15.09.2013 13:37

Метод А добавляет в массив target новый объект безусловно.
Цитата:

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

AlexCooper 16.09.2013 13:22

Вижу свой переписанный код)

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



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

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