Timer.start()似乎在As3中不起作用

时间:2014-02-11 03:19:56

标签: actionscript-3 if-statement timer keyboard

我正在尝试测量一次按下向上/向下键的时间。函数timerDownHandler和timerUpHandler应该负责启动和重置定时器。两个函数中都有跟踪语句,指示何时开始按住键以及何时放开。这很好地证明了if语句正常工作。但是,当我试图追踪时间上的差异时,我总是得到零。这似乎与计时器根本没有开始有关。提前谢谢。

包{

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.utils.Timer;

public class Player extends MovieClip {

    private var up:Boolean = false; 
    private var down:Boolean = false;
    private var accelTimer:Timer; 
    private var accelTimerStart:Boolean = false;
    private var accelTimeDif:int = 0;
    private var deccelTimer:Timer;
    private var deccelTimerStart:Boolean = false;
    private var deccelTimeDif:int = 0;
    private var gravity:int = 5;
    private var acceleration:int = 3;
    private var power:int = 5;

    public function Player() {

        init();
    }

    private function init() {

        accelTimer = new Timer(10);
        deccelTimer = new Timer(10); 
        parent.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
        parent.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
    }

    public function update() {

        timerUpHandler();
        timerDownHandler();
        movementHandler();
        deccelTimeDif == deccelTimer.currentCount;
        accelTimeDif == accelTimer.currentCount;

        trace(deccelTimeDif);
    }

    private function movementHandler():void {

        if (up == true) {

            y = y - 10 * Math.pow(accelTimeDif, 2);
        }

        if (down == true) {

            y = y + 10 * Math.pow(deccelTimeDif, 2);
        }
    }

    private function keyDownHandler(k:KeyboardEvent) {

        if (k.keyCode == 38) {

            up = true;
        }

        else if (k.keyCode == 40) {

            down = true;
        }
    }

    private function keyUpHandler(k:KeyboardEvent) {

        if (k.keyCode == 38) {

            up = false;
        }

        else if (k.keyCode == 40) {

            down = false;
        }
    }

    private function timerUpHandler() {

        if (up == true && accelTimerStart == false) {

            trace("Started");
            accelTimer.start();
            accelTimerStart = true;
        }

        else if (up == false && accelTimerStart == true) {

            trace("Stoped");
            accelTimer.stop();
            accelTimer.reset();
            accelTimerStart = false;
        }
    }

    private function timerDownHandler() {

        if (down == true && deccelTimerStart == false) {

            trace("Started");
            deccelTimer.start();
            deccelTimerStart = true;
        }

        else if (down == false && deccelTimerStart == true) {

            trace("Stoped");
            deccelTimer.stop();
            deccelTimer.reset();
            deccelTimerStart = false;
        }
    }
}

}

2 个答案:

答案 0 :(得分:0)

我认为你可以实现这一目标并提高效率的方法是在keyDown上节省时间。

var downtime = new Date().getTime()

On keyUp比较两者,并以ms为单位按下时间。

var totaltime = new Date().getTime() - downtime

希望这有用。

答案 1 :(得分:0)

您不能从任何地方拨打update()。一旦你开始拨打电话,你的时差会显示一些东西。但是,您必须知道在AS3中,定时器的启动速度永远不会超过每帧一次,因此您的定时器应该比帧速率慢,或者您应该用输入帧事件监听器替换它们。

要调用update(),请在构造函数中使用它:

addEventListener(Event.ENTER_FRAME,update);

并像对待任何其他事件侦听器一样声明该函数。

function update(e:Event):void {...}