因爲我是新來的as3,我想實現一個MachineGun,在有彈藥的同時觸發,並且觸發器被拉動,在我的情況下爲MouseEvent.MOUSE_DOWN
。MOUSE_DOWN觸發每一幀,ActionScript 3
問題是此事件只會觸發一次。
我得到的最接近的是這是MouseEvent.MOUSE_MOVE
,但它失敗時,鼠標的位置是持續我的目的
編輯:
我需要更新的鼠標光標每幀
因爲我是新來的as3,我想實現一個MachineGun,在有彈藥的同時觸發,並且觸發器被拉動,在我的情況下爲MouseEvent.MOUSE_DOWN
。MOUSE_DOWN觸發每一幀,ActionScript 3
問題是此事件只會觸發一次。
我得到的最接近的是這是MouseEvent.MOUSE_MOVE
,但它失敗時,鼠標的位置是持續我的目的
編輯:
我需要更新的鼠標光標每幀
當您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]
下面是示例閃存應用程序的運行的一個圖像:
鼠標按鈕被按下在右上角因此子彈正在拍攝在那個方向。
在接收一個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();
}
編輯:爲了澄清,停止和啓動點火功能是運行一個循環,以保持機槍射擊的動畫會然而,可能是功能。
附加動作射擊按下鼠標時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();
}
我必須經常這樣做,而不是使用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!');
}
我還需要更新的光標位置,所以我可能知道鏡頭的位置,我該怎麼做? –
@Fabiano,在'MouseEvent.MOUSE_UP'上添加一個偵聽器,它調用'aim(event.stageX,event.stageY)' –