3

所以我正在使用 AS3 开发一款游戏,目前我需要进行 2D 碰撞检查。为此,我自然而然地使用了 bitmapData 和 hitTest,但由于我不能正确地做到这一点,我决定使用 freeactionscript.com 的 CollisionTest 引擎。但是,即使在使用它时我也遇到了问题,我会尝试借助我包含的图像来解释它。

  1. 设置 - 我有一个黄色字符和一个灰色方块。
  2. 你可以清楚地看到黄色字符被灰色方块挡住了——此时我无法再往前走。
  3. 绕过广场也很好,我也不能再往前走了。
  4. 现在,这是一个难题——碰撞检测在右下角工作得很好。我可以在广场的任何其他部分自由走动,并且不会发生任何过度碰撞(即灰色方块之外)。

我正在使用这段代码:

public class CollisionTest 
{
    // vars
    private var _returnValue:Boolean;

    private var _onePoint:Point;
    private var _twoPoint:Point;

    private var _oneRectangle:Rectangle;
    private var _twoRectangle:Rectangle;

    private var _oneClipBmpData:BitmapData;
    private var _twoClipBmpData:BitmapData;

    private var _oneOffset:Matrix;
    private var _twoOffset:Matrix;

    /**
     * Complex collision test. Use this for objects that are rotated, scaled, skewed, etc
     * @param   clip1   Takes DisplayObjectContainer as argument. Can be a Sprite, MovieClip, etc.
     * @param   clip2   Takes DisplayObjectContainer as argument. Can be a Sprite, MovieClip, etc.
     * @return  Collision True/False
     */
    public 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;
    }

如果有人能提供帮助,那将极大地帮助我。如果您愿意,您可以在这里亲自尝试。

提前致谢,-UPTX

tl;dr:hitTest 在灰色方块的 1/4 上工作,如下所示包括图片

4

1 回答 1

1

据我了解您的问题:

public function complex(clip1:DisplayObjectContainer, clip2:DisplayObjectContainer):Boolean
{
    _returnValue = false;

    _twoRectangle = clip1.getBounds(clip1);

此时,您将获得剪辑的未转换边界。例如,框在旋转时有另一个边界。在你的情况下这不是大问题,只是因为你的单位有更多的“圆形”而不是“盒子”形状。

但是,如果您使用居中的精灵,您将遇到的主要问题(如图所示) - 当一半内容位于“负”空间坐标中时。在这种情况下,方法getBounds返回负左上角。因此,在该对象的位图数据上,您将只有部分精灵。

如果您想快速修复您的方法,请将矩阵设置更改为

   _oneOffset.tx = clip1.x-clip2.x-_twoRectangle.x;
   _oneOffset.ty = clip1.y-clip2.y-_twoRectangle.x;

   _twoOffset.tx = clip2.x - clip2.x-_oneRectangle.x;
   _twoOffset.ty = clip2.y - clip2.y-_oneRectangle.y;

但请注意:要正确计算交点,您需要:

1)改变你的渲染方法。例如,您可以将您的对象附在某个父对象上并绘制该父对象 - 它会为您提供正确的边界框。

2)您可以手动计算边界:从旋转的矩形计算边界框坐标

希望,它会有所帮助。

于 2012-09-14T10:09:24.860 回答