ActionScript 3 的位图 Hittest 碰撞检查 Movieclips 与偏移
ActionScript 3's Bitmap Hittest Collision Checking On Movieclips with Offset
我无法让位图 hittest 方法在我的影片剪辑上正常工作。我尝试了几次使用来自不同来源的信息,但 none 成功了。我遇到了一个预制函数,可以为我处理所有最棘手的困惑,我尝试使用它。我首先在一个新程序上尝试了它,发现为了使该功能起作用,电影剪辑必须在左上角居中,但考虑到我必须在我的电影剪辑上使用特定的旋转点,在左上角居中不是一个选择。我还尝试更改偏移量的计算方式,看看我是否可以将每个偏移量操作到左上角,但它似乎没有任何好处。
我知道这是一个非常具体的问题,但是没有足够的位图命中测试信息让我自己理解这个问题,我认为这对其他试图使用和理解精确碰撞的人也很有用。
这是预制函数的代码:
var _returnValue:Boolean;
var _onePoint:Point;
var _twoPoint:Point;
var _oneRectangle:Rectangle;
var _twoRectangle:Rectangle;
var _oneClipBmpData:BitmapData;
var _twoClipBmpData:BitmapData;
var _oneOffset:Matrix;
var _twoOffset:Matrix;
function complex(clip1:DisplayObjectContainer, clip2:DisplayObjectContainer):Boolean
{
_returnValue = false;
_twoRectangle = clip1.getBounds(clip1);
_oneOffset = clip1.transform.matrix;
_oneOffset.tx = clip1.x - clip2.x;
_oneOffset.ty = clip1.y - clip2.y;
_twoClipBmpData = new BitmapData(_twoRectangle.width, _twoRectangle.height, true, 0);
_twoClipBmpData.draw(clip1, _oneOffset);
_oneRectangle = clip2.getBounds(clip2);
_oneClipBmpData = new BitmapData(_oneRectangle.width, _oneRectangle.height, true, 0);
_twoOffset = clip2.transform.matrix;
_twoOffset.tx = clip2.x - clip2.x;
_twoOffset.ty = clip2.y - clip2.y;
_oneClipBmpData.draw(clip2, _twoOffset);
_onePoint = new Point(_oneRectangle.x, _oneRectangle.y);
_twoPoint = new Point(_twoRectangle.x, _twoRectangle.y);
if(_oneClipBmpData.hitTest(_onePoint, 255, _twoClipBmpData, _twoPoint, 255))
{
_returnValue = true;
}
_twoClipBmpData.dispose();
_oneClipBmpData.dispose();
return _returnValue;
}
这里是调用预制函数的代码:
var inVision:Boolean = complex(visionVector[controlBirds], birdVector[checkLRD]);
以下是影片剪辑的屏幕截图:
Bird movieclip (The movieclip referenced by the birdVector)
Vision movieclip (The movieclip referenced by the visionVector)
如有任何帮助,我们将不胜感激。
您分享的功能非常简单。它从您的每个 MovieClips 和 checks the alpha channel for overlapping pixels 创建一个位图。如您所述,偏移量是您的问题,您需要更改采样区域。
读取 BitmapData.draw()
, you can see that the second argument accepts a matrix. Using Matrix.translate()
的 API,我们可以从默认 0,0
坐标偏移样本区域(尽管 matrix.tx
和 matrix.ty
是等效的属性)。
要注意的第二件事是传递给 hitTest()
的 Point
对象定义了两个被测试的 BitmapData
对象开始重叠的位置(因为它们不'与舞台有任何关系,我们必须定义这些虚构物体的位置)。该位置必须是 [location of object] + [bounding offset]
.
下面是重构后的函数...
function testCollision(a:DisplayObject, b:DisplayObject):Boolean {
var aBmp:BitmapData = new BitmapData(a.width, a.height, true, 0);
var aRect:Rectangle = a.getBounds(a);
var aMatrix:Matrix = new Matrix();
aMatrix.translate(-aRect.x, -aRect.y)
aBmp.draw(a, aMatrix);
var bBmp:BitmapData = new BitmapData(b.width, b.height, true, 0);
var bRect:Rectangle = b.getBounds(b);
var bMatrix:Matrix = new Matrix();
bMatrix.translate(-bRect.x, -bRect.y)
bBmp.draw(b, bMatrix);
return (bBmp.hitTest(new Point(bRect.x + b.x, bRect.y + b.y), 255, aBmp, new Point(aRect.x + a.x, aRect.y + a.y), 255));
}
我无法让位图 hittest 方法在我的影片剪辑上正常工作。我尝试了几次使用来自不同来源的信息,但 none 成功了。我遇到了一个预制函数,可以为我处理所有最棘手的困惑,我尝试使用它。我首先在一个新程序上尝试了它,发现为了使该功能起作用,电影剪辑必须在左上角居中,但考虑到我必须在我的电影剪辑上使用特定的旋转点,在左上角居中不是一个选择。我还尝试更改偏移量的计算方式,看看我是否可以将每个偏移量操作到左上角,但它似乎没有任何好处。
我知道这是一个非常具体的问题,但是没有足够的位图命中测试信息让我自己理解这个问题,我认为这对其他试图使用和理解精确碰撞的人也很有用。
这是预制函数的代码:
var _returnValue:Boolean;
var _onePoint:Point;
var _twoPoint:Point;
var _oneRectangle:Rectangle;
var _twoRectangle:Rectangle;
var _oneClipBmpData:BitmapData;
var _twoClipBmpData:BitmapData;
var _oneOffset:Matrix;
var _twoOffset:Matrix;
function complex(clip1:DisplayObjectContainer, clip2:DisplayObjectContainer):Boolean
{
_returnValue = false;
_twoRectangle = clip1.getBounds(clip1);
_oneOffset = clip1.transform.matrix;
_oneOffset.tx = clip1.x - clip2.x;
_oneOffset.ty = clip1.y - clip2.y;
_twoClipBmpData = new BitmapData(_twoRectangle.width, _twoRectangle.height, true, 0);
_twoClipBmpData.draw(clip1, _oneOffset);
_oneRectangle = clip2.getBounds(clip2);
_oneClipBmpData = new BitmapData(_oneRectangle.width, _oneRectangle.height, true, 0);
_twoOffset = clip2.transform.matrix;
_twoOffset.tx = clip2.x - clip2.x;
_twoOffset.ty = clip2.y - clip2.y;
_oneClipBmpData.draw(clip2, _twoOffset);
_onePoint = new Point(_oneRectangle.x, _oneRectangle.y);
_twoPoint = new Point(_twoRectangle.x, _twoRectangle.y);
if(_oneClipBmpData.hitTest(_onePoint, 255, _twoClipBmpData, _twoPoint, 255))
{
_returnValue = true;
}
_twoClipBmpData.dispose();
_oneClipBmpData.dispose();
return _returnValue;
}
这里是调用预制函数的代码:
var inVision:Boolean = complex(visionVector[controlBirds], birdVector[checkLRD]);
以下是影片剪辑的屏幕截图:
Bird movieclip (The movieclip referenced by the birdVector)
Vision movieclip (The movieclip referenced by the visionVector)
如有任何帮助,我们将不胜感激。
您分享的功能非常简单。它从您的每个 MovieClips 和 checks the alpha channel for overlapping pixels 创建一个位图。如您所述,偏移量是您的问题,您需要更改采样区域。
读取 BitmapData.draw()
, you can see that the second argument accepts a matrix. Using Matrix.translate()
的 API,我们可以从默认 0,0
坐标偏移样本区域(尽管 matrix.tx
和 matrix.ty
是等效的属性)。
要注意的第二件事是传递给 hitTest()
的 Point
对象定义了两个被测试的 BitmapData
对象开始重叠的位置(因为它们不'与舞台有任何关系,我们必须定义这些虚构物体的位置)。该位置必须是 [location of object] + [bounding offset]
.
下面是重构后的函数...
function testCollision(a:DisplayObject, b:DisplayObject):Boolean {
var aBmp:BitmapData = new BitmapData(a.width, a.height, true, 0);
var aRect:Rectangle = a.getBounds(a);
var aMatrix:Matrix = new Matrix();
aMatrix.translate(-aRect.x, -aRect.y)
aBmp.draw(a, aMatrix);
var bBmp:BitmapData = new BitmapData(b.width, b.height, true, 0);
var bRect:Rectangle = b.getBounds(b);
var bMatrix:Matrix = new Matrix();
bMatrix.translate(-bRect.x, -bRect.y)
bBmp.draw(b, bMatrix);
return (bBmp.hitTest(new Point(bRect.x + b.x, bRect.y + b.y), 255, aBmp, new Point(aRect.x + a.x, aRect.y + a.y), 255));
}