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

Vansimar 10.10.2013 14:41

полностью не удаляется спрайт
 
В игре героя атакует враг, когда у героя жизней <= 0, нужно его убить и удалить..
Код AS3:

private function onDieComplete(e:Event):void
                {       
                        this.parent.removeChild(this,true);
                }

но в чем, суть, трейс показывает ,что количество объектов на сцене уменьшилось, но враг продолжает бить какого то героя, хотя его на сцене нет, и в чем суть в режиме отладки показывается, что продолжает уменьшаться количество жизней и объект еще существует

AlexCooper 10.10.2013 14:45

То что Вы удалили объект со сцены не означает что Вы удалили объект вообще. Он по прежнему существует, за исключением того что не отображается на сцене.

Vansimar 10.10.2013 14:48

А что можно сделатЬ?

AlexCooper 10.10.2013 14:50

Нужно смотреть как у Вас организованна логика, как создается объект, где прописывается ссылка на него и соответсвено с removeChild удалять объект от туда где он сохранён.

Vansimar 10.10.2013 14:54

ну я его так добавляю
Код AS3:

hero = new Hero();
                        hero.x = 50;
                        hero.y = 397;
                        InGame.enemies.push(hero);

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

Добавлено через 15 минут
Я поставил утилитку для наблюдения за ресурсами памяти, и вот при удалении память освобождается, но враг все равно атакует

AlexCooper 10.10.2013 16:25

Это абсолютно ожидаемое поведение. После удаления спрайта удалите его из этого массива
InGame.enemies

Vansimar 10.10.2013 16:39

А почему так? это ж вроде как одна ссылка на один экземпляр

AlexCooper 10.10.2013 17:01

Потому что выполнив addChild или addChildAt вы не передаете объект целиком. Вы всего лишь говорите плееру что этот объект следует отображать.

Добавлено через 16 минут
соответственно когда Вы используете removeChild / removeChildAt вы не удаляете объект, а просто сообщаете что нужно удалить этот объект с списка отображаемых плеером объектов.

Dip52 11.10.2013 12:26

Цитата:

Сообщение от Vansimar (Сообщение 1148247)
В игре героя атакует враг, когда у героя жизней <= 0, нужно его убить и удалить..
Код AS3:

private function onDieComplete(e:Event):void
                {       
                        this.parent.removeChild(this,true);
                }

но в чем, суть, трейс показывает ,что количество объектов на сцене уменьшилось, но враг продолжает бить какого то героя, хотя его на сцене нет, и в чем суть в режиме отладки показывается, что продолжает уменьшаться количество жизней и объект еще существует

А я у каждого объекта создаю переменную life, если объект умирает, то значение становится life false и соответственно перед битьём проверяется значение life.

caseyryan 11.10.2013 14:13

Цитата:

А я у каждого объекта создаю переменную life, если объект умирает, то значение становится life false и соответственно перед битьём проверяется значение life.
Это тоже не правильно. Ну нет у него жизней, в человеческом понимании, но для программы то он живее всех живых.
Цитата:

А почему так? это ж вроде как одна ссылка на один экземпляр
Экземпляр один, а ссылки разные.
Самый разумный способ - это в классе Hero сделать метод, в котором все, что он насоздавал внутри, уничтожается, и зануляются все ссылки на внешние объекты (если таковые имеются)
И дальше уничтожение свелось бы к такой логике:
Код AS3:

if (hero != null) {
    hero.dispose();
    var index:int = someArray.indexOf(hero); // и сносим из массива, раз уж он там
    if (index > -1) someArray.splice(index, 1);
    hero = null;
}



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

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