gpt4 book ai didi

actionscript-3 - 使用 AS3 的 hitTest 和 bitmapData 进行半碰撞

转载 作者:行者123 更新时间:2023-12-04 04:30:04 27 4
gpt4 key购买 nike

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

  1. 设置 - 我有一个黄色字符和一个灰色方 block 。
  2. 你可以清楚地看到黄色字符被灰色方 block 挡住了 - 此时我无法继续前进。
  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;
}

如果有人能提供帮助,那将对我有很大帮助。大家可以自己试试here如果你愿意的话。

提前致谢,-UPTX

tl;dr:hitTest 适用于灰色方 block 的 1/4,如此处所示 picture included :

最佳答案

据我了解你的问题:

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

_twoRectangle = clip1.getBounds(clip1);

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

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

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

   _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) 您可以手动计算边界:Calculate Bounding box coordinates from a rotated rectangle

希望,它会有所帮助。

关于actionscript-3 - 使用 AS3 的 hitTest 和 bitmapData 进行半碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12413820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com