您不一定要扩展 main 来创建类似子弹类的东西,这可以是它自己的扩展 Sprite 或 MovieClip 的类。舞台对象被认为是一个全局对象,因为它是一个单例(Adobe AIR 的情况除外,您可以在每个生成的 NativeWindow 中拥有一个舞台)。因此,任何扩展 DisplayObject 或在其继承链中包含 DisplayObject 的对象默认情况下都会通过 getter 引用舞台,当 displayObject 添加到显示列表时会自动填充该 getter。这可以通过将剪辑直接添加到根舞台对象或将剪辑添加为最终连接到舞台的另一个剪辑的子级来实现。例如:
var clip1:MovieClip = new MovieClip();
stage.addChild(clip1); //Clip 1 can now access the stage reference internally.
ver clip2:MovieClip = new MovieClip(); //Right now, clip2 cannot access the stage reference interally.
clip1.addChild(clip2); //Now clip2 can access the internal stage reference because it has been connected to the display list through clip1.
人们犯的另一个错误是访问 DisplayObject 类型类(例如 Main 类)中的舞台,而没有首先确保对象本身已添加到舞台中。您可以通过在类的构造函数中侦听 Event.ADDED_TO_STAGE 事件来做到这一点,如下所示:
public class Main extends MovieClip{
function Main(){
if(stage){
//The stage reference is present, so we're already added to the stage
init();
}else{
addEventListener(Event.ADDED_TO_STAGE, init);
}
var player = new Player();
var playerBullets = new playerBullet();
addChild(player.players);
}
private function init(e:Event = null)
{
trace("Added to stage, the stage reference is now populated and stage can be accessed");
}
}
这可能是您遇到的问题,但很难说,因为您没有指定任何错误。但是,这可能是一个问题,或者将是您的问题,因为它很常见。在 init() 方法中,您可以设置一个标志,以便当外部类调用您的 Main.blah() 方法时,您可以确保在尝试将某些内容添加到阶段之前存在阶段引用。但是请注意,在您的 Main 类中,您只需说:
addChild(someChild);
或
this.addChild(someChild);
您不是将该子对象添加到舞台,而是添加到 Main 对象,这是一个基于 MovieClip 或 Sprite 的对象,当您将其设置为 Document 类时,它本身会自动附加到舞台。希望这些信息对您有所帮助。
更新
再解释一下显示列表:
将您的所有电影剪辑视为盘子,将舞台视为桌子。如果盘子直接放在桌子上,或者盘子堆叠在另一个接触桌子的盘子的顶部,您只能从盘子访问桌子。如果你有 10 个盘子叠放在一起,它们最终都会通过彼此的连接接触到桌子。这本质上是一个 Flash 显示列表的可视化。将盘子放在桌子上的方法是使用 addChild(dish)。如果您没有在桌子上的某个地方放置一个对象,并尝试从该对象访问该表,那么您将失败。您收到“访问未定义”错误,因为您正在调用“blah()”方法,该方法在将项目符号(盘)添加到阶段(表)之前访问阶段(表)。因此,您必须首先将项目符号直接添加到舞台,或者将其添加到已添加到舞台的另一个对象中。像这样更改您的代码:
var myBullet:Bullet = new Bullet();
stage.addChild(myBullet);
//Or, if this class, assuming it's the player class, has already been added to the stage, just do this:
this.addChild(myBullet);
myBullet.blah();
即便如此,您仍应在“blah”方法中进行一些错误检查,以确保该阶段可用:
function blah(){
var someSprite = new someSprite();
if(stage){
Main.addChild(someSprite);
stage.addChild(someSprite);
root.addChild(someSprite);
}else{
trace("error, stage not present");
}
}
但是您还应该注意,通过将此子对象依次添加到 Main、stage、root all,这不会复制 someSprite 对象。当您将显示对象添加到新的父对象时,该对象会自动从其当前父对象中拉出并移动到新的父对象。所以这段代码最终要做的就是将 someSprite 添加到 root,我相信这会失败,因为 root 不是显示对象,而是一个全局引用,主要用于访问全局对象,例如舞台和用于加载 SWF 的 Loader 对象.