AS3 - 访问子类的子类

时间:2013-09-18 23:25:04

标签: actionscript-3 subclass

我正在制作这个游戏,我真的想要访问“子类的子类”。所以我有这样的东西:MainClass> MonsterLibrary> SampleMonster。

我想从MainClass添加这个Sample Monster,但我必须通过MonsterLibrary使用它,所以我不必在我的MainClass中添加怪物怪物。每个重生的怪物都会写在MonsterLibrary类中。

我想它应该是这样的。

public class MainGame extends MovieClip {

    public function MainGame() {
        var mylibrary:MonsterLibrary = new MonsterLibrary();
        mylibrary.MonsterLibrary();

主要课程。

public class MonsterLibrary extends MovieClip {

    #all var here.#

    public function MonsterLibrary(){
        var monster:SampleMonster = new SampleMonster(330,250);
        addChild(monster);
    }

MonsterLibrary课程。

public class SampleMonster extends MonsterLibrary{

    public function SampleMonster(startX:Number, startY:Number) {

        //SETTING STARTING LOCATION
        x = startX;
        y = startY;

SampleMonster类。

我知道我做错了,但我不知道如何做到这一点。我一直收到这个错误 - > 1061:通过静态类型MonsterLibrary的引用调用可能未定义的方法MonsterLibrary。

2 个答案:

答案 0 :(得分:0)

您收到该错误是因为您尝试直接调用MonsterLibrary的构造函数:

public function MainGame()
{
    var mylibrary:MonsterLibrary = new MonsterLibrary();
    mylibrary.MonsterLibrary(); // <- wrong
    ...
}

MonsterLibrary()函数是MonsterLibrary类的构造函数,当您使用new运算符创建类的新实例时,它会自动调用。

如果您希望MonsterLibrary类充当怪物工厂(创建怪物对象的类),请创建一个返回怪物的新函数:

...
public function CreateMonster ( sType:String ):SampleMonster
{
    var oMonster:MovieClip = null; // you can use BaseMonster instead of MovieClip

    if ( sType == "SampleMonster" )
    {
        oMonster = new SampleMonster ( ... );
        ... // initialize the monster here
    }

    ...
    return ( oMonster );
}
...

// get a monster and add it to the stage
var oMonster:MovieClip = oMonsterLibrary.CreateMonster ( "SampleMonster" );

oStage.addChild ( oMonster );

请注意MonsterLibrary不需要扩展MovieClip - 它实际上不需要扩展任何类型(Object除外),因为(我假设)它不是可视对象。它的目的是成为一个工厂,而不是在屏幕上。上面代码中的oStage是您的顶级显示对象 - 它可能是实际阶段,也可能是DisplayObject充当您的舞台。

SampleMonster类型不应扩展MonsterLibrary - 特定的怪物不是库。你的怪物应该直接来自MovieClip或(更好)来自一个共同的基础怪物类;类似的东西:

public class BaseMonster extends MovieClip
{
    ...
}

然后你的SampleMonster可以从这个基础怪物派生出来:

public class SampleMonster extends BaseMonster
{
    ...
}

答案 1 :(得分:0)

我对你想要完成的事感到困惑。

您是否希望每次调用方法时MonsterLibrary都会返回怪物?

即你可以在MonsterLibrary类中使用这样的方法:

public function getMonster():SampleMonster
{
     var monster:SampleMonster = new SampleMonster(330,250);
     return monster;
}

然后您的MainGame可能如下所示:

公共类MainGame扩展了MovieClip {

public function MainGame() {
    var mylibrary:MonsterLibrary = new MonsterLibrary();
    var newMonster:SampleMonster = mylibrary.getMonster();
    addChild(newMonster);

更进一步,您可以使用getMonster方法的参数来指定怪物类型。

例如:

public function getMonster(monsterType:int):Monster
{
   // create the appropriate monster and return it
}

请注意,在您的代码中将怪物添加到MonsterLibrary的显示列表中,意味着永远不会看到它,除非您将MonsterLibrary添加到MainGame <的显示列表中/ p>

此外,您SampleMonster延长MonsterLibrary,但无效。

SampleMonster可能会扩展MovieClipSprite,或者如果您打算拥有多个怪物,那么您希望拥有任何特定怪物可能扩展的基础Monster