Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 鼠标按下每帧触发一次,ActionScript 3_Actionscript 3_Mouseevent - Fatal编程技术网

Actionscript 3 鼠标按下每帧触发一次,ActionScript 3

Actionscript 3 鼠标按下每帧触发一次,ActionScript 3,actionscript-3,mouseevent,Actionscript 3,Mouseevent,由于我是as3新手,我想实现一个机枪,在有弹药的情况下开火,然后按下触发器,在我的例子中,就是MouseEvent.MOUSE\u DOWN 问题是此事件只触发一次 我得到的最接近这一点的是MouseEvent.MOUSE\u MOVE,但当鼠标位置保持不变时,我的目的就失败了 编辑: 我需要每帧更新一次鼠标光标在收到MouseEvent.mouse\u DOWN事件时,运行while循环使机枪开火。循环在收到MouseEvent.MOUSE\u UP事件时中断。像这样的 private fun

由于我是as3新手,我想实现一个机枪,在有弹药的情况下开火,然后按下触发器,在我的例子中,就是
MouseEvent.MOUSE\u DOWN

问题是此事件只触发一次

我得到的最接近这一点的是
MouseEvent.MOUSE\u MOVE
,但当鼠标位置保持不变时,我的目的就失败了

编辑:


我需要每帧更新一次鼠标光标

在收到MouseEvent.mouse\u DOWN事件时,运行while循环使机枪开火。循环在收到MouseEvent.MOUSE\u 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();
}

编辑:为澄清起见,停止和开始射击功能是运行循环以保持机枪射击动画继续运行的功能。

添加射击动作以在按下鼠标时进入帧事件,并在启动鼠标时移除

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();
}

当按下
MouseEvent.MOUSE\u事件处理程序时,可以创建一个侦听
事件的事件侦听器。输入要调度的\u FRAME
事件。使用
事件。输入_FRAME
事件处理程序,您可以重复调用处理子弹射击的方法。以下是一个示例,我是根据在的示例建模的:

包
{
导入flash.display.Sprite;
导入flash.events.Event;
导入flash.events.MouseEvent;
[SWF(width=“500”、height=“500”、frameRate=“24”、backgroundColor=“0xFFFFFF”)]
公共类Main扩展了Sprite
{
私人var_枪:枪;
私有var_区间:int;
公共函数Main():void
{
if(stage)init();
else addEventListener(Event.ADDED_TO_STAGE,init);
}//端函数
私有函数init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
_枪=新枪();
_gun.x=stage.stageWidth/2-\u gun.width/2;
_gun.y=stage.stageHeight/2-_gun.height/2;
addChild(_gun);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onStageMouseDown);
}//端函数
私有函数onStageMouseDown(e:MouseEvent):无效
{
stage.addEventListener(Event.ENTER_FRAME,onstageInterframe);
stage.addEventListener(MouseEvent.MOUSE_UP,onStageMouseUp);
}//端函数
stageEnterFrame上的私有函数(e:事件):void
{
子弹();
}//端函数
私有函数shootBullet():void
{
如果(_间隔>5)
{
变量bullet:bullet=newbullet();
bullet.addEventListener(Event.ENTER_FRAME,onBulletEnterFrame);
bullet.x=_gun.x;
bullet.y=\u gun.y;
bullet.angleRadian=Math.atan2(stage.mouseY-_-gun.y,stage.mouseX-_-gun.x);
bullet.addEventListener(Event.ENTER_FRAME,onBulletEnterFrame);
addChild(子弹);
_间隔=0;//重置
}//如果结束
_区间++;
}//端函数
BulletEnterFrame上的私有函数(e:事件):void
{
变量子弹:子弹=子弹(如目标);
bullet.x+=数学cos(bullet.angleRadian)*bullet.SPEED;
bullet.y+=数学sin(bullet.angleRadian)*bullet.SPEED;
如果(bullet.x<0 | | bullet.x>500 | | bullet.y<0 | | bullet.y>500)
{
移除儿童(子弹);
bullet.removeEventListener(Event.ENTER_FRAME,onBulletEnterFrame);
}//如果结束
}//端函数
私有函数onStageMouseUp(e:MouseEvent):void
{
stage.removeEventListener(Event.ENTER_FRAME,onstagenterframe);
stage.removeEventListener(MouseEvent.MOUSE_UP,onStageMouseUp);
_间隔=0;
}//端函数
}//末级
}//端包
导入flash.display.Sprite;
内部类枪扩展精灵
{
公共功能枪()
{
图形填充(0x000000);
图形绘制圆(0,0,10);
graphics.endFill();
}//端函数
}//末级
内部类Bullet扩展了Sprite
{
公共弧度:数字;
公共施工速度:编号=10;
公共职能项目符号()
{
图形.线型(0x000000);
图形绘制圆(0,0,10);
graphics.endFill();
}//端函数
}//末级
感兴趣的是
onstagenterframe()
方法。有一个
if
语句检查
\u interval
属性的值是否大于5,如果大于5,则创建一个新的项目符号并发射,否则
\u interval
属性的值将递增。
\u interval
属性的目的是将要发射的子弹隔开

[更新]

下面是运行的示例flash应用程序的图像:




鼠标按钮被按住在右上角,因此子弹会朝该方向射出。

我必须定期这样做,而不是使用回车帧侦听器,我选择了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\u UP
上添加一个侦听器,调用
aim(event.stageX,event.stageY)
    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!');
    }