主类不是ActionScript 3.0中调用的第一个类

时间:2017-06-09 12:01:18

标签: actionscript-3 flash animate-cc

我想在游戏中创建一个奇怪的问题。起初我创建了一个没有外部类的项目。 在根上我有三个角色和一个等级。还有一个关键监听器的脚本,我有eventListeners来注册级别,levelElements,硬币和字符。然后我在库中有一个CharacterControl MovieClip。此MovieClip包含角色行为。例如步行,跳跃,空转,重力如果不碰撞到地面。还有不同的事件和eventListeners。 脚本在时间轴上。如果我在两个时间轴中调用一个跟踪函数,则在CharacterController之前调用root。

在我的下一个练习之后,我创建了一个文档类Main。现在有所有根脚本。对于CharacterController,我还复制了时间轴代码并将其放入外部类中。

现在我的问题是在调用主类之前调用​​CharacterController类。这导致无法按正确顺序调用eventListener和事件的问题。发生了一些错误。没有硬币和没有角色在地面或平台上碰撞。一切都在崩溃。

我怎样才能实现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");
        }
    }

}

以下是我项目配置和结构的一些图片:

sample image

sample image

sample image

sample image

我需要Main作为第一个叫。我认为这是as3中的一个基本问题。

2 个答案:

答案 0 :(得分:1)

您可以在属性窗格中创建舞台Main.as的类文件。

enter image description here

修改:有趣。刚刚复制了这个。我相信那时flash / air构造了元素,所以他们已经准备好被放在舞台上,而不是先构建舞台,然后再构建元素。你应该将你想要为你的圈子执行的代码放在某种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");
        }

    }
}

答案 1 :(得分:0)

好吧,我想出了一个简单的解决方案,你可以通过代码来实现它。起初我认为通过代码创建对象(圆形,字符,等等)是更好的解决方案。

时间轴代码:

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

这可能对其他人有帮助。

只有一件事。对于来自同一类的不同对象,最好使用数组。位置(可能)应该是随机的。