createjs flash cc,单独的清单预加载

时间:2016-12-25 08:54:50

标签: javascript html5-canvas createjs preloadjs

我在Flash CC上构建了一个基于动画的html项目,并且在单独预加载方面苦苦挣扎。

我想做的是;

  1. 加载1张图片(表示“请稍候”)并创建导出。
  2. 动画在时间轴的开头停止,在这里调用一个函数。
  3. 加载一些资产。
  4. 开始动画
  5. 在时间轴上的某个点停止动画。然后加载下一部分动画的组合。
  6. 加载完成后,继续动画。等
  7. 我可以加载所有资源并播放整个动画。但是当谈到分开清单时;它加载我想要的文件并继续动画,但加载的图像不会显示在画布上。

    我在html中使用以下代码作为init.js文件;

    var canvas, stage, exportRoot;
    
    function init() {
        canvas = document.getElementById("canvas");
        images = images||{};
        preloadLaunch(); 
    }
    
    function preloadLaunch(){
        var loader = new createjs.LoadQueue(false);
        loader.addEventListener("fileload", handleFileLoad);
        loader.addEventListener("complete", handleComplete);
        loader.loadManifest(lib.properties.manifestLaunch); //selects the manifest from createjs export,  first image says please wait.
    }
    
    
    function handleFileLoad(evt) {
        if (evt.item.type == "image") { images[evt.item.id] = evt.result; }
    }
    
    function handleComplete() {
        exportRoot = new lib.project();
        stage = new createjs.Stage(canvas);
        stage.addChild(exportRoot);
        stage.update();
        stage.enableMouseOver();
        createjs.Ticker.setFPS(lib.properties.fps);
        createjs.Ticker.addEventListener("tick", stage); 
    }
    
    
    /// triggers from animation timeline
    function preloadPart01() {
        var loader01 = new createjs.LoadQueue(false);
        loader01.addEventListener("fileload", handleFileLoad);
        loader01.addEventListener("complete", start);
        loader01.loadManifest(lib.properties.manifestPart01); //selects the manifest from createjs export   
    }
    
    function start() {
        stage.update();
        exportRoot.animation.gotoAndPlay("START"); // files are loaded in manifestPart01 and starts the animation, but loaded images are not visible.
    }
    

    我当时认为这是关于“getResult”但我无法将其实现到代码中。我会很高兴得到任何帮助。

    非常感谢。

1 个答案:

答案 0 :(得分:0)

这不起作用的原因是因为当您实例化exportRoot时,它会构建exportRoot所需的时间轴中的所有内容,包括任何Bitmap实例。位图使用存储在全局images对象中的已加载图像进行实例化,因此如果您尚未预加载其内容,则会为其提供null图像 - 并且没有更新它们的机制加载辅助内容时。

以下是导出库中Bitmap实例的代码段:

(lib.BitmapName = function() {
    this.initialize(img.BitmapName); // THIS WILL BE NULL IF LOADED LATER
}).prototype = p = new cjs.Bitmap();
p.nominalBounds = new cjs.Rectangle(0,0,600,800);

能够通过在全局images对象中预先创建引用并稍后更新它来解决这个问题:

// Pre-create dummy instances BEFORE you create the `exportRoot`
var manifest = lib.properites.manifestPart01;
for (var i=0, l=manifest.length; i<l; i++) {
    images[manifest.id] = document.createElement("img"); // Empty instances
    // Note: Don't set src
}

然后在handleFileLoad方法中,更新实例(如果存在)。

function handleFileLoad(evt) {  
    if (evt.item.type == "image") { 
        if (images[evt.item.id] != null) {
            // Just update the existing instance.
            images[evt.item.id].src = evt.result.src;
        } else {
            // Original behaviour
            images[evt.item.id] = evt.result; 
        }
    }   
}

应该有效,因为只要在创建库项目时图像实例存在,它就会在加载图像后显示。请注意,因为这会设置一个src属性,所以当从浏览器缓存中提取图像时会有一个短暂的延迟(通常是一个完整的刻度)。

完全披露 - 我没有对此进行测试,但根据我对EaselJS的了解,它应该可以正常工作。我有兴趣听听这是否适合你。

另外一个注意事项:如果你有一个Ticker更新了这个阶段,你不需要在你的stage.update()方法中进行额外的start调用(它会毫无理由地进行额外的抽奖) )。