0

我试图理解实现画布/上下文对象的代码。如果在画布上的鼠标按钮按下事件(据我所知)提供的一组指定坐标处遇到该对象的精灵,则此代码返回一个对象。以下代码是否创建对象数组?

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

我对这段代码感到很困惑,但应用程序运行时没有错误,所以我一定不能完全理解它。

谢谢。

4

3 回答 3

2

它不返回数组。它返回一个对象,请参阅:return obj;. 你只能从一个函数返回一次。

ps 如果此代码的作者要返回一个数组,他可能会调用它:getObjectsByPixel(注意s)。

于 2012-05-23T16:32:05.727 回答
2

return 总是结束执行并返回到函数输入点的堆栈。

所以这意味着它只返回一个对象。为了返回一个数组,函数必须首先创建数组,然后在循环结束后返回它。

于 2012-05-23T16:34:05.070 回答
0

我终于弄清楚了街区的动态。该循环只返回一个obj(无论如何我都知道)。逻辑是,对于画布上的每个对象精灵,在覆盖的画布中创建一个不可见的填充矩形,直到鼠标单击坐标位于其中一个矩形的边界内。然后返回生成该矩形的对象。

于 2012-05-24T01:20:15.133 回答