as3 hitTestObject()来点击全部

时间:2012-12-30 08:06:59

标签: actionscript-3 flash sprite removechild

在我的游戏中,我有射击的人,如果子弹击中某些东西以删除精灵,我需要。

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()包含所有内容?

3 个答案:

答案 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://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/

答案 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()。