如果在动作脚本中按住键盘事件的键,如何防止键盘事件重复?

问题描述 投票:0回答:1

我在as3中制作了一个小Flash游戏,我希望角色在半空中跳跃时“加速”前进,但是即使按住向上箭头,我和我的朋友也会更新跳跃变量

import flash.events.KeyboardEvent;
import flash.events.Event;
level.gotoAndStop(1);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
stage.addEventListener(Event.ENTER_FRAME, gameLoop);

var speedX = 0;
var speedY = 10;
var keys = [];
var jumping = true;
player.gotoAndStop(1);

function gameLoop(event:Event):void {
    speedX = 0;
    
    if (player.x > 550) {
        level.nextFrame();
        player.x = 0
    }
    if (player.x < 0) {
        level.prevFrame();
        player.x = 500
    }
    
    for(var i:Number = 0; i < keys.length; i++) {
        
        switch(keys[i]) {
            case 38: // Up arrow key
                if(jumping){
                    player.gotoAndStop(3);
                    speedX = 10 * player.scaleX;
                    break;
                } 
                speedY = -16;
                jumping = true;
                break;
            
            case 37: // Left arrow key
                speedX -= 5;
                player.scaleX = -1;
                player.gotoAndStop(2);
                   break;
            
            case 39: // Right arrow key
                speedX += 5;
                player.scaleX = 1;
                player.gotoAndStop(2);
                break;
        }
    }
    if(speedX == 0) player.gotoAndStop(1);
    player.x += speedX;
    player.y += speedY;
    speedY++;
    while(level.hitTestPoint(player.x, player.y + player.height / 2, true)) {
        player.y--; // Place player above the floor
        speedY = 0; // Reset vertical speed
        jumping = false;
    }
    while(level.hitTestPoint(player.x + player.width / 2, player.y, true)) {
        player.x--; // Place player above the floor
        speedX = 0; // Reset vertical speed
    }
    while(level.hitTestPoint(player.x - player.width / 2, player.y, true)) {
        player.x++; // Place player above the floor
        speedX = 0; // Reset vertical speed
    }
}

function keyDown(event:KeyboardEvent):void {
    if(keys.indexOf(event.keyCode) == -1) keys.push(event.keyCode);
}

function keyUp(event:KeyboardEvent):void {
    var index:Number = keys.indexOf(event.keyCode);
    if(index != -1) keys.splice(index, 1);
}

一切都按预期工作,但是如何防止按住键时跳跃变量更新?我想要在半空中跳跃时向前推进(抱歉,如果我措辞不正确,这是我在这里的第一篇文章)

variables actionscript-3 controls
1个回答
0
投票

您根本不检查释放的键,并且您的机制看起来需要在释放跳跃键时发生触发,以便准备您的游戏逻辑以正确地对“双跳”做出反应。我说你重新编程你的

gameLoop
“forkeys”循环来直接检查所有键(然后最好将键存储在静态数组中,所以你可以说查询
keys[KEY_JUMP]
来跳转处理逻辑,而还允许您停止对键进行硬编码),并根据键的状态进行操作;假设如果按下跳跃键,并且角色站在地面上,则您将启动“第一次跳跃”,如果在跳跃中释放,则将玩家状态更改为“跳跃结束”,并根据游戏逻辑的需要处理后续的按下操作。

您的代码中还有另一个错误 - 您尝试将玩家重新定位到每帧“地板上方”,即使仍然没有地板可击中并且玩家向上移动;如果玩家的

speedY
为 0 或更高(即玩家向下移动),则只需检查“向下”碰撞;否则,您的碰撞检测会在玩家跳起的第一帧时触发,并立即重置其位置和速度。它可能应该是:

if (speedY > 0) while(level.hitTestPoint(player.x, player.y + player.height / 2, true)) {
    player.y--; // Place player above the floor
    speedY = 0; // Reset vertical speed
    jumping = false;
}

X侧碰撞应采用相同的速度控制;如果你向左移动,你不应该控制右侧是否与墙壁相撞。

此外,您可能应该有另一个变量,该变量取决于您的玩家是否在半空中,这与您的“跳跃”分开,这也将简化您的游戏编码逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.