主类不是 ActionScript 3.0 中调用的第一个类
Posted
技术标签:
【中文标题】主类不是 ActionScript 3.0 中调用的第一个类【英文标题】:Main class was not the first class which was called in ActionScript 3.0 【发布时间】:2017-11-11 10:37:23 【问题描述】:我在想要创建的游戏中有一个奇怪的问题。起初我创建了一个没有外部类的项目。 在根上,我有三个字符和一个级别。还有一个用于关键监听器的脚本,我有 eventListeners 来注册关卡、levelElements、硬币和角色。然后我在库中有一个 CharacterControl MovieClip。此 MovieClip 包含角色行为。例如行走、跳跃、闲置、重力(如果不与地面相撞)。还有不同的事件和事件监听器。 脚本在时间线上。如果我在两个时间线中调用一个跟踪函数,则根是在 CharacterController 之前调用的。
之后,在我的下一个练习中,我创建了一个文档类 Main。现在有所有根脚本。对于 CharacterController,我还复制了时间线代码并将其放入外部类中。
现在我的问题是在调用主类之前调用 CharacterController 类。这会导致 eventListener 和 events 无法按正确顺序调用的问题。发生了一些错误。没有硬币和角色在地面或平台上发生碰撞。一切都在倒下。
我怎样才能实现 Main 被调用?我应该删除字符并通过脚本创建它们吗?
编辑: 好的,我给出一个简短的例子,它展示了我的游戏没有复杂代码的基本问题。
package
import flash.display.MovieClip;
public class Main extends MovieClip
public function Main()
trace("main was called");
package
import flash.display.MovieClip;
public class My_Circle extends MovieClip
public function My_Circle()
// constructor code
trace("circle was called");
下面是我的项目的配置和结构的一些图片:
我需要首先调用 Main。我认为这是as3中的一个基本问题。
【问题讨论】:
【参考方案1】:您将在属性窗格中创建舞台 Main.as 的类文件。
编辑:有趣。刚刚复制了这个。我相信闪光/空气构造元素,所以它们准备好放在舞台上,而不是先构造舞台,然后再构造元素。您应该将要为您的圈子执行的代码放入某种 init 函数中并在其中执行。
package
import flash.display.MovieClip;
public class Main extends MovieClip
public function Main()
super();
trace("Hello");
(circle_mc as Circle).init();
圈子:
package
import flash.display.MovieClip;
public class Circle extends MovieClip
public function Circle()
super();
public function init():void
trace("World");
【讨论】:
当然可以。这就是为什么我不知道为什么在调用 Main 之前调用 Character 类。 我从未经历或见过文档类在其他类之前不被调用的实例。尝试更多调试并验证您的其他类实际上是第一个被调用的。 我认为这是actionscript/flash中的一个基本问题。我在问题中添加了一个基本示例 @Micha93 我想你想看看 ADDED_TO_STAGE 事件。我发现现在是执行配置和接线的更好时机,因为到那时所有对象都已构建完毕。例如,请参阅emanueleferonato.com/2009/12/03/understand-added_to_stage-event 要么或应该工作。添加到舞台会比我的示例稍微快一些。【参考方案2】:好的,我想出了一个简单的解决方案,您可以通过代码实现它。起初我认为通过代码创建对象(圆形、字符等)是一个更好的解决方案。
时间线代码:
import flash.events.Event;
Main.setStageRef(this.stage); //Super-important
stop();
主类代码:
package
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.DisplayObject;
import flash.events.Event;
public class Main extends MovieClip
public static var stageRef : Object = null;
var movieClipExample : My_Circle;
public function Main()
this.addEventListener(Event.ENTER_FRAME,this.afterMainTimeLine);
stage.addEventListener("myEvent", myEventFunction);
public function afterMainTimeLine(e:Event)
trace("Hello");
movieClipExample = new My_Circle;
movieClipExample.init();
stageRef.addChild(movieClipExample);
removeEventListener(Event.ENTER_FRAME, this.afterMainTimeLine);
this.addEventListener(Event.ENTER_FRAME,this.updateFunction);
public function updateFunction(e:Event)
movieClipExample.moveFunction();
public function myEventFunction(_event: Event)
trace("myEvent was triggered");
//Getter/setter for stage
public static function setStageRef(_stage : Object) : void
stageRef = _stage;
public static function getStageRef() : Object
return stageRef;
对象代码(例如 My_Circle):
package
import flash.display.MovieClip;
import flash.display.Stage;
import flash.display.DisplayObject;
public class My_Circle extends MovieClip
public function My_Circle()
stageRef = Main.getStageRef();
trace("World");
this.x = x;
this.y = y;
var evt = new Event("myEvent", true);
stageRef.dispatchEvent(evt);
public function init():void
trace("Created Circle");
this.x = 300;
this.y = 100;
function moveFunction()
this.y += 1;
输出如下:
Hello
World
myEvent was triggered
Created Circle
也许这对其他人有帮助。
只有一件事。对于来自同一类的不同对象,最好使用数组。位置(也许)应该是随机的。
【讨论】:
我还用 event 和 eventListener 解决方案更新了答案以上是关于主类不是 ActionScript 3.0 中调用的第一个类的主要内容,如果未能解决你的问题,请参考以下文章
函数不返回值(错误 1170;ActionScript 3.0)
在 ActionScript 3.0 中,您可以对一个类使用 addEventListener 来响应另一个类的函数调用吗?