针对精灵的AS3透明png碰撞检测

时间:2014-03-12 11:42:10

标签: actionscript-3 flash bitmap collision-detection

我在这里,因为我目前正忙着为我的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;
    }

3 个答案:

答案 0 :(得分:3)

使用BitmapData hitTest()时,您可以非常轻松地检查这两个位图。

bitmapData hitTest()上的

Adob​​e

  

在一个位图图像和一个位图图像之间执行像素级命中检测   点,矩形或其他位图图像。命中被定义为   在不透明像素上的点或矩形的重叠,或两个   重叠不透明像素。没有拉伸,旋转或其他   在命中测试时考虑任一对象的转换   进行。


现在举例说明如何实现它。如果你将精灵变成位图:

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)

许多年前做过这件事......但如果我没有错,你可以解决问题,创建一个带有墙的矢量形状的MC(将它放在墙下)并检查与它的碰撞,而不是使用位图。

答案 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!");
}