1

私のゲームでは、撃つ人がいて、スプライトを削除するために弾丸が何かに当たった場合に必要です。

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()すべてで作る方法は?

4

3 に答える 3

4

衝突検出にはさまざまな手法がありますが、使用する方法はターゲットオブジェクトの形状によって異なります。ピクセルパーフェクトヒットテストは最も正確な衝突検出方法ですが、これは非常に低速です。幾何学的ヒットテストはおそらく最速であり、正しく実行されれば非常に正確になります。使用の欠点hitTestObjectの1つは、非常に遅いことです。したがって、オブジェクトの大きなプールを処理する必要がある場合の私の意見は、衝突検出に別の方法を使用することです。

オブジェクト間の衝突検出では、配列に配置された各ターゲットオブジェクトをループして(ただし、パフォーマンスを向上させるために<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

私はこのように取り組みます(弾丸はライブラリから追加しているMovieClipsであると想定しています)。

すでにステージ上にあるMovieClipsの例として、ゾンビと植物を使用しています。これは、手動で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 に答える