我正在尝试理解实现canvas / context对象的代码。如果画布在鼠标按钮向下事件提供的指定坐标集上遇到该对象的精灵,则此代码返回一个对象(据我所知)。 以下代码是否创建了一个对象数组?
var selObj = getObjectByPixel(mx,my);
和
function getObjectByPixel(x,y) {
gctx.clearRect(0,0,MaxX,MaxY);
//alert(levelData.world['ExtraBlockTNT_1'].name);
for (var objname in levelData.world) {
var obj = levelData.world[objname];
var sprd = spriteData[obj.definition];
if(!sprd) continue;
var tr = transform(obj.x, obj.y, sprd.data.width, sprd.data.height);
gctx.save();
gctx.translate(tr.x,tr.y);
gctx.rotate(obj.angle);
gctx.fillRect(-tr.w/2, -tr.h/2, tr.w, tr.h);
gctx.restore();
//console.info(x,y);
var imageData = gctx.getImageData(x, y, 1, 1);
if (imageData.data[3] > 0) {
return obj;
}
}
return null;
}
在我看来,如果遇到像素数据,循环中的第一个对象将返回。如果是这种情况,循环结束(这是我假设会发生的事情)还是继续返回对象并将它们存储在selObj
我对此代码感到很困惑,但应用程序运行没有错误,所以我不能完全理解它。
感谢。
答案 0 :(得分:2)
它不会返回数组。它返回一个对象,请参阅:return obj;
。您只能从函数返回一次。
P.S。如果此代码的作者要返回一个他可能会调用它的数组:getObjectsByPixel(注意 s )。
答案 1 :(得分:2)
return
总是结束执行并在输入函数时返回堆栈。
这意味着它只返回一个对象。为了返回一个数组,该函数必须首先创建数组,然后在循环结束后返回它。
答案 2 :(得分:0)
我终于弄清楚了块的动态。循环只返回一个obj
(这是我所知道的)。逻辑是,对于画布上的每个对象sprite,在覆盖的画布中创建一个不可见的填充矩形,直到鼠标单击坐标位于其中一个矩形的范围内。然后返回生成该矩形的对象。