2011-07-19 55 views
0

因爲我是新來的as3,我想實現一個MachineGun,在有彈藥的同時觸發,並且觸發器被拉動,在我的情況下爲MouseEvent.MOUSE_DOWNMOUSE_DOWN觸發每一幀,ActionScript 3

問題是此事件只會觸發一次。

我得到的最接近的是這是MouseEvent.MOUSE_MOVE,但它失敗時,鼠標的位置是持續我的目的

編輯:

我需要更新的鼠標光標每幀

回答

5

當您MouseEvent.MOUSE_DOWN事件處理程序,您可以創建一個事件偵聽器偵聽要調度的Event.ENTER_FRAME活動中刪除。使用Event.ENTER_FRAME事件處理程序,您可以重複調用處理射擊項目符號的方法。以下是一個例子,我的示例仿照在http://www.benoitfreslon.com/actionscript-throw-bullets-to-mouse-direction

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    [SWF(width="500", height="500", frameRate="24", backgroundColor="0xFFFFFF")] 
    public class Main extends Sprite 
    { 
     private var _gun:Gun; 
     private var _interval:int; 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      _gun = new Gun(); 
      _gun.x = stage.stageWidth/2 - _gun.width/2; 
      _gun.y = stage.stageHeight/2 - _gun.height/2; 
      addChild(_gun); 

      stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown); 

     }// end function 

     private function onStageMouseDown(e:MouseEvent):void 
     { 
      stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame); 
      stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); 

     }// end function 

     private function onStageEnterFrame(e:Event):void 
     { 
      shootBullet(); 

     }// end function 

     private function shootBullet():void 
     { 
      if (_interval > 5) 
      { 
       var bullet:Bullet = new Bullet(); 
       bullet.addEventListener(Event.ENTER_FRAME, onBulletEnterFrame); 
       bullet.x = _gun.x; 
       bullet.y = _gun.y; 
       bullet.angleRadian = Math.atan2(stage.mouseY - _gun.y, stage.mouseX - _gun.x); 
       bullet.addEventListener(Event.ENTER_FRAME, onBulletEnterFrame); 
       addChild(bullet); 

       _interval = 0; // reset 

      }// end if 

      _interval++; 

     }// end function 

     private function onBulletEnterFrame(e:Event):void 
     { 
      var bullet:Bullet = Bullet(e.target); 
      bullet.x += Math.cos(bullet.angleRadian) * bullet.SPEED; 
      bullet.y += Math.sin(bullet.angleRadian) * bullet.SPEED; 

      if (bullet.x < 0 || bullet.x > 500 || bullet.y < 0 || bullet.y > 500) 
      { 
       removeChild(bullet); 
       bullet.removeEventListener(Event.ENTER_FRAME, onBulletEnterFrame); 

      }// end if 

     }// end function 

     private function onStageMouseUp(e:MouseEvent):void 
     { 
      stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame); 
      stage.removeEventListener(MouseEvent.MOUSE_UP, onStageMouseUp); 

      _interval = 0; 

     }// end function 

    }// end class 

}// end package 

import flash.display.Sprite; 

internal class Gun extends Sprite 
{ 
    public function Gun() 
    { 
     graphics.beginFill(0x000000); 
     graphics.drawCircle(0, 0, 10); 
     graphics.endFill(); 

    }// end function 

}// end class 

internal class Bullet extends Sprite 
{ 
    public var angleRadian:Number; 
    public const SPEED:Number = 10; 

    public function Bullet() 
    { 
     graphics.lineStyle(1, 0x000000); 
     graphics.drawCircle(0, 0, 10); 
     graphics.endFill(); 

    }// end function 

}// end class 

感興趣的點是在onStageEnterFrame()方法。有一個if語句,用於檢查_interval屬性的值是否大於5,如果是,則創建新的項目符號並進行拍攝,否則_interval屬性的值將遞增。 _interval財產的目的是隔開被槍殺的子彈。

[UPDATE]

下面是示例閃存應用程序的運行的一個圖像:

enter image description here

鼠標按鈕被按下在右上角因此子彈正在拍攝在那個方向。

3

在接收一個MouseEvent.MOUSE_DOWN事件,運行一個while循環讓機槍開火。循環在接收到MouseEvent.MOUSE_UP事件時中斷。事情是這樣的

private function handleMouseDown(event:Event):void 
{ 
    this.addEventListener(MouseEvent.MOUSE_UP , handleMouseUp); 
    startFiring(); 
} 


private function handleMouseUp(event:Event):void 
{ 
    this.removeEventListener(MouseEvent.MOUSE_UP , handleMouseUp); 
    this.addEventListener(MouseEvent.MOUSE_DOWN , handleMouseDown); 
    stopFiring(); 
} 

編輯:爲了澄清,停止和啓動點火功能是運行一個循環,以保持機槍射擊的動畫會然而,可能是功能。

+0

我還需要更新的光標位置,所以我可能知道鏡頭的位置,我該怎麼做? –

+0

@Fabiano,在'MouseEvent.MOUSE_UP'上添加一個偵聽器,它調用'aim(event.stageX,event.stageY)' –

0

附加動作射擊按下鼠標時ENTER_FRAME事件,當鼠標移動起來

this.addEventListener(MouseEvent.MOUSE_DOWN, this.handler_down); 
this.addEventListener(MouseEvent.MOUSE_UP, this.handler_up); 

private function handler_down(event:Event):void { 
    super.addEventListener(Event.ENTER_FRAME, this.handler_frame); 
} 

private function handler_up(event:Event):void { 
    super.removeEventListener(Event.ENTER_FRAME, this.handler_frame); 
} 

private function handler_frame(event:Event):void { 
    this.fire(); 
} 
0

我必須經常這樣做,而不是使用enter_frame偵聽器,我選擇Timer()和TimerEvent.Timer偵聽器。通過這種方式,我可以更好地控制重複頻率的觸發頻率,而無需考慮幀頻和不支持的幀頻。

private var fireRepeat:Timer; 
    private function triggerDown(e:MouseEvent):void { 
     if (!this.fireRepeat) {  // create the repeater 
      this.fireRepeat = new Timer(500, 0); 
      this.fireRepeat.addEventListener(TimerEvent.TIMER, this.fire); 
     } 
     fire();      // fire the first bullet 
     this.fireRepeat.reset(); // reset the repeater 
     this.fireRepeat.start(); // start the repeater 
    } 
    private function triggerUp(e:MouseEvent):void { 
     if (this.fireRepeat) { this.fireRepeat.stop(); } 
    } 
    public function fire(e:* = null):void { 
     trace('fire!'); 
    } 
相關問題