2011-12-20 10 views
0

私の試合では、ボールがwinBoxに当たった場合、勝利メッセージが表示されます。問題は、ボールがバウンスし、ボックスに繰り返しヒットすることです。セッションごとに2回メッセージが表示されないようにするにはどうすればよいですか?AS3:イベントが2回起こらないようにしますか?

  if (simContacts.isCurrentContact(winBox,gameBall)) 
     { 
      // Won. 
      trace ('You won!'); 
      isFiring=false; 

      //Win Message 
      winMsg=new win_mc(); 
      addChild(winMsg); 
      winMsg.y=250; 
      winMsg.x=40; 
      winMsg.gotoAndPlay(2); 

     } 

完全なコード:

package { 

import flash.display.MovieClip; 
import com.actionsnippet.qbox.*; 
import flash.events.MouseEvent; 
import flash.events.Event; 

[SWF(width = 300, height = 600, frameRate = 60)] 

public class LuckyHitBeta extends MovieClip { 

    public var sim:QuickBox2D; 
    var winBox:QuickObject; 
    var looseBox:QuickObject; 
    var looseBox2:QuickObject; 
    var gameBall:QuickObject; 
    var simContacts:QuickContacts; 
    var isFiring:Boolean=false; 
    var ballIcon:ballIcon_mc; 
    var winMsg:win_mc; 



    /** 
    * Constructor 
    */ 
    public function LuckyHitBeta() 
    { 
     liveIcon(); 
     sim = new QuickBox2D(this); 
     simContacts = sim.addContactListener(); 
     simContacts.addEventListener(QuickContacts.ADD, contactListener); 
     //Important Collisions; 

     winBox = sim.addBox({x:2,y:597/30, width:98/30, height:10/30, density:0, skin:stick, skinScale:false}); 
     looseBox = sim.addBox({x:5,y:597/30, width:98/30, height:10/30, density:0, skin:stick, skinScale:false}); 
     looseBox2 = sim.addBox({x:8,y:597/30, width:98/30, height:10/30, density:0, skin:stick, skinScale:false}); 
     //Collisions 
     sim.addBox({x:3.5,y:560/30, width:72/30, height:13/30, density:0, skin:stick, skinScale:false, angle:1.57}); 
     sim.addBox({x:6.5,y:560/30, width:72/30, height:13/30, density:0, skin:stick, skinScale:false, angle:1.57}); 
     sim.addBox({x:0/30,y:300/30, width:600/30, height:28/30, density:0, skin:stick, skinScale:false, angle:1.57}); 
     sim.addBox({x:300/30,y:300/30, width:600/30, height:28/30, density:0, skin:stick, skinScale:false, angle:1.57}); 



     // make obstacles 
     for (var i:int = 0; i<(stage.stageWidth/28); i++){ 
     //End 
      sim.addCircle({x:1.2 + i * 0.8, y:16, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:0.6 + i * 0.8, y:15, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
     } 

     for (var o:int = 0; o<(stage.stageWidth/55); o++){ 
     //Middle 

       sim.addCircle({x:1.3 + o * 1.5, y:14, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:13, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:12, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:11, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
       sim.addCircle({x:1.3 + o * 1.5, y:10, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
     } 

     for (var u:int = 0; u<(stage.stageWidth/45); u++){  
     //Start 
      sim.addCircle({x:0.8 + u * 1.3, y:09, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:1.55 + u * 1.3, y:08, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:0.8 + u * 1.3, y:07, radius:0.15, density:0, skin:ping, scaleSkin:false}); 
      sim.addCircle({x:1.55 + u * 1.3, y:06, radius:0.15, density:0, skin:ping, scaleSkin:false}); 

     } 
     addEventListener(Event.ENTER_FRAME,onEnterFrm); 
     stage.addEventListener(MouseEvent.CLICK, _clicked); 
     sim.start(); 



    } 

    /** 
    * .. 
    * @param e MouseEvent.CLICK 
    */ 
    private function _clicked(e:MouseEvent) 
    { 
     if (! isFiring){ 
      gameBall = sim.addCircle({x:(mouseX/30), y:(2), radius:0.15, density:1, restitution:0.7, friction:0, skin:ball, scaleSkin:false, angularDamping:20}); 
      isFiring=true; 
      ballIcon.gotoAndStop(2); 

     } 
    } 

    private function liveIcon():void { 
     ballIcon=new ballIcon_mc(); 
     addChild(ballIcon); 
     ballIcon.y=30; 
    }   

    private function onEnterFrm(e:Event):void 
    {   
     ballIcon.x=mouseX; 
     if (gameBall && gameBall.body.IsSleeping()) 
      { 
       gameBall.destroy(); 
       gameBall = null; 
       isFiring=false; 
       ballIcon.gotoAndStop(1); 
      } 
    } 

    private function contactListener(e:Event) 
    { 
     if (simContacts.isCurrentContact(winBox,gameBall)) 
     { 
      // Won. 
      trace ('You won!'); 
      isFiring=false; 
      ballIcon.gotoAndStop(1); 

      winMsg=new win_mc(); 
      addChild(winMsg); 
      winMsg.y=250; 
      winMsg.x=40; 
      winMsg.gotoAndPlay(2); 

     } 

     if (simContacts.isCurrentContact(looseBox,gameBall)) 
     { 
      // Loose. 
      trace ('You loose!'); 
      //gameBall({friction:1,restitution:0}); 
      isFiring=false; 
      ballIcon.gotoAndStop(1); 
     } 
    } 


} 

}

答えて

4

は、 "あなたは勝つ!" ようにするにはボール1回につきメッセージを発し、プレーヤーが勝利したときにイベントリスナーを削除し、ユーザーがボールを作成するたびにイベントリスナーを追加します。同じオブジェクトに複数回イベントリスナーを追加しても問題ありません。イベントリスナー関数は一度だけ呼び出されます。

private function clicked(e:MouseEvent) 
{ 
    if (!isFiring) 
    { 
     // Add the ball. 
     simContacts.addEventListener(QuickContacts.ADD, contactListener); 
    } 
} 

... 

private function contactListener(e:Event):void 
{ 
    if (simContacts.isCurrentContact(winBox, gameBall)) 
    { 
     // You win. 
     simContacts.removeEventListener(QuickContacts.ADD, contactListener); 
    } 
    else if (simContacts.isCurrentContact(winBox, gameBall)) 
    { 
     // You lose. 
    } 
} 
+0

ありがとうございます。問題は、ターゲットに再びヒットした場合、メッセージが表示されないことです。 –

+1

それは目標ですか?あなたは、 "メッセージがセッションごとに2回起こらないようにする"と述べました。セッションとは何ですか?また、セッションはいつリセットされますか? –

+0

申し訳ありませんがうまく説明できませんでした。isFiring = trueまたはfalseを使用します。発生していない場合は、メッセージが表示されません。 –

0

または、winMsgが追加されているかどうかを確認できます。 (この例ではステージに追加しています)。

if (stage.contains(winMsg)) 
{ 
winMsg=new win_mc(); 
addChild(winMsg); 
winMsg.y=250; 
winMsg.x=40; 
winMsg.gotoAndPlay(2); 
} 

したがって、winMsgは1度だけ追加されます。

その後、winMsgを削除し、終了したらそれをnullに設定します。

removeChild(winMsg); 
winMsg = null; 

PS。イベントリスナーを設定するときは、常に弱い参照を使用することをお勧めします。そうしないと、メモリからオブジェクトをクリアする際に問題が発生する可能性があります。これを行うには、単にあなたのaddEventListenersの終わりに

、偽、0、真

を追加します。例えば

simContacts.addEventListener(QuickContacts.ADD、contactListener、false、0、true);

関連する問題