我正在尝试测量一次按下向上/向下键的时间。函数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;
}
}
}
}
答案 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 {...}