AS 3.0中的公共静态函数

时间:2011-12-13 15:54:29

标签: flash actionscript

我正在编写一个小型Flash游戏,并且不想在类之间访问不同的功能。在C#中,我习惯于将其静态化,但我遇到了一些问题。

这里是:

Main.as

package  
{
import Bus;
    import flash.display.Sprite;
import flash.events.Event;
import flash.display.Stage;

public class Main extends Sprite
{
    public function Main() 
    {
        addBus();
    }
}
}

Bus.as

package  
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Stage;

public class Bus extends Sprite
{
    public function Bus() 
    {
    }

    private static function addBus()
    {   
        var bus:Bus = new Bus();

        bus.x = stage.stageWidth / 2;
        bus.y = stage.stageHeight / 2;

        addChild(bus);
    }
}
}

为什么我不能这样做?

3 个答案:

答案 0 :(得分:1)

你有几个问题。 第一:要调用静态方法,必须引用该类。

Bus.addBus();

这允许flash知道你指的是Bus Class的静态方法,而不是Main类中名为“addBus()”的方法。

其次,在Bus.addBus()方法中,您可以引用非静态变量。这可能会导致问题。特别是,您引用stage对象,因为没有静态阶段,它将为null。相反,您需要传入对舞台的引用,或者您可以从函数返回一个新的总线,让调用类以适当的方式将它添加到显示列表中。

我会推荐第二种方法。

顺便说一句,您可能还有进一步的addBus()静态方法计划。但我会指出你可以通过构造函数轻松地完成这个功能,如:

package  
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Stage;

public class Bus extends Sprite
{
    public function Bus(stageReference:Stage) 
    {

        this.x = stageReference.stageWidth / 2;
        this.y = stageReference.stageHeight / 2;

        stageReference.addChild(bus); // This is kind of bad form. Better to let the parent do the adding.
    }
}
}

=============================================== ==

编辑以回应评论

在actionscript中,静态方法是例外,而不是规则。因此,要创建总线,您可以按如下方式更改代码。评论解释了代码。

package  
{
import Bus;
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Stage;

public class Main extends Sprite
{
    public function Main() 
    {
        // Add a new member variable to the Main class. 
        var bus:Bus = new Bus();
        // we can call methods of our Bus object.
        // This imaginary method would tell the bus to drive for 100 pixels.
        bus.drive(100);
        // We would add the bus to the display list here
        this.addChild(bus);
        // Assuming we have access to the stage we position the bus at the center.
        if(stage != null){
                bus.x = stage.stageWidth/2;
                bus.y = stage.stageHeight/2;
        }
    }
}
}

这是您创建类的实例并在不需要任何静态方法的情况下访问它的方法。 “new”关键字实际上是调用类的构造函数方法的快捷方式,它返回类的新实例。调用“new”的父级将该实例作为子级,并且可以调用其所有公共方法和属性。

答案 1 :(得分:0)

Bus类中的静态函数设置为private。如果你把它公开,它应该可以正常工作。

编辑:我不认为这是你正在寻找的答案。你的静态函数对它所在的类的实例一无所知。你不能在静态函数中调用addChild(),因为它不知道将它分配给它。您需要将Main类或stage的实例传递给addBus函数。

例如:

public static function addBus(mainObj) {
    //do your stuff here 
    mainObj.addChild(bus);
}

然后你的主函数会调用addBus(this)

答案 2 :(得分:0)

另外我相信您需要将Bus.addBus()添加到主函数中,但自从我完成AS3编程以来已经有一段时间了