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

allex 22.11.2012 13:12

убрать объект с экрана?
 
Добрый день,уважаемые гуру.Столкнулся с такой проблемой,можете подсказать?
Вот пример главного класса(допустим игры) и класса героя:

Код AS3:

package 
 
{ 
        import flash.display.*;
        import flash.events.*;
 
        public class Main  extends MovieClip
 
 
{
        public var hero;
 
 
        public function Main()
{
 
        hero1 = new  hero(this);           
        gamelevel.addChild(hero1);
 
 
..................................
 
 
        gamelevel.removeChild(hero1);
 
  }
 }
}

и героя:

Код AS3:

package  {
 
        import flash.display.*;
        import flash.events.*;
 
        public class hero extends MovieClip {
 
        public var Main;
 
        var herobullet:bullet;
 
        public function hero(main) {
 
        Main = main;
 
        herobullet = new bullet;
        Main.addChild(herobullet);
 
..................................
 
  }

Вопрос состоит в том,что (только учусь)) в главном классе я создаю героя,и после всех манипуляций,я его через removeChild удаляю(конец уровня),но в классе героя создается объект пуля - herobullet.В самом классе hero,я не должен удалять herobullet,так как класс не знает когда конец уровня.
Удаляется ли herobullet с экрана ,когда я удаляю hero1 через removeChild?Или мне надо его удалить отдельно?Если да,то как я это должен прописать в классе Main?Спасибо

caseyryan 22.11.2012 13:40

Цитата:

Удаляется ли herobullet с экрана ,когда я удаляю hero1 через removeChild?Или мне надо его удалить отдельно?
Если пуля добавляется в контейнер героя, то да, удалится вместе с ним. Тут она добавляется в main, поэтому не удалится. Но добавить ее в Main нельзя. Она добавляется в экземпляр, а не в сам класс. Так что конструкция
Код AS3:

 Main.addChild(herobullet);

не будет работать
сработает эта:
Код AS3:

 main.addChild(herobullet);


П.с. вообще никогда не нужно называть классы с маленькой буквы. Это плохой тон. А в данном, конкретном случае еще и переменная hero называется как класс, это не допустимо.
Классы всегда именуются с большой буквы, переменные и функции с маленькой. Плюс к тому нужно типизировать переменные, а не писать просто var hero;


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

allex 22.11.2012 13:45

За плохой тон спасибо,буду соблюдать.Пуля не в контейнере.И как нужно типизировать переменную?

caseyryan 22.11.2012 13:47

Цитата:

Пуля не в контейнере
В контейнере. Любой объект являющийся наследником DisplayObjectContainer является контейнером. Sprite и MovieClip основные, и наиболее часто используемые контейнеры в ас3.

Цитата:

И как нужно типизировать переменную?
Вот так:
Код AS3:

var hero:Hero;

Но для начала нужно переименовать класс hero в Hero

allex 22.11.2012 13:58

Спасибо,значит - gamelevel.removeChild(hero1),я удаляю сразу и herobullet?

caseyryan 22.11.2012 14:03

если они оба добавлены в gamelevel, то да. Но удалятся они только с экрана. В памяти они так же будут болтаться и процессорные ресурсы так же будут отжирать, если на них где-то останутся ссылки. Если ссылок нет, никакие слушатели не подписаны, то их при необходимости снесет сборщик мусора

allex 22.11.2012 14:11

hero = null; - это поможет? или надо еще отследить все ссылки и их тоже удалять?

caseyryan 22.11.2012 14:17

hero = null;
занулит только ссылку на объект.
Если на него подписаны слушатели, то он не удалится. Если слушателей нет, ни в какие массивы он не добавлен, то это разрешит сборщику мусора его удалить.

allex 22.11.2012 14:42

Все огромное и человеческое спасибо!!!


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

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