我正在制作这个游戏,我真的想要访问“子类的子类”。所以我有这样的东西: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。
答案 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
可能会扩展MovieClip
或Sprite
,或者如果您打算拥有多个怪物,那么您希望拥有任何特定怪物可能扩展的基础Monster
类