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 常に実行を終了し、関数に入った時点でスタックに戻ります。

つまり、単一のオブジェクトのみが返されます。配列を返すために、関数は最初に配列を作成し、ループの終了後にそれを返す必要があります。

于 2012-05-23T16:34:05.070 に答える
2

配列を返しません。オブジェクトを返します。 を参照してくださいreturn obj;。関数から戻ることができるのは 1 回だけです。

ps このコードの作成者が配列を返す場合、おそらくそれを getObjectsByPixel と呼んでいたでしょう ( sに注意してください)。

于 2012-05-23T16:32:05.727 に答える
0

私はついにブロックのダイナミクスを解決しました。ループは 1 つだけを返しますobj(これはとにかく私が知っていたことです)。ロジックは、キャンバス上のすべてのオブジェクト スプライトに対して、マウス クリック座標がいずれかの長方形の境界内に収まるまで、オーバーレイされたキャンバスに非表示の塗りつぶされた長方形が作成されます。次に、その長方形が生成されたオブジェクトが返されます。

于 2012-05-24T01:20:15.133 に答える