我在这里,因为我目前正忙着为我的AS3应用程序进行碰撞检测。 我正在加载一个位图,代表一个房间 - 它有边界(墙),其余部分是透明的(地板)。然后我创建一个内部有圆圈的精灵。
我希望我的精灵能够在这些界限内移动并停在墙上,我能够实现其背后的逻辑,我要求的是一种检测与墙碰撞的方法,我的整个房间都是一个位图,所以我猜我只会检查这个位图的碰撞,但不幸的是它也会计算透明的部分。
我已经对此进行了谷歌研究,但我发现非常复杂的系统无论如何都无法运行。我这样做是出于学习目的,所以我想知道如何自己实现它。
因此,我问是否有人可以为我提供一些代码,只检查我位图的非透明部分的碰撞? (或者我应该将此png作为向量加载?怎么做?)。
我也在转动我的“圈子”,所以我想这也应该考虑。我假设我应该对位图进行位图检查而不是精灵到位图?
我根本没有碰撞的工作代码,所以我不会提供任何代码。
我应该提供更多信息,请告诉我。
提前致谢!
@EDIT
这是我的功能代码,它属于Room Class。
public function detectCollisionWith(obj:Sprite):Boolean
{
var _bitmapData:BitmapData = new BitmapData(obj.width, obj.height, true, 0);
_bitmapData.draw(obj);
var _bitmap:Bitmap = new Bitmap(_bitmapData);
if (_bitmapData.hitTest(new Point(_bitmap.x, _bitmap.y), 255, this.bitmap, new Point(this.x, this.y), 255))
return true;
return false;
}
答案 0 :(得分:3)
使用BitmapData
hitTest()
时,您可以非常轻松地检查这两个位图。
bitmapData
hitTest()
上的Adobe :
在一个位图图像和一个位图图像之间执行像素级命中检测 点,矩形或其他位图图像。命中被定义为 在不透明像素上的点或矩形的重叠,或两个 重叠不透明像素。没有拉伸,旋转或其他 在命中测试时考虑任一对象的转换 进行。
现在举例说明如何实现它。如果你将精灵变成位图:
var spriteBmd:BitmapData = new BitmapData( mySprite.width, mySprite.height, true, 0 );
spriteBmd.draw( mySprite ); //get the sprite asset
var spriteBitmap:Bitmap = new Bitmap( spriteBmd ); //create the bitmap to use
然后,您可以针对两个位图运行hitTest()
,而忽略透明部分:
if ( spriteBitmap.bitmapData.hitTest( new Point( mySprite.x, mySprite.y ),
255, levelBitmap, new Point( levelBitmap.x, levelBitmap.y ), 255 ) ) {
trace("Collision detected");
}
这仅检查位图的不透明部分是否存在冲突。如果要增加允许检测的透明度,可以在if语句中调整值255
。
答案 1 :(得分:0)
答案 2 :(得分:0)
简单的房间?它是简单的矩形吗?因此,我建议通过检查预定义矩形中的点来计算碰撞。创建矩形,在圆的半径上插入它的大小,并检查矩形内部的圆心是否
//Some room
var roomBounds:Rectangle = new Rectangle(0, 0, 700, 500);
const circleRadius:int = 10;
var collisionBounds: Rectangle = new Rectangle(circleRadius, circleRadius, roomBounds.width - 2*circleRadius, roomBounds.height - 2*circleRadius);
//Check if center of circle inside of collisionBounds
//For example you have point with name circlePosition
//collisionBounds.containsPoint(circlePosition)
if(!collisionBounds.contains(circleX, circleY)){
trace("Houston! We have collision here!");
}