【发布时间】:2011-01-11 00:38:05
【问题描述】:
我编写了一个使用 BitmapData.hitTest 的碰撞检测类。基本上,每次更新时,都会调用 .draw 方法,然后将两个 BitmapData 相互碰撞测试以查看是否存在冲突。
它工作得很好,但是如果我开始旋转用于 BitmapData 的源影片剪辑,则转换不会在 draw 方法中注册。所以我所做的就是在draw方法中通过一个Matrix。这样可行。但这是实际问题。如果我将 BitmapData 输出到舞台上的 Bitmap,我看到 Bitmap 是,实际上是在旋转,但现在它超出了 BitmapData 的边界(宽度和高度)。哪个正在裁剪/裁剪源 MovieClip 的图像。
我的第一个猜测是旋转 BitmapData,但旋转似乎是不可能的。没有任何属性可以帮助您实现这一目标。还有其他方法吗?
更新:基本上,当电影剪辑的位图克隆在正坐标空间之外旋转时,它不会被绘制。它在 BitmapData 设置的宽度和高度范围之外旋转。我可以将边界乘以 2,然后将位图居中设置边界内,但是原点永远不会固定,并且对象总是在移动。效果很好,但无法将对象与任何特定点对齐。
这是我的独立测试代码。它要求您在舞台上有一个名为“iTest”的 MovieClip。我使用了一个相当垂直的箭头形状(高于它的宽度),因此我可以直观地跟踪旋转并帮助突出剪裁问题:
var rotateTimer:Timer = new Timer(10);
function rotateObject_init():void
{
rotateTimer.addEventListener(TimerEvent.TIMER, rotateObject);
rotateTimer.start();
}
function rotateObject_stop():void
{
rotateTimer.removeEventListener(TimerEvent.TIMER, rotateObject);
rotateTimer.stop();
}
function rotateObject(_event:TimerEvent):void
{
// Deletes the previous bitmap
if (this.getChildByName("iTestClone") != null)
{
removeChild(this.getChildByName("iTestClone"));
testClone = null;
testData = null;
}
iTest.rotation += 1;
// Capture source BitmapData
var testData:BitmapData = new BitmapData(iTest.width, iTest.height, false, 0xFFFFFF);
// Capture source transformations
var testMatrix:Matrix = new Matrix();
testMatrix.scale(iTest.scaleX, iTest.scaleY);
testMatrix.rotate( iTest.rotation * (Math.PI / 180) );
testMatrix.translate(0, 0);
// Draw source with matrix
testData.draw(iTest, testMatrix);
// Output Bitmap
var testClone:Bitmap = new Bitmap(testData);
testClone.name = "iTestClone";
testClone.transform = testMatrix.tra
addChild(testClone);
// Always makes sure source is visible
this.swapChildren(iTest, testClone);
}
rotateObject_init();
【问题讨论】:
-
也许您可以使用 CDK (code.google.com/p/collisiondetectionkit) 并完全避免这个问题?
-
我宁愿使用自己的代码,这样我可以从经验中学习。另外,我真的不喜欢使用其他人的代码,人们有如此不同的思维方式,我发现最好坚持自己的工作流程。不过我很欣赏这个链接。
-
甜蜜,分享。我也可能有一个修复,我今晚可以尝试。基本上,您需要进行预先计算,将目标对象旋转 360 度,然后在此过程中捕获它的最大值和高度。使用它作为您的 BitmapData 大小,然后使用与您所做的有点相似的技术,但也许更简单,因为我们现在有了宽度和高度,并为 Bitmap 计算出固定的左上角位置,当然,适合在 BitmapData 的范围内。灵感来自 8BitRocket 上的教程。
标签: flash actionscript-3 actionscript