按键时导致我的角色延迟响应的错误是什么?

时间:2016-01-03 20:00:22

标签: actionscript-3 flash actionscript

我的角色的步行命令有些问题。它在实际移动之前会稍微延迟移动。然后有时它完全忽略了当我释放钥匙时停止行走的命令。

代码:

import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;

hero.gotoAndStop(1);

var rightPressed: Boolean = new Boolean(false);
var leftPressed: Boolean = new Boolean(false);
var upPressed: Boolean = new Boolean(false);
var downPressed: Boolean = new Boolean(false)
var heroSpeed: Number = 10;
var keys: Array = [];

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(Event.ENTER_FRAME, gameLoop);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

function keyDownHandler(KeyEvent: KeyboardEvent): void {
    if (keys[Keyboard.RIGHT]) {
        rightPressed = true;
    } else if (keys[Keyboard.LEFT]) {
        leftPressed = true;
    } else if (keys[Keyboard.DOWN]) {
        downPressed = true;
    } else if (keys[Keyboard.UP]) {
        upPressed = true;
    }
}

function keyUpHandler(KeyEvent: KeyboardEvent): void {
    if (keys[Keyboard.RIGHT]) {
        rightPressed = false;
        hero.gotoAndStop(4)
    } else if (keys[Keyboard.LEFT]) {
        leftPressed = false;
        hero.gotoAndStop(2)
    } else if (keys[Keyboard.DOWN]) {
        downPressed = false;
        hero.gotoAndStop(1);
    } else if (keys[Keyboard.UP]) {
        upPressed = false;
        hero.gotoAndStop(3);
    }
}

function gameLoop(loopEvent: Event): void {
    if (rightPressed) {
        hero.x += heroSpeed;
        hero.gotoAndStop(8)
    }
    if (leftPressed) {
        hero.x -= heroSpeed;
        hero.gotoAndStop(6)
    }
    if (downPressed) {
        hero.y += heroSpeed;
        hero.gotoAndStop(5);
    }
    if (upPressed) {
        hero.y -= heroSpeed;
        hero.gotoAndStop(7);
    }
}
function onKeyDown(e: KeyboardEvent): void {
    keys[e.keyCode] = true;
}

function onKeyUp(e: KeyboardEvent): void {
    keys[e.keyCode] = false;
}

警告:

Scene 1, Layer 'Actions', Frame 1, Line 68, Column 10   Warning: 1090: Migration issue: The onKeyDown event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0.  You must first register this handler for the event using addEventListener ( 'keyDown', callback_handler).

Scene 1, Layer 'Actions', Frame 1, Line 72, Column 10   Warning: 1090: Migration issue: The onKeyUp event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0.  You must first register this handler for the event using addEventListener ( 'keyUp', callback_handler).

1 个答案:

答案 0 :(得分:0)

您应该删除两个额外的KeyboardEvent处理程序(onKeyUponKeyDown),并将您在那里的代码移到keyUpHandlerkeyDownHandler 。这将解决那些迁移警告(因为onKeyUp和onKeyDown是AS2中的特殊方法),它可能是你的另一个问题的解决方案:我猜有时onKeyDown处理程序会在keyDownHandler之后执行,这意味着数组中的布尔值尚未设置,也不会开始移动。

更好的是:也可以用布尔(和键!你正在滥用数组用于字典)来摆脱数组,并按照这样做:

function keyDownHandler(KeyEvent: KeyboardEvent): void {
    if (event.keyCode==Keyboard.RIGHT]) {
        rightPressed = true;
    }
    //etc    
}