为什么我的精灵的hitbox不旋转?怎么解决?

时间:2011-02-20 18:59:09

标签: flash actionscript-3

我有一个方形精灵。我将它旋转45度。现在我想测试它何时与另一个物体碰撞,但是命中箱没有倾斜,所以即使物体似乎没有碰到它也会记录命中。

虽然这不是正确的方式;方形排列成为一颗钻石(其中一个点指向下方),而撞击框仍然是一个正方形(好像它是一个放在桌子上的立方体)。

var square:Sprite = new Squaresprite(); // a simple sprite formed like a square
square.rotation = 45;
Stage.addChild(square);
square.hitTestObject(someOtherSprite); // can return true even if the sprites don't visibly seem to be touching

很难理解闪光灯对这些隐形盒的作用。例如,如果您使用容器并将精灵放入其中。我想,理解这一点可以更容易地预测何时会发生这类问题。

是否有一个简单的解决方案,不需要我在旋转位置重绘我的精灵?

3 个答案:

答案 0 :(得分:2)

为什么不简单地使用已经经过bug验证并考虑过的碰撞检测类?像这样:http://evolve.reintroducing.com/2008/10/29/as3/as3-collision-detection-kit/

基本上,它归结为Flash认为你的hitTest或hitTestPoint位于movieclip / sprite的边界框上,无论轮换如何。真正的碰撞检测超出了这个范围(使用类似这样的类)。

答案 1 :(得分:0)

听起来命中测试是使用对象的轴对齐边界框,如您所述。这是一个相对快速的测试,因为所涉及的数学相对简单 - xy值是否在目标范围内。

您需要让代码更“智能”。

使用边界框作为第一个近似值是/否测试。如果边界框不与目标交互,那么您可以确定该对象不会因此您可以立即丢弃此目标。如果边界框确实相互作用,那么您将需要进行一些更复杂的测试。

答案 2 :(得分:0)

hitTestObject使用对象的边界框(您可以使用getBounds获取它们)。但是,您可以使用hitTestPoint并将第3个参数设置为true(shapeFlag)以告诉Flash使用DisplayObject的实际形状(包括转换),但正如您可能猜到的,它只针对单个点测试它们

如果你需要测试正方形,你可以为每个方格的每个角落做这个。对于两个盒子,它只需要8次测试(这不会花费太多的cpu时间),但是如果盒子太多,你可能想要通过hitTestObject或其他技术(网格等等)来过滤可能的命中。

对于更复杂的形状,您将需要更复杂的计算和/或技术,在这种情况下,我肯定会使用jpea的答案;)