Форум 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=208657)

skorpionnn333 12.08.2014 01:23

Удаление обьектов
 
Я хочу сделать так чтобы при окончании таймера удалялись все обьекты .Вот код в классе Main
Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class Main extends Sprite
        {
                public var ball:Ball = new Ball;
            var arr:Array = new Array;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        spawnBall();
                }
 
                public function spawnBall():void
                {
 
                        for (var i:uint = 0; i < 10; i++)
                        {
 
                    arr[i] = new Ball;
                        addChild(arr[i]);
            arr[i].x = i * 50;
 
                  }
 
                          flyBall(ball);
 
                }
 
                public function flyBall(ball:Ball):void
                {
                        var time:Timer = new Timer (25, 100);
                        time.start ();
                        time.addEventListener(TimerEvent.TIMER_COMPLETE, removeBall);
                }
 
                function removeBall(e:TimerEvent):void
                {
 
                }
 
 
        }
}

Вот код в классе ball
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Ball extends Sprite
        {
                public var symb:Ballsymb = new Ballsymb;
 
                public function Ball()
                {
                        addChild(symb);
                        this.addEventListener(Event.ENTER_FRAME, cap);
                }
 
                public function cap(e:Event):void
                {
                        this.y ++;
                }
 
        }
 
}

Добавлено через 1 минуту
Если что тут наверно много лишнего .Я только начал практиковать классы и сложно все применить как нужно

LifeIsRhythm 12.08.2014 01:38

1. Таймер у Вас создается локально и будет удален после выполнения метода.
2. Удалить все из контайнера -
Код AS3:

container.removeChildren();

Добавлено через 1 минуту
3. Переменная без модификатора доступа, FD должен желтым предупреждение выводить.

Добавлено через 3 минуты
4. Зачем мячик в flyBall передаете?

Добавлено через 5 минут
5. Обращаетесь к элементу массива сто раз , нужно так -
Код AS3:

// до цикла...
var ball:Ball;
// в цикле...
ball = new Ball;
ball.x = 10;
addChild(ball);
array[i] = ball;


Моше Дауге 12.08.2014 02:57

Код AS3:

//Массив объектов:
private const OBJECTS:Array = [];
//Удаление объектов:
private function removeObjects():void
{
        const LENGTH_OBJECT:int = OBJECTS.length;        //Длина массива объектов:
        for (var indexCurrentObject:int = 0; indexCurrentObject < LENGTH_OBJECT; indexCurrentObject++)
        {
                const CURRENT_OBJECT:Sprite = OBJECTS[indexCurrentObject];        //Текущий объект:
                //Если объект есть на сцене, то:
                if (this.contains(CURRENT_OBJECT))
                {
                        //Удаляем его:
                        this.removeChild(CURRENT_OBJECT);
                }
        }
        //Очищаем массив объектов:
        this.OBJECTS.splice(0, LENGTH_OBJECT);
}


caseyryan 12.08.2014 07:32

Цитата:

1. Таймер у Вас создается локально и будет удален после выполнения метода.
Никуда он не удалится. Во-первых к нему добавлен слушатель, который нигде не удаляется, соответственно существует ссылка, а во-вторых когда объект (на который нет ссылок) удалится, решает сборщик мусора. Это может произойти гораздо позднее, чем выполнится метод.

По теме:
Лучше вообще не добавлять слушатель ENTER_FRAME в каждом мяче, но раз уж здесь так, то надо и об удалении побеспокоиться.
Добавь в класс Ball метод dispose()
Код AS3:

public function dispose():void {
  this.removeEventListener(Event.ENTER_FRAME, cap);
  if (parent) parent.removeChild(this); // можно и сразу с дисплей листа снести.
}

Код AS3:

 
function removeBall(e:TimerEvent):void
{
    e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, removeBall); // не забываем удалить слушатель с таймера
    if (ball) ball.dispose(); // не понятно зачем у тебя этот шарик создан отдельно от тех, что в массиве, но тем не менее, сносим его
    for (var i:String in arr) arr[i].dispose(); // убиваем так же шарики в массиве
    arr.length = 0; // сносим все из массива
 
}

Моше Дауге, почитайте про метод contains в справке. Где и как он ищет объекты.

skorpionnn333 12.08.2014 11:40

caseyryan.Спасибо большое за подробное обьяснение .Я узнал много нового из этого кода,теперь работает все ,а ball там был совершенно лишним я еще из старого кода забыл его удалить

Добавлено через 20 минут
Моше Дауге.Спасибо я прочту про метод contains

LifeIsRhythm 12.08.2014 16:12

Цитата:

Никуда он не удалится. Во-первых к нему добавлен слушатель, который нигде не удаляется, соответственно существует ссылка, а во-вторых когда объект (на который нет ссылок) удалится, решает сборщик мусора. Это может произойти гораздо позднее, чем выполнится метод.
Если честно я знаю об этом, точнее строю предположения, ведь если есть слушатель, то объект уже не удалить. Но вчера в голову пришли слова... вот... теперь даже не знаю, радоваться, что читал эту тему в прошлом или высказаться по поводу последнего комментария от МОДЕРАТОРА.

Но как бы то ни было, как слушатель удалить и таймер если он локальный, caseyryan ?

skorpionnn333 12.08.2014 16:45

А как сделать всем эти обьектам разную скорость ?

LifeIsRhythm 12.08.2014 16:53

Сидеть и месяц разбираться в анимации или скачать готовую, но так и не познать искусства оптимизации в as3 на уровне Брю Ли...

caseyryan 12.08.2014 17:03

Цитата:

Но как бы то ни было, как слушатель удалить и таймер если он локальный, caseyryan ?
Без комментариев. Протри монитор от слюней, и смотри

LifeIsRhythm 12.08.2014 17:11

Код AS3:

Я это уже показал. Протри монитор от слюней, и посмотри четвертый пост

Я не видел ответа, который по теме, точнее не читал и извиняюсь за предыдущий вопрос.
У меня нет слюней на мониторе.. Вы слишком часто о них говорите. Вы вообще часто говорите)))


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

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