【发布时间】:2017-09-29 01:26:12
【问题描述】:
我正在尝试使用基于网格的地图编写简单的 2D 自上而下游戏,但在某些画布区域中处理像素时遇到问题。我有以下功能:
changeCellBackground(x, y, r, g, b){
let cell = this.context.getImageData(x * this.TILE_SIZE, y * this.TILE_SIZE, this.TILE_SIZE, this.TILE_SIZE);
for(let i=0; i<cell.data.length; i+=4){
cell.data[i] += r;
cell.data[i+1] += g;
cell.data[i+2] += b;
}
this.context.putImageData(cell, x * this.TILE_SIZE, y * this.TILE_SIZE);
}
context 是 canvas 2d 上下文:
this.screen = $('#game');
this.context = this.screen[0].getContext('2d');
和有 src 链接的 Img 标签:
let tileSet = $('<img></img>').attr('src', '../assets/tiles.png');
但是,当我尝试使用上述功能时,我得到了SecurityError: The operation is insecure.。据我了解,这是由于 CORS 限制而发生的,所以我尝试将 add crossOrigin="anonymous" 属性设置为 Img:
let tileSet = $('<img></img>').attr('crossOrigin', 'anonymous').attr('src', '../assets/tiles.png');
但现在我收到了NS_ERROR_NOT_AVAILABLE:。我猜这是因为当脚本的其余部分开始执行时图像尚未加载。我该如何解决?我试过这个:
let tileSet = $('<img></img>');
tileSet.onload = function(){
tileSet.attr('crossOrigin', 'anonymous').attr('src', '../assets/tiles.png');
gameScreen.drawAnimatedImage(0, 0, 'waterfall');
gameScreen.drawAnimatedImage(2, 2, 'fountain');
gameScreen.drawAnimatedImage(11, 5, 'street_lamp');
gameScreen.drawAnimatedImage(10, 5, 'street_lamp');
gameScreen.changeCellBackground(10, 15, -30, -30, -30);
};
但它也不起作用 - 当我在 onload 函数的末尾设置 console.log(tileSet) 时,控制台上没有任何记录。似乎没有触发 onload 功能。为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
您正在设置
src属性 inside 您的加载事件处理程序,这需要设置src以便在某天触发... 将此行放在这个处理程序。国际海事组织这个问题应该作为错字关闭......
标签: javascript html image image-processing canvas