Я думал, что обновлю этот пост нашим текущим (и, надеюсь, долгосрочным) решением.
Прежде всего, я допустил ошибку в сообщении выше:
Следующая проблема заключалась в том, что каждый раз, когда мувиклип bonusItem начинал анимацию движения, атрибут / ссылка complexAnimation.bonusItem переназначался новому экземпляру bonusItem.
Это было неверно.Flash действительно назначал новый экземпляр BonusItem, но он был вызван ключевым кадром слоя Mask, а не анимацией движения.
Я стремился избежать какой-либо логики, основанной на сравнении строк, но вВ конце концов я проглотил свою гордость, чтобы облегчить жизнь.
Наш дизайнер предоставляет имена всех соответствующих объектов (вещи, которые нам понадобятся для доступа из AS3) на каждом ключевом кадре на временной шкале.Если объект вложен в другие объекты, наш конструктор также должен назначить имена экземпляров этих родительских объектов.Мы должны согласовать эти имена экземпляров, чтобы dev знал, как называются методы доступа - нам бы все равно пришлось это делать.Наш конструктор также все еще должен «Export For Actionscript» класс для каждого соответствующего фрагмента ролика (например, BonusItem).
В AS3 мы используем Robotlegs для внедрения зависимости и в качестве основы нашегоMVC Framework.Роботлегс предлагает отделить логику для конкретного приложения от логики для конкретного представления.Это позволяет нам указать логический класс (называемый посредником), который будет связан с каждым из наших представлений.Таким образом, мы можем сделать следующее отображение:
BonusItem -> BonusItemMediator
Это означает, что каждый раз, когда Flash создает BonusItem на временной шкале, Robotlegs каким-то образом узнает об этом и создает новый экземпляр BonusItemMediator (который мы пишем сами и имеем полноеконтроль над).Кроме того, Robotlegs может легко дать нам ссылку из нашего BonusItemMediator на связанный экземпляр представления (экземпляр BonusItem).Так что внутри моего BonusItemMediator я могу спросить ссылку на представление, каково его имя экземпляра.Я также подхожу к его родителям на сцену и записываю каждое из их имен, чтобы сгенерировать результирующую строку имен экземпляров, которые однозначно определяют этот экземпляр BonusItem.например,
"game.complexAnimation.bonusItem"
Как только я это узнаю, я могу убедиться, что bonusItem показывает правильное изображение (звезда или гриб) со следующим кодом:
var frameLabelName:String myGameModel.whatTheHellShouldThisBeShowing("game.complexAnimation.bonusItem");
this.view.gotoAndStop(frameLabelName); // where view is the BonusItem instance
Так что теперь независимо от того, как иликогда Flash, по-видимому, случайным образом решает уничтожить и воссоздать мой bonusItem, я услышу об этом и смогу убедиться, что новый экземпляр BonusItem отображается в правильном кадре.
Основным недостатком этого решения является то, что мы полагаемсяна сравнения строк.Наш дизайнер мог легко набрать имя экземпляра, и мы не услышали бы об этом, пока этот код не был запущен во время выполнения.Конечно, тесты снижают этот риск, но я все еще чувствую, что мне жаль, что я использую строго типизированный язык, но потом не использую проверку типов во время компиляции.