主类不是 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 来响应另一个类的函数调用吗?

如何在 actionscript 3.0 中使用掩码?

设置可见性槽属性不起作用 actionscript 3.0

(ActionScript 3.0)我的函数没有通过按钮事件更新全局变量

ActionScript 3.0 套接字无法重新连接