簡體   English   中英

as3 hitTestObject()擊中所有

[英]as3 hitTestObject() to hit all

在我的游戲中,我有射擊的人,如果子彈擊中東西,我需要刪除子畫面。

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()

有很多用於碰撞檢測的技術,但是,使用的方法取決於目標對象的形狀。 像素完美的碰撞測試是最准確的碰撞檢測方法,盡管這非常慢。 幾何命中測試可能是最快的,如果正確完成,則可能非常准確。 使用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/

我會這樣處理(假設子彈是您要從庫中添加的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 ] );
    }
  }
};

希望您有一些數組可以引用所有敵方精靈。 只需用項目符號遍歷對它的調用hitTestObject()即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM