【发布时间】:2014-01-11 08:37:21
【问题描述】:
我正在尝试水平翻转 SpriteSheet 动画中的精灵。我从this example开始
我在创建 SpriteSheet
后立即添加了翻转帧 var ss = new createjs.SpriteSheet(spriteSheet);
createjs.SpriteSheetUtils.addFlippedFrames(ss, true, false, false);
grant = new createjs.BitmapAnimation(ss);
...
我总是收到这个错误:
Uncaught TypeError: Cannot read property 'length' of null (SpriteSheetUtils.js l.174)
我看到有人在这个github thread 中遇到了同样的问题 并使用预加载机制对其进行了修复。
该示例也使用了预加载,因此我尝试在资源加载后调用 addFlippedFrames,但仍然看到相同的错误。
有人知道吗? 如何使用 addFlippedFrames ?
编辑: 这是我尝试过的代码:
用我的 spritesheet 初始化舞台:
spriteSheet = new createjs.SpriteSheet({
"animations": {
"none": [0, 0],
"run": [0, 25],
"jump": [26, 63]
},
"images": ["characters/grant/runningGrant.png"],
"frames": {
"height": h,
"width": w,
"regX": 0,
"regY": 0,
"count": 64
}
});
sprite = new createjs.BitmapAnimation(spriteSheet);
sprite.x = startPosition.x;
sprite.y = startPosition.y;
// Add the sprite to the stage.
stage.addChild(this.sprite);
然后像这样使用预加载:
var manifest = [{
src: "characters/grant/runningGrant.png",
id: "grant"
}
];
var loader = new createjs.LoadQueue(false);
loader.onFileLoad = handleFileLoad;
loader.onComplete = onResourcesLoaded;
loader.loadManifest(manifest);
和回调函数:
handleFileLoad = function(event) {
assets.push(event.item);
};
onResourcesLoaded = function() {
for (var i = 0; i < assets.length; i++) {
var item = assets[i];
var id = item.id;
var result = loader.getResult(id);
if (item.type == createjs.LoadQueue.IMAGE) {
var bmp = new createjs.Bitmap(result);
//does this Bitmap creation trigger the real bitmap loading ?
//is this loading asynchrous which would explain my problem.
//in this case, how can I manage the loading callback ?
}
}
//I would expect here to have the image fully loaded but its not
//A timeout of 2 seconds makes the addFlippedFrames works.
setTimeout(function(){
createjs.SpriteSheetUtils.addFlippedFrames(spriteSheet, true, false, false);
sprite.gotoAndPlay("run_h"); //I think "run_h" is used to launch the flipped version of "run"
}, 2000);
};
【问题讨论】:
-
你能通过 jsfiddle 分享你的具体例子吗?我遇到了同样的问题,就我而言,问题是图像尚未加载。作为一个非常快速和肮脏的测试,您可以在执行
addFlippedFrames之前使用 1 或 2 秒的超时(仅用于测试) -
是的,它在 2 秒超时后工作......:/
-
我试图用我的例子创建一个 JSFiddle,但是得到了一个 DOM SECURITY 异常:/你可以在这里看到它:jsfiddle.net/2K6SX/5
标签: easeljs