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



我正在尝试测量一次按下向上/向下键的时间。函数 timerDownHandler 和 timerUpHandler 应该负责启动和重置计时器。这两个函数中都有 trace 语句,指示您何时开始握住密钥以及何时松开。这工作正常,证明 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;
        }
    }
}

}

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

var downtime = new Date().getTime()

在 keyUp 上比较两者并按下以毫秒为单位的时间。

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

希望这是有帮助的。

您不会从任何地方呼叫update()。一旦你开始调用那里,你的时差变量就会显示一些东西。但是,您必须知道,在 AS3 中,计时器每帧的触发速度永远不会超过一次,因此计时器应该比帧速率慢,或者应该将它们替换为 enter 帧事件侦听器。

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

addEventListener(Event.ENTER_FRAME,update);

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

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

最新更新