Я создаю видеоплеер, используя Flash CS4 (в дальнейшем называемый «Flash») для создания графических символов, а также компилирую и отлаживаю с помощью Flash Builder 4 («FB4»). Вот шаги, которые я предпринимаю в своем текущем рабочем процессе:
- Создание графических символов во Flash. Я создал несколько разных символов для игрока, но здесь я сосредоточусь только на кнопке воспроизведения / паузы («ppbutton»).
- На панели «Библиотека» я перехожу к свойствам Linkage символа ppbutton и связываюсь с классом с именем assets.PlayPauseButtonAsset, расширяющим MovieClip. На самом деле у меня нет пакета ресурсов и файла класса для PlayPauseButtonAsset, так как Flash создаст их для меня при публикации.
- В настройках публикации Flash я настроил проект на экспорт SWC-файла, который будет использоваться в FB4, с именем VideoPlayerAssets.swc.
- После создания SWC я создаю свой проект FB4 под названием «VideoPlayer» и добавляю SWC в мой путь. FB4 автоматически создает класс VideoPlayer в пакете по умолчанию.
- В VideoPlayer.as я импортирую assets. *, Который импортирует все классы символов, созданные в Flash и доступные через VideoPlayerAssets.swc. Теперь я могу создать экземпляр кнопки pp и добавить на сцену, например:
var ppbutton:PlayPauseButtonAsset = new PlayPauseButtonAsset();
addChild(ppbutton);
На данный момент ppbutton не имеет никакой функциональности, потому что я не создал никакого кода для него. Поэтому я создаю новый класс с именем video.controls.PlayPauseButtonLogic, который расширяет assets.PlayPauseButtonAsset. Я добавил немного логики, и теперь я могу использовать этот новый класс, чтобы поставить рабочую кнопку на сцене:
var ppbutton:PlayPauseButtonLogic = new PlayPauseButtonLogic();
addChild(ppbutton);
Это отлично работает, но вы можете спросить, почему я не просто связал символ ppbutton во Flash с классом video.controls.PlayPauseButtonLogic. Причина в том, что у меня есть дизайнер, создающий пользовательский интерфейс во Flash, и я не хочу переиздавать SWC из Flash каждый раз, когда я изменяю логику. По сути, я хочу, чтобы мой дизайнер мог создавать символ во Flash, связывать этот символ с логически названным классом в свойствах Linkage и экспортировать SWC. Я не хочу снова прикасаться к этому файлу .fla, если дизайнер не внес изменения в символы или макет. Я также использую систему управления версиями для проекта, и она чище, чтобы убедиться, что только дизайнер касается файла .fla.
Итак, наконец, вот проблема, с которой я сталкиваюсь:
- По мере усложнения дизайна дизайнер вкладывает символы для размещения элементов управления видео на панели управления. Он создает символ панели управления и связывает его с активами. ControlBarAsset. Символ панели управления содержит символ кнопки pp.
- Дизайнер публикует SWC, и ControlBarAsset теперь доступен в FB4. Я создаю новый класс с именем video.controls.ControlBarLogic, который расширяет assets.ControlBarAsset, поэтому я могу добавить немного логики в панель управления и добавить панель управления на сцену:
var controlbar:ControlBarLogic = new ControlBarLogic();
addChild(controlbar);
- Это работает, но кнопка pp ничего не делает. Это потому, что ppbutton, находясь внутри панели управления, все еще связан только с PlayPauseButtonAsset, который не имеет никакой логики. Я больше не создаю экземпляр объекта ppbutton, потому что он является частью панели управления.
Вот где я застрял сегодня. Я не могу просто переустановить ppbutton панели управления как PlayPauseButtonLogic, когда получаю ошибку типа. И я не хочу создавать класс, который должен создавать экземпляры каждого элемента управления видеопроигрывателя, размещать их со своими значениями x и y на сцене в соответствии с тем, как их разместил дизайнер, так как это потребовало бы от меня открытия .fla и проверьте различные свойства символа, затем добавьте эти значения в код. Если бы дизайнер внес изменения, мне пришлось бы каждый раз заходить в код, чтобы каждый раз обновлять эти свойства. Не хорошо.
Как мне переопределить вложенные символы, чтобы использовать созданные мной логические классы, расширяющие классы активов? Помните, что решение состоит не в том, чтобы связать символы Flash с реальными классами, поэтому мне не нужно продолжать перекомпилировать SWC, если нет способа сделать это без перекомпиляции SWC. Я хочу, чтобы дизайнер сделал свое дело, опубликовал SWC и покончил с этим. Затем я могу взять его SWC, применить свою логику к его активам и иметь возможность отладки и компиляции окончательного SWF.