ActionScript 3:添加到Stage的MovieClip不显示或正在工作

时间:2013-01-02 23:25:21

标签: flash actionscript movieclip stage cs4

我正在使用ActionScript 3在Adobe Flash CS4中制作一个简单的游戏。我最近实现了一个新的非常小的预加载器来替换我正在使用的占位符。然而,一旦我这样做,我似乎打破了一切。

第一帧在“Actions”中只有stop();,然后是DocumentClass外部类文件(我的所有类都是外部的),用于设置预加载器,该预加载器位于自己的类文件中。预加载器完成后,会向DocumentClass触发一个事件,该事件运行gotoAndStop(3);。幻灯片三是一个标题为 Main 的影片剪辑,带有自己的类文件。

主要导入一堆东西,然后加载游戏的开始屏幕。在这一点上,一切基本上都会崩溃。任何修改此打开屏幕上的内容(包含类文件和MovieClip对象)的尝试都会导致“TypeError:错误#1009:无法访问空对象引用的属性或方法”。我认为此代码可能在MovieClip在舞台上之前运行,因此我添加了addEventListener( Event.ADDED_TO_STAGE, onAddtoStage );并将代码移动到onAddtoStage函数;在执行trace("this is the stage: "+stage);trace("this is my parent: "+this.parent);时将返回正确的非空值,我仍然无法修改任何内容(例如,通过设置{{1,使我想隐藏的MovieClip对象隐藏起来仍然返回错误#1009)。

此外,虽然舞台上可以看到 Main MovieClip,但是不会显示打开的屏幕MovieClip。我不确定它是否隐藏在主要对象之后,但它似乎根本就不在舞台上。

下面是我的一些代码。如果这没有显示问题是什么,我可以添加更多。我一直在为此苦苦挣扎;当然,我花了两天时间才发现我无法修改invisibleBG.alpha = 0;,因为它延伸了两个帧,所以可能有一个非常简单的解决方案。在此先感谢您的帮助!

以下是处理初始加载的大多数类:

TextField

以下是 Main 类的相关部分:

public class DocumentClass extends MovieClip  
{
    public var loadingScreen:LoadingScreen;

    public function DocumentClass()
    {
        loadingScreen = new LoadingScreen();
        addChild( loadingScreen );

        stage.stageFocusRect = false;

        loadingScreen.addEventListener( Event.COMPLETE, onPreloaderComplete );
        loadingScreen.setLoaderInfo( loaderInfo );
    }

    public function onPreloaderComplete( e:Event ):void
    {
        loadingScreen.removeEventListener( Event.COMPLETE, onPreloaderComplete );
        removeChild( loadingScreen );
        loadingScreen = null;

        gotoAndStop( 3 );
    }
}

游戏开场画面 DesktopScreen 的相关部分:

public class Main extends MovieClip
{
    public function Main()
    {
        showDesktop();
    }
    public function showDesktop():void
    {
        desktopScreen = new DesktopScreen();
        addChild( desktopScreen );

        stage.focus = desktopScreen;
    }
}

TL; DR 我正在向舞台添加一个MovieClip,即使我可以通过public class DesktopScreen extends MovieClip { public function DesktopScreen() { addEventListener( Event.ADDED_TO_STAGE, onAddtoStage ); } public function onAddtoStage( e:Event ):void { Mouse.show(); invisibleBG.alpha = 0; fakeButton.stop(); time = new Time; time.x = 504; time.y = 3; addChild( time ); } } 函数告诉它认为它在舞台上,我也看不到它或者以一种要求它实际上在舞台上的方式修改它的任何内容。

1 个答案:

答案 0 :(得分:0)

好的,我今天设法解决了这个问题。这就是发生的事情。

当我实现新的预加载器时,我尝试使用详细的here三帧方法。顺便说一句,如果您正在寻找一个,那么这是关于预加载器的一个很好的通用教程。

但是,我在本教程后面尝试使用四帧方法,但我错过了一个重要的事实:Flash无法访问资产,直到它们到达它们所在的帧。所以,第1帧只有我的预加载器(和非常小的DocumentClass),第2帧是我的类框架,第3帧有Main对象及其相关代码,第4帧有我的AssetHolder对象和我的所有库对象。

结果是当我运行gotoAndStop(3);时,Main类和对象可用,它调用了DesktopScreen类和对象。但只有DesktopScreen 可用(如第2帧中所示)且对象不可用(直到第4帧才可用)。结果是代码运行了,但由于舞台上没有任何东西(尽管Flash告诉我它是),它引发了一堆错误。

当我回顾Michael James Williams here提供的极具信息性的教程时,我终于明白了这一点。如果你想开始使用Flash,这是另一个很好的教程!

所以,这很容易解决;停止使用(不必要的)第4帧作为我的资产,然后将它们移动到第2帧。第1帧仍然在动作面板中有stop();,因此游戏一开始加载就会停止,查看DocumentClass,开始预加载,然后在加载后进入第3帧(在所有资产和类可用之后)。

我希望这可以帮助那些有类似,令人难以置信的模糊问题的人。如果您有任何疑问,请随时提出!