2014-03-12 40 views
3

我在这里,因为我目前正在为我的AS3应用程序碰撞检测而苦苦挣扎。 我正在加载一个位图,代表一个房间 - 它有边界(墙),其余部分是透明的(地板)。然后我创建一个带有圆圈的精灵。AS3透明PNG碰撞检测针对精灵

我希望我的精灵在这些边界内移动并停在墙上,我能够实现逻辑后面的逻辑,我要求的是一种检测与墙壁碰撞的方法,我的整个房间是一个位图,所以我猜想我只是检查与该位图的冲突,但不幸的是,它也计数透明部分。

我已经做了一个谷歌的研究,但我只发现非常复杂的系统,无论如何不会工作。我正在学习目的,所以我想知道如何自己实现它。

因此,我问是否有人可以提供一段代码,只检查我的位图的非透明部分的碰撞? (或者我应该加载这个PNG作为矢量?怎么做?)。

我也在旋转我的“圈子”,所以我想这也应该考虑。我认为我应该做位图检查位图而不是精灵位图?

我没有碰撞的工作代码,所以我不会提供任何。

我应该提供更多信息,请告诉我。

提前致谢!

@EDIT

这是代码,我有我的功能,它属于房类。

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

的内圆的中心,您可以非常容易地检查这个时候都使用BitmapDatahitTest()两个位图。

的AdobebitmapDatahitTest()

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


现在如何实现它的一个例子。如果你把你的精灵成位图:

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

+0

好吧,这看起来很简单,但有一件事让我感到困惑,但为什么我需要传递这些位图的x和y?这是否意味着它只测试1点(像素),我需要遍历两个位图的所有点? – user1970395

+0

不,你不需要发送所有的点,只是位图的x和y。这些点只是告诉它从哪里开始,哪里结束,如果你传递了显示对象,算法将通过它们各自的边界进行筛选。或者,您可以将他们左上角的点传递给底部右边界。 –

+0

好吧,我会给它一个去,并带回一些结果(希望积极)。性能如何?对于巨大的位图(我将拥有大约5000 x 5000“房间”png)它会不会显着影响它。 – user1970395

0

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

+0

伟大的,这可能会做,但我如何获得我的图像的载体上MC? – user1970395

+0

你不能用一些线手动绘制它吗? – Nadia

+0

不是真的,绘制它太复杂,需要很长时间,还有墙壁上有其他对象用于最终产品,它们都必须从png映射。我已经设法使它与[AirBag](http://cote.cc/w/wp-content/uploads/projects/airbag)lib协同工作,但是我必须放弃它,因为它在解决冲突方面存在漏洞 - 因为没有明显的原因,我有时会穿过墙壁或者登上它(然后当我试图摆脱它时有一件有趣的事情)。所以它做我需要的东西(读取png的透明度),但不会让我反弹或停止有时。 – user1970395

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!"); 
} 
+0

不幸的是,它不是更复杂的空间,好吧,它超过了一个房间的完整信息,但我现在尝试工作我的第一个房间,所以我可以停在墙上。 – user1970395