在我的游戏中,我有射击的人,如果子弹击中某些东西以删除精灵,我需要。
var i = 1;
var f:Function;
addChild(bullet);
bullet.addEventListener(Event.ENTER_FRAME, f = function(){
bullet.x += movex*i;
bullet.y += movey*i;
i++;
});
如何使hitTestObject()
包含所有内容?
答案 0 :(得分:3)
有许多用于碰撞检测的技术,但是,使用的方法取决于目标对象的形状。像素完美的测试是最准确的碰撞检测方法,虽然这很慢。几何测试可能是最快的,如果正确完成可以非常准确。使用hitTestObject
的一个缺点是它很慢。因此,如果您需要处理大量对象,我的意见是使用替代方法进行碰撞检测。
对于对象碰撞检测,您需要遍历放置到数组中的每个目标对象(但是为了将性能提升到<Vector>
)并测试子弹是否命中目标对象。
bullet.addEventListener(Event.ENTER_FRAME, testCollision);
private function testCollision(e: Event) {
bullet.x += moveX*i;
bullet.y += moveY*i;
for (var j = 0; j < objects.length; j++) {
if (bullet.hitTestObject(objects[j])) {
// Do something
}
}
i++;
};
值得阅读这些文章以获得进一步的解释:
http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/
这是一个做繁重工作的图书馆: http://code.google.com/p/collisiondetectionkit/
答案 1 :(得分:2)
我会像这样解决它(我假设子弹是你从图书馆添加的MovieClip)。
我使用僵尸和植物作为已经在舞台上的MovieClip的示例,您手动将其传递到liveObjects数组。
对于大型游戏,显然你不会硬编码,但我试图减少额外的东西以使示例更容易理解)
import flash.events.Event;
import flash.display.MovieClip;
var liveObjects:Array = [
zombie1, // A MovieClip on the stage
zombie2, // ditto
zombie3, // ditto
plant1, // ditto
plant2 // ditto
];
// Create bullet
var bullet:Bullet = new Bullet();
bullet.x = 200;
bullet.y = 200;
addChild( bullet );
bullet.addEventListener( Event.ENTER_FRAME, f );
var i:int = 1;
var moveX:int = 1;
var moveY:int = 1;
function f( e:Event ){
var thisBullet:MovieClip = ( e.currentTarget as MovieClip );
thisBullet.x += moveX * i;
thisBullet.y += moveY * i;
i++;
for( var j:int; j < liveObjects.length; j++ ) {
if( thisBullet.hitTestObject( liveObjects[ j ] ) ) {
trace( "Hit " + liveObjects[ j ] );
}
}
};
答案 2 :(得分:1)
希望你有一些数组能够引用所有敌人的精灵。只需通过子弹循环调用它上面的hitTestObject()。