Как сделать массив, содержащий мувиклип, для автоматического обновления, когда moviclip обнуляется? - PullRequest
0 голосов
/ 30 марта 2012

Я пробую следующий код, чтобы всякий раз, когда я делаю мувиклип нулевым, массив, содержащий его ссылку, тоже становится нулевым.

Я понимаю, что следующий код не может этого сделать, но я хочу как-то, массив может предоставить информацию, если мувиклип имеет значение nullЕсть ли хороший способ сделать это?Есть предложения?

import flash.display.MovieClip;
import flash.events.Event;

var a_arr:Array = new Array(a_Mc,b_Mc); 

trace(a_arr); 

a_Mc= null ;
trace(a_arr);

//output is:
//[object MovieClip],[object MovieClip]

//  ==>>>> but i want something like null,[object MovieClip ]

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

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

var a_arr:Array = [a_Mc, b_Mc];  // use [] instead of new Array()

a_arr[0] = null;

trace(a_arr);

Это изменяет значение указателя массива на ноль.

Вы также можете использовать пользовательские свойства для объектов MovieClip, поскольку они являются динамическими классами (в отличие от спрайтов)

 var a_arr:Array = [a_Mc, b_Mc];
 a_Mc.alive = true;
 b_Mc.alive = true;

 // change the custom property
 a_Mc.alive = false;

 // later detect this and solve
 if (a_arr[0].alive){
     trace("ALIVE!");
 }
2 голосов
/ 30 марта 2012

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

С точки зрения общего программирования существенная проблема заключается в том, что множественные ссылки, указывающие на один и тот же объект, не знают друг о друге. Назначение одной из ссылок на null просто перенаправляет указание этой одной переменной, оно не уведомляет другие ссылки об изменении и, как правило, не изменяет состояние самого объекта, таким образом, другие ссылки все еще остаются указывающими на объект. Вы хотите, чтобы присвоение null означало «освободить этот объект и аннулировать все ссылки на него» семантически, но это не происходит из-за механизма сборки мусора.

Правильный способ справиться с этой ситуацией - правильно использовать ссылки - если вы хотите, чтобы объект исчез, установите для всех ссылок на него значение null. Однако, в зависимости от того, что вы хотели бы сделать в вашем случае (я чувствую, что вы пытаетесь сделать что-то немного неортодоксальное), это может оказаться невозможным. Возможно, вы сможете использовать массив в качестве основного списка и единственного места, где существуют указатели на объект, и всегда ссылаться на объект путем индексации в массиве в другом месте.

Если вам нужно сделать то, что вы сказали, самое простое решение, о котором я могу подумать, - позволить самому объекту иметь флаг (был ли он помечен для выпуска или нет), чтобы служить способом связи между всеми ссылками. , Установите флаг в true всякий раз, когда вы устанавливаете ссылку на ноль. Проверьте флаг перед разыменованием любой ссылки. Я не знаю, есть ли встроенное свойство в MovieClip, которое служит аналогичной цели, но AS3 является динамическим, и вы всегда можете добавить свойства самостоятельно. На других языках вы можете создать обертку вокруг него, чтобы нести флаг. Однако имейте в виду: это изгибает одну из фундаментальных концепций программирования (ссылки указывают на то, что объект не общается друг с другом), и если вы не будете осторожны, вы можете получить сюрпризы тут и там.

0 голосов
/ 30 марта 2012

Вы должны получить индекс элемента в коллекции и установить его на ноль или использовать сплайс, если вы просто хотите удалить его из коллекции, вот два варианта, которые я могу придумать:

        a_arr.splice(a_arr.indexOf(a_Mc),1);
        //or
        a_arr[a_arr.indexOf(a_Mc)] = null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...