AS3在构造函数的参数中传递Class但是为Null(?)

时间:2014-02-15 16:20:54

标签: actionscript-3 class constructor

我正在尝试使用主文档的代码向舞台添加两个对象。在第二个添加的对象中,我试图将第一个对象的类作为参数添加到第二个对象。这样,第二个对象(介绍)可以在移动到游戏核心(第一个对象)之前首先执行其功能。但是,发送到参数的对象似乎为null或者没有直接连接到第一个对象的类(因为我无法使用第二个对象修改任何第一个对象的变量或更改其可见性等)。

Main Document's code :

//first object :            
            var gameScreen = getDefinitionByName("Game") as Class;
            gameScreen.x = 0;
            gameScreen.y = 0;
            addChild(new gameScreen() as DisplayObject);

//second object :
            var introScreen = getDefinitionByName("Intro") as Class;
            introScreen.x = 0;
            introScreen.y = 0;
            addChild(new menuScreen(gameScreen) as DisplayObject);
            gameScreen.visible = false;
    //the goal is to make gameScreen not visible, but it is still visible

第一个对象的类中没有影响此过程的真实代码。

Intro's code (second object) :

private var game:Class;
public function Intro(screen:Class) 
{
    game = screen;
    game.visible = false; // game = first object
    //game is still visible after this code is run
}

有关如何解决此问题的任何线索?或者没有解决方案。解决方法是将介绍(secondobject)集成为游戏的一部分(第一个对象)。感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

我不明白你为什么以你的方式接近这些课程,但你可以直接解决这些问题。您也不必将x, y值归零,因为(作为DisplayObject)它们默认为零。

var gameScreen:Game = new Game();
addChild(gameScreen);

var introScreen:Intro = new Intro();
addChild(introScreen);

// When you're ready to hide it, simply remove from the DisplayList
removeChild(gameScreen);

在此示例中隐藏(或添加/删除)gameScreen也令人困惑。作为一个代码块,它将一次创建并隐藏它,这就是一个问题:为什么要在第一时间添加它?

你的介绍课程:

package {
    public class Intro extends Game {
        public function Intro() {

        }
    }
}

所有人都说,我还不清楚你所有这一切的实际目标是什么。我可以说,你在尝试的地方:

addChild(new menuScreen(gameScreen) as DisplayObject);
永远不会导入

menuScreenIntro的当前代码确实接受Class作为其构造函数参数,但是您没有将任何内容传递给intro类,也没有实例化它。


附录

如果直接调用类中的代码(例如,Math.floor()是Math类中的函数,但您不必首先实例化它以使用它),或者实例化类(在这种情况下,运行它的构造函数)。这不需要将它添加到DisplayList(即Stage)以运行代码;在屏幕上显示它是一个事后的想法。

假设我们有一个名为“Foo”的类:

package {
    public class Foo extends Sprite {
        import flash.events.Event;

        public function Foo() {
                trace("Constructor called.");
                addEventListener(Event.ADDED_TO_STAGE, saySomething);
        }

        public static function bar():void {
                trace("You can call me anytime.");
        }

        private function saySomething(e:Event):void {
                trace("You can only call me from within the class.");
        }
    }
}

我们可以先在类上调用bar(),而无需实例化它。然后我们也可以实例化它的副本,并且将调用构造函数。但是这两种操作都不需要将它养育到舞台上。

import Foo;

Foo.bar() // traces: "You can call me anytime."
var myThing:Foo = new Foo(); // traces: "Constructor called."
addChild(myThing); // traces: "You can only call me from within the class."

要回答您的问题,import如上所示执行,其目的是“为您的代码提供外部定义的类和包”。除了您的其他课程,您还没有分享menuScreen的样子。这让我回到原来的问题:你到底想要做什么?

那就是说,我希望这有助于澄清代码的工作原理。