1

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

第一帧只有一个stop();“动作”,然后是一个 DocumentClass 外部类文件(我所有的类都是外部的),它设置了预加载器,它在它自己的类文件中。一旦预加载器完成,它会触发一个事件到 DocumentClass,它运行一个gotoAndStop(3);. 第三张幻灯片是一个名为Main的影片剪辑,它有自己的类文件。

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);返回正确的非空值时,我仍然无法修改任何内容(例如,通过设置使我想隐藏的 MovieClip 对象invisibleBG.alpha = 0;仍然返回错误 #1009)。

此外,虽然Main MovieClip 在舞台上可见,但打开屏幕 MovieClip 不显示。我不确定它是否在 Main 对象的后面它似乎根本不在舞台上。

下面是我的一些代码。如果这不能显示问题所在,我可以添加更多。我一直在为此挠头;当然,我花了两天时间才弄清楚我无法修改 aTextField因为它被拉伸了两帧,所以可能有一个非常简单的解决方案。在此先感谢您的帮助!

这是处理初始加载的大部分类:

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 );
    }
}

这是Main类的相关部分:

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

        stage.focus = desktopScreen;
    }
}

以及DesktopScreen的相关部分,游戏的开始画面:

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 );
    }
}

TL;DR我正在向舞台添加一个 MovieClip,即使我可以通过trace函数判断它认为它在舞台上,但我看不到它或以需要它实际的方式修改它的任何内容在舞台上。

4

1 回答 1

0

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

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

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

结果是,当我运行时gotoAndStop(3);,Main 类和对象都可用,称为 DesktopScreen 类和对象。但是只有 DesktopScreen可用(就像在第 2 帧中一样),而对象不可用(直到第 4 帧才可用)。结果是代码运行了,但由于舞台上实际上没有任何东西(即使 Flash 告诉我它是),它引发了一堆错误。

当我在这里查看Michael James Williams 的内容丰富的教程时,我终于明白了这一点。如果您想开始使用 Flash,这是另一个值得回顾的好教程!

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

我希望这可以帮助任何有类似的、令人难以置信的模糊问题的人。如果您有任何问题随时问!

于 2013-01-04T14:17:52.760 回答