【问题标题】:Initialize Assets after Preload预加载后初始化资产
【发布时间】:2011-12-24 00:42:59
【问题描述】:

每当我导出我的 Flash 游戏的 .swf 文件时,我都会收到 "TypeError: Error #1009: Cannot access a property or method of a null object reference.",以及我的预加载器的 Runtime Shared Library Preloading Warning。我已经组织了我的时间线,以便第一帧和第三帧都是空的,以及 Actions 层中的 stop(); 命令。第二帧包含一个包含我所有导出资源的电影剪辑,这些资源将在时间轴的第三帧中初始化。除了预加载器之外,我的所有资产都不会在第一帧中导出。我应该对我的文档类进行哪些更改才能初始化第三帧中的资产?

文档类:

package com.gameEngine.documentClass
{
    import flash.events.*;
    import flash.display.*;
    import flash.geom.Point;
    import com.gameEngine.assetHolders.*;
    import com.gameEngine.assetHolders.Levels.*;

    public class Document extends MovieClip
    {
        private static var _document:Document;
        private var preloader:Preloader;
        public var mcMain:Player;
        public var restartButton:RestartButton;
        public var spawnArea:SpawnArea;
        public var level_1:Level_1;
        public var level_2:Level_2;
        public var level_3:Level_3;

        public function Document()
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
            _document = this;
            preloader = new Preloader(390, this.loaderInfo);
            this.addChild(preloader);
            preloader.addEventListener("loadComplete", loadAssets);
            preloader.addEventListener("preloaderFinished", showLogo);
            mcMain = new Player(this);
            restartButton = new RestartButton(this);
            spawnArea = new SpawnArea();
            level_1 = new Level_1(this);
            level_2 = new Level_2(this);
            level_3 = new Level_3(this);
            this.addChild(restartButton);
            this.addChild(spawnArea);
            this.preloader.x = 400;
            this.preloader.y = 250;
            restartButton.x = 822.95;
            restartButton.y = 19;
            spawnArea.x = 400;
            spawnArea.y = 250;
            trace ("Document Class Initialized");
            // constructor code
        }
        public static function getInstance():Document
        {
            return _document;
        }
        private function loadAssets(event:Event):void
        {
            this.play();
        }
        private function showLogo(event:Event):void
        {
            this.removeChild(preloader);
        }
        public function init(event:Event)
        {
            if (stage.contains(spawnArea))
            {
                addChild(mcMain);
            }
            mcMain.x = spawnArea.x;
            mcMain.y = spawnArea.y;
        }
    }
}

预加载器类:

package com.gameEngine.assetHolders
{
    import com.gameEngine.documentClass.*;
    import flash.display.*;
    import flash.events.*;

    public class Preloader extends MovieClip
    {
        private var fullWidth:Number;
        public var loaderInfo:LoaderInfo;

        public function Preloader(fullWidth:Number = 0, loaderInfo:LoaderInfo = null)
        {
            this.fullWidth = fullWidth;
            this.loaderInfo = loaderInfo;

            addEventListener(Event.ENTER_FRAME, checkLoad);
        }

        private function checkLoad (event:Event):void
        {
            if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal && loaderInfo.bytesTotal != 0)
            {
                dispatchEvent(new Event("loadComplete"));
                phaseOut();
            }

            updateLoader(loaderInfo.bytesLoaded / loaderInfo.bytesTotal);
        }

        private function updateLoader(num:Number):void
        {
            progressBar.width = num * fullWidth;
        }

        private function phaseOut():void
        {
            removeEventListener(Event.ENTER_FRAME, checkLoad);
            progressBar.gotoAndPlay(2);
            if (progressBar.currentFrame == progressBar.totalFrames)
            {
                phaseComplete();
            }
        }

        private function phaseComplete() : void
        {
            dispatchEvent(new Event("preloaderFinished"));
        }
    }
}

【问题讨论】:

    标签: actionscript-3 flash-cs5


    【解决方案1】:

    这里有很多竞争条件。其中许多事件可能发生在彼此相对随机的时间。 . .你必须异步思考。也就是说,不存在任何对象存在的假设。例如,在Document.init() 中,您检查spawnArea 是否存在,但几乎可以保证此时不存在,并且您再也不会检查它。

    无需进行任何具体更改,我可以推荐一个通用的解决方案。对于要在加载另一个对象 (objA) 后加载的任何对象 (objB),请在 objAADDED_TO_STAGE 处理程序中创建 objB。一个简单的例子是:

    var objA:Whatever;
    var objB:WhateverElse;
    
    [...]
    
    objA = new Whatever();
    objA.addEventListener(Event.ADDED_TO_STAGE, objAAddedHnd);
    
    [...]
    
    public function objAAddedHnd(event:Event)
    {
        // remove the event, if no longer needed:
        objA.removeEventListener(Event.ADDED_TO_STAGE, objAAddedHnd);
    
        objB = new WhateverElse();
        objB.addEventListener(Event.ADDED_TO_STAGE, objBAddedHnd);
    }
    
    [...]
    
    public function objBAddedHnd(event:Event)
    {
        // remove the event, if no longer needed:
        objB.removeEventListener(Event.ADDED_TO_STAGE, objBAddedHnd);
    
        // and so on . . .
    }
    

    此时,它表明您需要计划对象创建的时间线。

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多