2012-06-06 2 views
0

Приносим извинения за то, что этот вопрос запутан.AS3 Несколько имен экземпляров в одном MC

У меня есть клип, который является автомобилем. В автомобильном клипе есть четыре разных угла к машине. (например, слева, справа, спереди назад). Я динамически меняю цвет кузова автомобиля. В каждом углу автомобиля тело кузова имеет экземпляр «тело». Изменить цвет с кодом:

var tempcar = "car_mc" + i; 
var myNewTransform = new ColorTransform(); 
myNewTransform.color = 0x000000 //in real life this is a random value 
this[tempcar].body.transform.colorTransform = myNewTransform; 

Все отлично работает, пока я не скажу клип автомобиль фильм на gotoAndPlay кадр «фронт», где мы видим переднюю сторону автомобиля, и я стараюсь применять цвет снова меняется на корпус передней части автомобиля. Я получаю сообщение об ошибке:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 

Есть ли лучший способ сделать то, что я пытаюсь сделать?

+0

Поскольку большая часть вашего приложения находится на временной шкале, почему бы не сделать преобразование цвета на шкале времени? Смешивание анимаций временной шкалы с анимацией ActionScript всегда приводит к множеству проблем. –

+0

Есть ли у вас какие-либо скрипты в «переднем» мувиклипе? –

+0

В видеоклипах «Автомобиль» нет сценариев. – victorkhugo

ответ

0

Это старый ActionScript 2 способ обработки вещей. В ActionScript контейнер не всегда является клипом MovieClip, который за исключением хеша для доступа к динамическому полю. Кроме того, если вы добавили его в список отображения через addChild, результат был бы другим, так как в ActionScript 3 это не так, что могло бы автоматически адресовать ребенка.

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

// clazz would be the symbol 
function createInstance(container:DisplayObjectContainer, clazz:Class, list:Array):Sprite 
{ 
    const child:MovieClip = new clazz() as MovieClip; 
    if (!child) throw new ArgumentError("Wrong type given"); 

    return list[list.length] = container.addChild(child); 
} 

function getInstanceAt(index:int, list:Array):Sprite 
{ 
    return list[index] as Sprite; 
} 
Смежные вопросы