Нельзя экспортировать что-либо из библиотеки и файл класса с тем же именем.Когда вы устанавливаете для элемента библиотеки значение «Экспорт для ActionScript», Flash создает класс с таким именем для представления этого объекта, и поэтому последующее создание класса с таким же именем приведет к конфликту.
У вас естьЕсть два варианта действий:
Наследование
Вы можете использовать класс, созданный для вашей ControlPanel, в качестве базы кода для символа в вашей библиотеке.Для этого сначала дайте ему другое имя, скажем ControlPanelBase
.Затем вы можете назначить его базовым классом вашего символа.Это можно сделать в среде IDE, перейдя в свойства своего символа и изменив базовый класс с flash.display.MovieClip
на ControlPanelBase
(или любое другое имя, которое вы выберете).Нажмите на маленькую зеленую галочку, чтобы убедиться, что класс найден, затем нажмите OK.
Теперь, когда вы создаете новую ControlPanel с использованием нотации new ControlPanel(this)
, она создаст объект, который использует графику, но такжекод из базового класса.Поскольку вы наследуете, вам нужно будет изменить все вхождения слова private
на protected
, чтобы их могли видеть любые классы-потомки.
Разделите представление
Это мое предпочтение, потому что, когда вы прекращаете использовать IDE для чего-то большего, чем просто для генерации пакетов ресурсов, вам не нужно перекомпилировать свои активы при каждом изменении кода.
Измените имя символа вашей библиотеки на что-то большееописательный, как ControlPanelView
.Теперь, когда вы создаете свою ControlPanel, используя new ControlPanel(this)
, она не будет прикреплять графику, поэтому вам нужно будет сделать это самостоятельно:
public class ControlPanel extends MovieClip {
private var docRef:Main;
private var _player:Player;
private var _controller:Controller;
public var view:ControlPanelView; //note that this is public
public function ControlPanel($docRef:Main):void {
this.docRef = $docRef;
addEventListener(Event.ADDED_TO_STAGE, added);
}
private function added(evt:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, added);
view = addChild(new ControlPanelView()) as ControlPanelView; //add the graphics
_player = new Player(docRef);
_controller = new Controller(_player, docRef);
addChild(_player);
}
}
Теперь, чтобы получить доступ к этим источникам света из Player, вы бы сказали
docRef.controlPanel.view.greenLight1.visible=false;
Вы можете видеть, что это становится немного глотком, но чтобы сократить его, вы можете передать ссылку на ControlPanel вместо Main, когда вы создаете проигрыватель, или действительно вы можете передать ссылку напосмотреть, если это все, что вам когда-либо нужно поговорить.
в ControlPanel:
_player = new Player(view);
новый Класс игрока:
public class Player extends MovieClip {
private var panelView:ControlPanelView;
private var _lights:uint;
public function Player($view:ControlPanelView):void {
this.panelView = $view;
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function lightsOut():void {
switch(_lights) {
case 1:
panelView.greenLight1.visible=false;
break;
case 2:
panelView.greenLight2.visible=false;//works
break;
case 3:
panelView.greenLight3.visible=false;//works
break;
}
}
}
Относительно вашего обновленияпомните, что ваш основной класс и сцена не одно и то же.Каждый экранный объект имеет свойство stage
, которое будет указывать на одно и то же.Это означает, что для добавления слушателей на сцену нет никакой разницы между Main.stage
, view.stage
и this.stage
(при условии, что контроллер находится на сцене).Таким образом, ваш контроллер может выглядеть следующим образом:
public class Controller extends EventDispatcher {
private var _model:Player;
private var panelView:ControlPanelView;
public function Controller($model:Player, $view:ControlPanelView):void {
this._model = $model;
this.panelView = $view;
panelView.stage.addEventListener(KeyboardEvent.KEY_DOWN, processKeyDown);
panelView.stage.addEventListener(MouseEvent.MOUSE_DOWN, processMouseDown);
panelView.fireButton.addEventListener(MouseEvent.CLICK, processFirePress);
panelView.cWButton.addEventListener(MouseEvent.CLICK, processCWPress);
panelView.cCWButton.addEventListener(MouseEvent.CLICK, processCCWPress);
}
}
, а в ControlPanel вы можете создать его следующим образом:
_controller = new Controller(_player, view);
Обратите внимание, что я также заставил ваш контроллер расширяться EventDispatcher , а не MovieClip.Хорошей практикой является расширение от необходимого минимального класса, который вам нужен, поэтому, если этого никогда не будет на сцене, но он будет генерировать события, EventDispatcher является минимальным.Если ему никогда не понадобится отправлять события, только добавлять слушателей к другим, тогда ему не нужно ничего расширять.
По сути, расширяйте MovieClip только в том случае, если вам нужна функциональность временной шкалы или ваш класс будет базовым классом для чего-либов библиотеке.Для любого другого стандартного экранного объекта вы должны расширить либо Sprite или Shape , первый, если вы собираетесь добавить потомков, второй, если вы только собираетесь рисовать векторную графику.Если ваш объект никогда не попадает в дерево отображения, чаще всего вам потребуется расширить либо EventDispatcher, либо вообще ничего.