addEventListener()未检测到KEY_UP和KEY_DOWN

时间:2012-06-30 02:06:57

标签: actionscript-3 flash keyboard flash-cs5

我的完整代码是     import flash.events.KeyboardEvent;     import flash.events.Event;

//init some variables
var speedX = 0;
var speedY = 0;
msg.visible = false;
var curLevel = 2;
var level = new Array();
var flagVar;
var won = false;

//Adding level platforms
for(var i = 0; i < numChildren; i++) {
    if(getChildAt(i) is platform) {
        level.push(getChildAt(i).getRect(this));
    }
    if(getChildAt(i) is flag) { flagVar = getChildAt(i).getRect(this); }
}

//Checking key presses
var kUp     = false;
var kDown   = false;
var kLeft   = false;
var kRight  = false;
var kSpace  = false;

stage.addEventListener(KeyboardEvent.KEY_DOWN, kD);
stage.addEventListener(KeyboardEvent.KEY_UP, kU);

function kD(k:KeyboardEvent) {
    trace("Key down - " + k.keyCode);
    if(k.keyCode == 32) { kSpace    = true; }
    if(k.keyCode == 37 ) { kLeft    = true; }
    if(k.keyCode == 38) { kUp       = true; }
    if(k.keyCode == 39) { kRight    = true; }
}

function kU(k:KeyboardEvent) {
    trace("Key up - " + k.keyCode);
    if(k.keyCode == 32) { kSpace    = false; }
    if(k.keyCode == 37) { kLeft     = false; }
    if(k.keyCode == 38) { kUp       = false; }
    if(k.keyCode == 39) { kRight    = false; }
}

addEventListener(Event.ENTER_FRAME, loopAround);
function loopAround(e:Event) {

    //horizontal movement
    if(kLeft) {
        speedX = -10;
    } else if(kRight) {
        speedX = 10;
    } else {
        speedX *= 0.5;
    }

    player.x += speedX;

    //horizontal collision checks
    for(var i = 0; i < level.length; i++) {
        if(player.getRect(this).intersects(level[i])) {
            if(speedX > 0) {
                player.x = level[i].left - player.width;
            }
            if(speedX < 0) {
                player.x = level[i].right;
            }

            speedX = 0;
        }
    }

    //vertical movement
    speedY += 1;
    player.y += speedY;
    var jumpable = false;

    //Vertical collision
    for(i = 0; i < level.length; i++) {
        if(player.getRect(this).intersects(level[i])) {
            if(speedY > 0) {
                player.y = level[i].top - player.height;
                speedY = 0;
                jumpable = true;
            }
            if(speedY < 0) {
                player.y = level[i].bottom;
                speedY *= -0.5;
            }
        }
    }

     //JUMP!
    if((kUp || kSpace) && jumpable) {
        speedY=-20;
    }

    //Moving camera and other
    this.x = -player.x + (stage.stageWidth/2);
    this.y = -player.y + (stage.stageHeight/2);
    msg.x = player.x - (msg.width/2);
    msg.y = player.y - (msg.height/2);

    //Checking win
    if(player.getRect(this).intersects(flagVar)) {
        msg.visible = true;
        won = true;
    }

    //Check for next level request
    if(kSpace && won) {
        curLevel++;
        gotoAndStop(curLevel);
        won = false;
    }
}

有问题的部分是     //检查按键     var kUp = false;     var kDown = false;     var kLeft = false;     var kRight = false;     var kSpace = false;

stage.addEventListener(KeyboardEvent.KEY_DOWN, kD);
stage.addEventListener(KeyboardEvent.KEY_UP, kU);

function kD(k:KeyboardEvent) {
    trace("Key down - " + k.keyCode);
    if(k.keyCode == 32) { kSpace    = true; }
    if(k.keyCode == 37 ) { kLeft    = true; }
    if(k.keyCode == 38) { kUp       = true; }
    if(k.keyCode == 39) { kRight    = true; }
}

function kU(k:KeyboardEvent) {
    trace("Key up - " + k.keyCode);
    if(k.keyCode == 32) { kSpace    = false; }
    if(k.keyCode == 37) { kLeft     = false; }
    if(k.keyCode == 38) { kUp       = false; }
    if(k.keyCode == 39) { kRight    = false; }
}

昨晚工作正常,但今天我把它移到一个新的关键帧,现在它无法正常工作。我没有收到任何错误(即使我调试)。它只是不会移动角色,甚至不会显示在输出中。

我对as3还很新,所以我真的不知道该怎么做。

提前致谢。

编辑:稍微玩了一下之后,我发现它不起作用的原因是菜单。菜单有一个按钮和两个文本元素,很好。我在菜单上使用的代码是:

import flash.events.MouseEvent;

stop();

var format:TextFormat = new TextFormat();
format.size = 26;
format.bold = true;
playGameButton.setStyle("textFormat", format);

stage.addEventListener(MouseEvent.CLICK, playGame);
function playGame(e:MouseEvent) {
    if(e.target.name == "playGameButton") {
        gotoAndStop(2);
    }
}

如果我只使用gotoAndStop(2);它可以正常工作,但除了其他所有内容之外,它只会进入第二帧,之后没有其他任何工作。

编辑#2 :我已经将它缩小到if语句本身。

if(e.target == playGameButton)

if(e.target.name == "playGameButton")

这两个都不起作用。如果我只是将if语句一起删除它就可以完美地运行了。

3 个答案:

答案 0 :(得分:1)

似乎有这条线的问题

if(getChildAt(i) is platform)

导致错误1067:flash.display类型的值的隐式强制:MovieClip到不相关的类型

其余的代码似乎很好

答案 1 :(得分:0)

尝试禁用mouseChildren按钮。

playGameButton.mouseChildren = false;

答案 2 :(得分:0)

尝试使用e.currentTarget代替e.target。来自documentation

  

currentTarget:Object   [只读]使用事件侦听器主动处理Event对象的对象。

     

目标:对象   [只读]事件目标。

我不太确定这是你的问题,但target vs currentTarget之前的困惑让我感到困惑。