0

我正在制作这个游戏,我真的很想访问“子类的子类”。所以我有这样的东西: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);
    }

怪物图书馆类。

public class SampleMonster extends MonsterLibrary{

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

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

SampleMonster 类。

我知道我做错了,但我不知道如何使这项工作。我不断收到此错误-> 1061:通过静态类型 MonsterLibrary 的引用调用可能未定义的方法 MonsterLibrary。

4

2 回答 2

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充当您的舞台的 a。

SampleMonster类型不应该扩展——一个特定的MonsterLibrary怪物不是一个库。您的怪物应该直接派生自MovieClip或(更好地)派生自公共基础怪物类;就像是:

public class BaseMonster extends MovieClip
{
    ...
}

然后你SampleMonster可以从这个基础怪物中获得:

public class SampleMonster extends BaseMonster
{
    ...
}
于 2013-09-18T23:31:51.960 回答
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

你也有SampleMonster扩展MonsterLibrary,这是行不通的。

SampleMonster应该可能扩展MovieClip,或者Sprite如果您打算拥有多个怪物,您希望拥有一个Monster任何特定怪物都可能扩展的基类。

于 2013-09-18T23:36:28.120 回答