如何在as3中使用另一个类的Main

时间:2015-11-14 10:53:54

标签: actionscript-3 flash oop actionscript flashdevelop

有人可以帮我调用Main构造函数吗?一般来说,我的想法是重置场景。

主要课程:

public class Main extends Sprite
{
    private var sprite:Sprite = new Sprite();

    public function Main()
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point          

        sprite.graphics.lineStyle(1, 0x990000, 1);
        sprite.graphics.drawRoundRect(5, 5, 500, 150, 10, 10);
        addChild(sprite);
    }
}

通过使用按钮我删除了该精灵,我的场景变为空白,但我有另一个类:

public class AnotherClass
{
    public function Action()
    {
        ResetMain();
    }

    private function ResetMain()
    {
        //what to write here for reseting Main(re-calling Main()) ?
    }
}

1 个答案:

答案 0 :(得分:0)

我想,如果你真的想,你可以删除文档类并重新实例化它:

//a function in your Main class that resets itself:
public function resetMain()
{
    var s:Stage = stage; //need a temporary reference to the stage
    parent.removeChild(this); //remove the Main class from the stage
    s.addChild(new Main()); //add a new instance of the Main class
}

这是重置程序的一种奇怪方式,我不推荐它。您放弃使用root关键字来执行此操作。任何未被弱引用或显式删除的事件侦听器也会导致内存泄漏。

最好只编写一个重置所有东西的函数,而不是通过重新实例化文档类(Main class)来重新调用Main构造函数

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    // entry point          

    reset(); 
}

public function reset():void {
    //clear out any vars/display objects if they exist already
    if(sprite) removeChild(sprite);  

    //now create those objects again
    sprite = new Sprite();
    sprite.graphics.lineStyle(1, 0x990000, 1);
    sprite.graphics.drawRoundRect(5, 5, 500, 150, 10, 10);
    addChild(sprite);
}

从您的评论中,您只需要一种方法从AnotherClass引用您的主要课程。

有几种方法可以实现这一目标。

  1. 创建时传递对AnotherClass的引用。您没有展示如何创建AnotherClass,但您可以更改它的构造函数以接受Main实例的引用:

    public class AnotherClass
    {
        private var main:Main;
    
        public function AnotherClass(main_:Main){
            this.main = main_;
        }
    
        //....rest of class code
    

    然后,当您实例化AnotherClass时,传入引用:

    var another:AnotherClass = new AnotherClass(this); //assuming your in the main class with this line of code
    
  2. 使用root关键字。

    root关键字使你获得对documentClass的引用(我假设Main是)。因此,从显示列表中的任何类,您可以执行以下操作:

    Main(root).reset();
    
  3. 对Main实例进行静态引用

    使用类本身(不是类的实例)访问静态方法和变量。所以你可以这样做:

    public class Main extends Sprite
    {
        public static var me:Main; //a static var to hold the instance of the main class
        public function Main()
        {
            me = this; //assign the static var to the instance of Main
            //.... rest of Main class code
    

    然后您可以在应用程序的任何位置执行此操作:

    Main.me.reset();