我正在尝试理解实现画布/上下文对象的代码。如果该对象的子画面在画布上以鼠标按钮按下事件提供的指定坐标集(据我所知)遇到,则此代码返回该对象。以下代码是否创建对象数组?
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
我对这段代码感到非常困惑,但该应用程序运行没有错误,所以我一定没有完全理解它。
谢谢。
它不返回数组。它返回一个对象,请参阅:return obj;
。您只能从函数返回一次。
p.s. 如果这段代码的作者要返回一个数组,他可能会称之为:getObjectsByPixel(注意 s)。
return
总是在输入函数时结束执行并返回到堆栈。
所以这意味着它只返回一个对象。 为了返回数组,函数必须首先创建数组,然后在循环完成后返回它。
我终于弄清楚了块的动态。循环只返回一个obj
(无论如何我都知道)。逻辑是,对于画布上的每个对象子画面,都会在叠加画布中创建一个不可见的填充矩形,直到鼠标单击坐标在其中一个矩形的边界内。然后返回从中生成该矩形的对象。