MOUSE_DOWN触发每一帧,ActionScript 3

时间:2011-07-19 20:21:33

标签: actionscript-3 mouseevent

因为我是as3的新手,我想实现一个MachineGun,在弹药时触发,触发器被拉,在我的情况下,MouseEvent.MOUSE_DOWN

问题是这个事件只会触发一次。

我得到的最接近的是MouseEvent.MOUSE_MOVE,但是当鼠标位置持续时它无法实现我的目的

编辑:

我需要每帧都更新鼠标光标

4 个答案:

答案 0 :(得分: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]

以下是运行示例Flash应用程序的图像:

enter image description here

鼠标按钮位于右上角,因此子弹朝那个方向射击。

答案 1 :(得分: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();
}

编辑:为了澄清,停止和开始发射功能是运行循环以保持机枪发射动画的功能,但可能是这样。

答案 2 :(得分: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();
}

答案 3 :(得分: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!');
    }