gpt4 book ai didi

javascript - createjs flash cc,单独的 list 预加载

转载 作者:行者123 更新时间:2023-11-28 05:11:47 24 4
gpt4 key购买 nike

我有一个基于 Flash CC 构建的基于动画的 html 项目,并且在单独预加载方面遇到了困难。

我想做的是;

  1. 加载 1 个图像(显示“请稍候”)并使用 createjs 导出。
  2. 动画在时间线开始处停止,在此处调用函数。
  3. 加载一些资源。
  4. 开始动画
  5. 在时间轴上的某个点停止动画。然后加载动画下一部分的资源。
  6. 加载完成后,继续播放动画。等等

我可以加载所有资源并播放整个动画。但当涉及到分离 list 时;它加载我想要的文件并继续播放动画,但加载的图像未显示在 Canvas 上。

我使用以下代码作为 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”的,但我无法将其实现到代码中。我很乐意提供任何帮助。

非常感谢。

最佳答案

这不起作用的原因是,当您实例化 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,则不需要在 start 方法中进行额外的 stage.update() 调用(它将只是无缘无故地进行额外抽奖)。

关于javascript - createjs flash cc,单独的 list 预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com