1

In my game I have person who shoots and I need if the bullet hit somthing to delete the sprite.

var i = 1;
var f:Function;
addChild(bullet);
bullet.addEventListener(Event.ENTER_FRAME, f = function(){ 
    bullet.x += movex*i;
    bullet.y += movey*i;
    i++;
});

How to make hitTestObject() with everything?

4

3 回答 3

4

碰撞检测有很多技术,但是,使用的方法取决于目标对象的形状。像素完美命中测试是最准确的碰撞检测方法,尽管这很慢。几何命中测试可能是最快的,如果正确完成,可以非常准确。使用的一个缺点hitTestObject是它很慢。因此,如果您需要处理大量对象,我的意见是使用替代方法进行碰撞检测。

绝对对于对象到对象的碰撞检测,您需要遍历放置在数组中的每个目标对象(但为了提高 a 的性能<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://plasticsturgeon.com/2011/03/actionscript-collision-detection-u-circle-circle-collision-detection/

http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

http://www.mikechambers.com/blog/2009/06/25/strategies-for-optimizing-collision-detection-with-bitmapdata-hittest/

这是一个完成繁重工作的库: http ://code.google.com/p/collisiondetectionkit/

于 2012-12-30T08:34:05.943 回答
2

我会这样处理它(我假设项目符号是您从库中添加的电影剪辑)。

我使用僵尸和植物作为已经在舞台上的电影剪辑的示例,您手动将其传递到 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 ] );
    }
  }
};
于 2012-12-30T08:41:19.837 回答
1

希望你有一些包含所有敌人精灵引用的数组。只需用子弹循环调用 hitTestObject() 即可。

于 2012-12-30T08:16:17.080 回答