var mC:mc = новый mc сразу добавляет mc?

Я тут сбитый с толку нуб. У меня есть следующий код:

var mC:mc = new mc();

Я НЕ вообще не создаю экземпляр mC с помощью addChild(mC);

Но позже в коде у меня есть цикл, использующий onEnterFrame, и в этом цикле у меня есть следующая функция трассировки:

if(mC){
    trace("mC is here");
}

Это возвращает «mC здесь» в окне вывода. А???

Проблема в том, что я хочу использовать этот оператор if для removeChild(mC); [Я добавлю его в код позже с помощью addChild(mC); на основе определенных вещей, которые происходят], но он продолжает выдавать чертовски сообщения «ERROR child of the caller» даже с условием «if» …

ЧТО я делаю неправильно? Я не знал, что объявление переменных добавит их в список рабочей области/отображения, я думал, что вам нужен addChild(); утверждение. Я курю то, что не должен курить?

Заранее спасибо, ~Frustrated Inc.


person coderJoker    schedule 11.12.2015    source источник
comment
Делаем var mC:mc = new mc(); называется созданием экземпляра, это процесс создания объекта. То, что вы называете созданием экземпляра addChild, не имеет ничего общего с этим процессом.   -  person BotMaster    schedule 12.12.2015


Ответы (3)


Когда вы создаете новый объект, он существует в памяти, даже если вы не добавили его на сцену. Вот почему, когда вы проверяете, существует ли mC, он возвращает true. Вы хотите проверить, существует ли он на сцене. Что-то типа:

var mc:MovieClip = new MovieClip();
mc.name = "test";
if (this.getChildByName("test") != null) {
  trace("mc is on stage");
}

Я давно не пользуюсь Flash, поэтому не тестировал этот код. Надеюсь, это сработает.

person Fraser Crosbie    schedule 11.12.2015
comment
Спасибо, Фрейзер. Хорошо, я понимаю, что '!= null' означает 'не равно null', но должен ли я использовать один и тот же подход каждый раз, когда я хочу построить оператор 'if' относительно mC? Итак, если я хочу переместить его на сцену, удалить его со сцены и т. д. Мне нужно использовать «if(this.getChildByName() != null» каждый раз? Кажется, что другие мувиклипы, которые я добавляю, не нужны этот код, но этот делает... ~ Confused - person coderJoker; 12.12.2015
comment
@coderJoker Обычно вы добавляете мувиклип на сцену сразу после его создания. В большинстве ситуаций вы можете предположить, что мувиклип будет находиться на сцене. Только в ситуациях, когда вам нужно удалить мувиклип со сцены по той или иной причине, вы захотите проверить его. Когда вы сталкиваетесь с ошибками времени выполнения, вы должны добавить оператор if, чтобы предотвратить повторение ошибки. - person Fraser Crosbie; 12.12.2015
comment
Теперь выдает ошибку № 1006: getChildByName не является функцией... Я просто не понимаю, что делаю неправильно. Должно быть что-то еще, что бросает гаечный ключ в работу... - person coderJoker; 12.12.2015
comment
Возможно, вы найдете ответ здесь: stackoverflow.com/questions/7280203/ - person Fraser Crosbie; 12.12.2015
comment
Спасибо, Фрейзер. Мне явно нужно больше узнать о показе, сцене и адресах. Я удалил «это» из вашего примера, и теперь он работает. Я не знаю почему, и мне нужно понять почему, прежде чем я смогу прогрессировать как кодер. Знать, какой вопрос задавать, так же важно, как и получать ответы на вопросы. Спасибо за вашу помощь! СиДжей - person coderJoker; 12.12.2015
comment
Последнее утверждение является чистым мнением, а не фактом. Это также совершенно неправильно и нелогично и свидетельствует лишь о полном отсутствии серьезных и реальных знаний. Под iPhone, я думаю, он имел в виду Ios, Ios и Flash, которые не имеют ничего общего друг с другом, поскольку они не делают одно и то же. iOS не оказывает негативного влияния на другие технологии, и на самом деле масса других технологий процветает. Почему Flash так или иначе повлиял на Ios, остается загадкой только в уме автора последнего комментария. - person BotMaster; 12.12.2015

Сложные объекты в AS3 (то есть все, что не является строкой или числом) по умолчанию имеют значение null. Когда оценивается, что значение по умолчанию null равно false:

var mymc:MovieClip;//that MC is NOT instantiated yet so it has a default value of null
if(mymc)
{
    //mymc is null so this evaluates to false
    //and this statement DOES NOT execute

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

var mymc:MovieClip = new MovieClip();//that MC IS instantiated 
if(mymc)
{
    //mymc exits so this evaluates to true and this statement EXECUTE
    //notice that "!= null" is not necessary

Теперь ваша проблема связана со списком отображения. DisplayObject имеет родительское свойство, которое имеет значение null, если этот объект не добавлен в список отображения, и это свойство указывает на родителя, когда этот объект добавляется в список отображения:

var mc:MovieClip = new MovieClip()
trace(mc.parent);//this is null
addChild(mc);
trace(mc.parent);//this is not null anymore and points to the parent

Итак, что вы хотите сделать, это:

if(mC.parent){//this means mC has a parent and can be removed from it
    trace("mC is here");        
}
person BotMaster    schedule 12.12.2015
comment
+1, я думал поставить ответ о mc.parent с тем же примером, вы меня опередили;) Я думаю, что лучший и самый простой способ - проверить родителя объекта. - person akmozo; 12.12.2015

В вашем коде вы просто контролируете, является ли ваша переменная нулевой или нет.

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

Если вы добавляете mC в контейнер с именем спрайта, вы можете просто проверить, существует ли он в этом контейнере, с помощью:

if (!container.contains(mC))
     container.addChild(mC);

Редактировать. Более безопасный способ контролировать, находится ли мувиклип на сцене, — это контролировать его значение сцены.

if (mC.stage) {
     mC.parent.removeChild(mC); // this is how you remove, if you simply want to check existence, don't remove it
}

Он должен иметь значение stage, если вы добавили мувиклип на сцену или контейнер, который добавляется на сцену.

Надеюсь, так понятнее.

person berkayk    schedule 12.12.2015
comment
Беркайк спасибо! Я изучу эту технику дальше, она выглядит очень полезной. - person coderJoker; 12.12.2015
comment
Проголосовал против. Это ошибочный ответ. Метод contains не предназначен для этой цели и не дает правильного результата. Методы contains — это проверка того, находится ли DisplayObject ГДЕ-НИБУДЬ во всем списке отображения вызывающего объекта. Это означает, что он вернет true, даже если отмеченный DisplayObject находится на 1, 3 или 30 уровне ниже списка отображения. Таким образом, использование этого и использование removeChild просто неправильно, поскольку этот removeChild все еще может вызывать ошибку, поскольку содержимое не гарантирует, что DisplayObject является дочерним элементом вызывающей стороны. - person BotMaster; 12.12.2015
comment
Мой ответ не сильно отличается от вашего @BotMaster Да, безопаснее проверить родителя перед поиском содержимого, если вы не знаете, куда поместить свой мувиклип. В вашем случае вы можете добавить mC в другой контейнер, и вы можете не видеть его на этапе, потому что добавленный вами контейнер не добавляется на этап, но mc.parent возвращает не null. Это предпочтение разработчика, так как я знаю, куда поместить этот мувиклип, который я предпочитаю использовать. Ваш ответ также может вести себя ненормально, если вы не добавили родителя на сцену. - person berkayk; 12.12.2015
comment
Мой ответ будет работать, даже если родитель не находится в списке отображения, поскольку все, что он делает, это проверяет родителя, а затем удаляет его из этого родителя. Если все это на сцене или нет, это не помешает ему работать. Метод contains не только не предназначен для проверки того, находится ли дочерний элемент в списке прямого отображения родительского элемента, но и по определению медленный, поскольку он должен пройти через весь список отображения всех потомков. Давайте сравним производительность сложной сцены в цикле Nk (начнем с 5000), чтобы увидеть, какая система будет быстрее. Использование contains будет далеко позади + ничего не гарантирует. - person BotMaster; 12.12.2015
comment
Но, честно говоря, я разместил этот комментарий в основном в интересах @codejoker. Допустим, он использует ваш метод в сложной сцене с большим количеством фильмов и слоев, метод contains (поскольку он такой медленный) может начать все замедлять и вызывать задержки, и ему будет трудно понять, откуда это берется. Так что теперь, по крайней мере, он знает, что метод contains не гарантирует, что объект является прямым дочерним элементом родителя, и очень медленный, поэтому он может сделать свой собственный выбор. - person BotMaster; 12.12.2015
comment
Хорошо, ты выиграл :) @BotMaster - person berkayk; 13.12.2015
comment
этап проверки лучше, убран голос вниз. Проверка родителя по-прежнему была бы более актуальной. - person BotMaster; 14.12.2015