AS3中使用hitTest和bitmapData进行半碰撞检测

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;
    }

希望有人能帮忙,这涉及到IT技术。如果您想尝试,请点击此处
谢谢, -UPTX
简短版:hitTest仅适用于灰色正方形的四分之一,如下所示:picture included
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)您可以手动计算边界:从旋转矩形计算边界框坐标 希望这能帮到您。

你好,我按照你的教程编写了这个代码:链接,但是它并没有起作用。我似乎无法理解它,因为它也不能正常工作 - 我得到了极其混乱的结果。 - user1669696
这不是我的教程,但是让我问一下 - 为什么你不想按照我的第一个提议来做呢?“你可以将你的对象封装到某个父级中,并绘制这个父级 - 这将给你正确的边界框。”这样会更容易。 - Roman Trofimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接