【发布时间】:2011-08-02 21:26:49
【问题描述】:
将this thread 提升到一个新的水平,现在制作一个 Main.as 类来显示我的游戏的不同“屏幕”。目前我只有一个名为 ControlPanel 的屏幕,但这最终将有多个级别(每个级别将是一个单独的屏幕)和一个级别选择屏幕等。所以在这一点上,我正在失去对如何让事物进入舞台的控制权(换句话说......它变得非常厚,有多个层次,这个菜鸟的大脑正在超载哈哈)。
首先,我使用了舞台上默认的所有图形(按钮、灯光、仪表、乐谱文本等)并创建了一个名为 ControlPanel 的新元件 (MovieClip) 并勾选了“导出”对于 ActionScript”,类名为 ControlPanel。所以现在我的游戏 fla 阶段是黑色的,我将它的文档类设为 Main.as。看起来像这样:
public class Main extends MovieClip {
public var controlPanel:ControlPanel;
public function Main() {
addEventListener(Event.ADDED_TO_STAGE, added);
}
private function added(evt:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, added);
controlPanel = new ControlPanel(this);
addChild(controlPanel);
}
}
运行它非常有效,因为我的控制面板屏幕直接弹出到屏幕上。当然,所有按钮都还没有工作,但这是下一步。所以我将旧的 Game.as 修改为现在称为 ControlPanel 并如下所示:
public class ControlPanel extends MovieClip {
private var docRef:Main;
private var _player:Player;
private var _controller:Controller;
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);
_player = new Player(docRef);
_controller = new Controller(_player, docRef);
addChild(_player);
}
现在这是添加我的 Player 类和我的 Controller 类。它们基本上具有相似的构成,所以我将在这里展示 Player.as 类:
public class Player extends MovieClip {
private var docRef:Main;
private var _lights:uint;
public function Player($docRef:Main):void {
this.docRef = $docRef;
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function lightsOut():void {
switch(_lights) {
case 1:
docRef.controlPanel.greenLight1.visible=false;
break;
case 2:
docRef.controlPanel.greenLight2.visible=false;//works
break;
case 3:
docRef.controlPanel.greenLight3.visible=false;//works
break;
}
}
问题是,现在我尝试测试它,我不再看到以前看到的控制面板图形,但我现在收到错误消息:
TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在控制面板() 在主/添加()
我还注释掉了 Main 中的 controlPanel 行,只是做了一个 trace(this);它返回了
[对象主]
不应该是object Stage之类的吗?以前没试过,所以不知道以前是什么。我这里哪里出错了?
更新:好的,所以我的 Controller 不仅像 Player 类,而且可能需要舞台和视图的实例?好吧,这是我为控制器和一些所需的事件侦听器准备的:
public class Controller extends MovieClip {
private var _model:Object;
private var _dHandle:Object;
private var panelView:ControlPanelView; //started playing with this idea but maybe that is the wrong way to go?? Stick with docRef here? or both?
public function Controller(model:Object, dHandle:Object, $view:ControlPanelView):void {
this._model = model;
this._dHandle = dHandle;
this.panelView = $view;
docRef.stage.addEventListener(KeyboardEvent.KEY_DOWN, processKeyDown);
docRef.stage.addEventListener(MouseEvent.MOUSE_DOWN, processMouseDown);
docRef.ControlPanelView.fireButton.addEventListener(MouseEvent.CLICK, processFirePress);
docRef.ControlPanelView.cWButton.addEventListener(MouseEvent.CLICK, processCWPress);
docRef.ControlPanelView.cCWButton.addEventListener(MouseEvent.CLICK, processCCWPress);
如您所见,这是一个在 docRef 和 View 理念之间撕裂的大杂烩。我需要为我的鼠标和键盘监听器访问舞台,但我还需要访问 ControlPanelView 符号中的按钮。我需要在这里传递视图和 docRef 吗?如何保持对舞台和 ControlPanelView 图形的访问权限?
【问题讨论】:
-
跟踪是正确的,它说你有一个 Main 类型的对象,它是你的类。您现在真的需要 Player 接收对您的文档类的引用,还是只需要对 ControlPanel 的引用?在这种情况下两者都应该工作,但后者更容易阅读。
-
等一下,我有这个权利吗,你有一个库项目设置为'export for actionscript',你称之为
ControlPanel,你还有一个.as文件,其中包含一个类名为ControlPanel? -
检查库中的符号链接。还要检查您的包名称是否与库中的内容匹配。
-
是的,我将所有图形放入名为 ControlPanel 的符号中,当我单击 Export for ActionScript 时,它只是使用了 ControlPanel 的默认名称,所以我离开了它。然后我需要控制它,所以我认为它已经被创建了,为什么不把一些真实的代码放进去。所以我将 Game.as 更改为现在的 ControlPanel.as。是的,我还创建了保存新 ControlPanel 的变量,称为小写 controlPanel。也许只是太多了,我需要更改为 cPanel 之类的东西?或者我不能让我的符号和控制类具有相同的名称吗?
标签: flash actionscript-3 flash-cs5