2017-10-03 2 views
0

ターゲットが表示され、何秒も消える射撃ゲームを作成していました。私はどのようにコードを使用するのか分からず、if statementを使用しているときにオブジェクトを検出する方法がわかりません。as3 - タイマーを使用してオブジェクトが別のオブジェクトに移動したかどうかを検出します。

は、ここに私のコードです:

import flash.utils.Timer; 

var dummySX: Number = dummyS.x; 
var dummySY: Number = dummyS.y; 


var targetTimeStart: Timer = new Timer(1000); 
targetTimeStart.start(); 
targetTimeStart.addEventListener(TimerEvent.TIMER, targetTimeStartNow); 

function targetTimeStartNow(e: TimerEvent): void { 
    target.x = dummySX; 
    target.y = dummySY; 
    targetTimeStart.stop(); 
} 

function detect(): void { 
    if ((target.x == dummySX) && (target.y == dummySY)) { 
     trace("DETECTED"); 
    } 
} 

または

function detect(): void { 
    if (target.hitTestObject(dummyS)==true) { 
     trace("DETECTED"); 
    } 
} 

感謝!!

+0

'hitTest'オプションを調べてみてください。 –

答えて

0

オブジェクト間のヒットを検出する方法はいくつかあります。 あなたが2つの表示オブジェクト(DO1DO2)すべての

まずDO1があるとしましょう。 hitTestObject(do2)。この方法は非常に高速で、長方形のオブジェクトではうまく機能します。長方形のオブジェクトを回転させたり、長方形のオブジェクト以外で使用すると、視覚的に「偽」の結果を得ることができます。

次にdo1があります。 hitTestPoint(do2.x、do2.y、shapeFlag)。このメソッドは、特にshapeFlagをtrueに設定すると、処理は遅くなりますが、より正確です。ヒットを1点(x & y座標)に対してテストします。

BitmapDataオブジェクトを使用することを意味する第3の方法(hitTest)があります。これは、BitmapDataクラスをより正確に特定して処理することは難しくなります(透過ピクセルを無視できる)。

第4のオプションは、ヒット検出のカスタム実装を行うことですが、ここでは少し詳しく説明していません。

コードを見ると、1秒のタイマーオブジェクトを作成して起動した後、targetTimeStartNow機能を持つリスナーを追加することがわかります。その機能では、ターゲットオブジェクトをdummySオブジェクトの同じ位置に移動し、その後、targetTimeStartタイマーオブジェクトを停止します。つまり、その機能には1つのエントリしかありません。

検出機能は、両方の呼び出しがを検出し追跡する必要がありますが、それは、あなたのコードから呼び出されることはありませんようです。

作成した最初の検出機能は、hitTestPointバージョンを模倣しています。

function detect(): void { 
    if ((target.x == dummySX) && (target.y == dummySY)) { 
     trace("DETECTED"); 
    } 
} 

これは同じです:

function detect():void { 
    if(target.hitTestPoint(dummySX, dummySY, false)) { 
     trace("DETECTED"); 
    } 
} 

(オブジェクトの形状ではなく、彼らのバウンディングボックスを使用するために)このバリアントを使用する方が良いと思います:

function detect():void { 
    if(target.hitTestPoint(dummySX, dummySY, true)) { 
     trace("DETECTED"); 
    } 
} 

2番目の検出関数はhitTestObjectを使用しています。これは問題ありません。あなたは明示的に== trueなしでそれを使うことができます:

function detect(): void { 
    if(target.hitTestObject(dummyS)) { 
     trace("DETECTED"); 
    } 
} 

唯一のことは、実行するためにコードで呼び出すことです。ターゲットオブジェクトが移動された後だから、どこかにちょうど追加:

detect(); 

のニーズに応じて、targetTimeStartNowメソッドに追加する(またはenterFrameイベントリスナーを追加するか、または別のTimerオブジェクトを作成する)ことができます:

function targetTimeStartNow(e: TimerEvent): void { 
    target.x = dummySX; 
    target.y = dummySY; 
    targetTimeStart.stop(); 
    detect(); 
} 
関連する問題