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
Performance AS3按住鼠标向下以增加速度/功率_Performance_Actionscript 3_Timer_Mousedown - Fatal编程技术网

Performance AS3按住鼠标向下以增加速度/功率

Performance AS3按住鼠标向下以增加速度/功率,performance,actionscript-3,timer,mousedown,Performance,Actionscript 3,Timer,Mousedown,这就是我想要完成的 点击电影剪辑(cannon_mc) 正在发射一发子弹(球) 鼠标落下的时间越长,发射球的速度应该越快。 我的问题是 实现这一目标最有效的方法是什么? 用定时器或类似的东西 var isMouseDown:Boolean = false; var speed= 10; myCannon.addEventListener(MouseEvent.MOUSE_DOWN,buttonPressed); function buttonP

这就是我想要完成的

点击电影剪辑(cannon_mc) 正在发射一发子弹(球)

鼠标落下的时间越长,发射球的速度应该越快。 我的问题是

实现这一目标最有效的方法是什么? 用定时器或类似的东西

    var isMouseDown:Boolean = false;
    var speed= 10;    

    myCannon.addEventListener(MouseEvent.MOUSE_DOWN,buttonPressed);

        function buttonPressed(event:MouseEvent){
            //trace("down");
            isMouseDown == true;

            if(isMouseDown == false)
            {
                speed == +1
            }

        }

鼠标按下事件仅触发一次。要获得想要的效果,您需要MOUSE\u DOWN和MOUSE\u UP事件处理程序的组合

您可以在MOUSE_DOWN事件中将变量与flash.utils.getTimer()中的当前时间戳一起设置为true

然后在MOUSE_UP上,如果在MOUSE_DOWN中设置的变量为true,则计算经过的时间并相应地设置功率

例如:

var isMouseDown:Boolean = false;
var mouseDownBegin:int;
var speed = 10; 
var speed_inc = 2; // give it in per second
var speed_max = 100; // max speed possible

// add event handlers
myCannon.addEventListener(MouseEvent.MOUSE_DOWN, buttonPressed);
myCannon.addEventListener(MouseEvent.MOUSE_UP, buttonReleased);

function buttonPressed(event:MouseEvent){
    isMouseDown = true;
    mouseDownBegin = flash.utils.getTimer();
}

function buttonReleased(event:MouseEvent){
    if(isMouseDown == true){
        // get time between press and release
        var timeElapsed = flash.utils.getTimer() - mouseDownBegin;

        // reset isMouseDown
        isMouseDown = false;

        // compute speed
        speed += int(Math.floor(speed_inc * (timeElapsed / 1000.0)));
        speed = Math.min(speed, speed_max);

        // code to fire ball with new speed
        // .......
    }
}
您还可以添加一个ENTER_FRAME事件,并为功率计或其他视觉效果设置动画

更新
正如阿斯曼所指出的,
MOUSE\u UP
如果在舞台外拖动并释放鼠标,则不会触发事件。要处理这种情况,请为
MOUSE\u LEAVE
事件添加事件侦听器,并将回调作为buttonReleased函数的副本,但该函数接受一个事件对象:

function buttonReleasedOutsideStage(event:Event){
    if(isMouseDown == true){
        // get time between press and release
        var timeElapsed = flash.utils.getTimer() - mouseDownBegin;

        // reset isMouseDown
        isMouseDown = false;

        // compute speed
        speed += int(Math.floor(speed_inc * (timeElapsed / 1000.0)));
        speed = Math.min(speed, speed_max);

        // code to fire ball with new speed
        // .......
    }
}
stage.addEventListener(Event.MOUSE_LEAVE, buttonReleasedOutsideStage);
(在非常短的伪代码中)
编写一些事件处理程序:

  • onMouseDown:将标志
    \u mouseDown
    ,将
    电源设置为零
  • onFrame:
    if(_mouseDown)power++
  • onMouseUp:清除标志
    \u mouseDown
    并使用累计
    功率发射球
帧率独立版本:

  • onMouseDown:
    \u loadStart=getTimer()_mouseDown=true_功率=0
  • onFrame:
    if(_mouseDown)delta=getTimer()-_loadStart_功率+=增量
  • onMouseUp:用
    \u power
    射出球,
    \u mouseDown=false

这可能是我要怎么做的,但是我会把鼠标放在舞台外面。你是正确的,如果鼠标被拖放在舞台之外,事件就不会发生。要处理此情况,请为
MOUSE\u LEAVE
事件添加事件侦听器,并将回调作为相同的按钮释放函数谢谢您的回答和解释很高兴能提供帮助。此外,如果这回答了您的问题,请将其标记为接受答案。有任何答案解决了您的问题吗?如果是,请考虑将最有用的答案标记为已接受的答案。如果需要,请毫不犹豫地寻求进一步的帮助。