我在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);
}
一切都按预期工作,但是如何防止按住键时跳跃变量更新?我想要在半空中跳跃时向前推进(抱歉,如果我措辞不正确,这是我在这里的第一篇文章)
您根本不检查释放的键,并且您的机制看起来需要在释放跳跃键时发生触发,以便准备您的游戏逻辑以正确地对“双跳”做出反应。我说你重新编程你的
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侧碰撞应采用相同的速度控制;如果你向左移动,你不应该控制右侧是否与墙壁相撞。
此外,您可能应该有另一个变量,该变量取决于您的玩家是否在半空中,这与您的“跳跃”分开,这也将简化您的游戏编码逻辑。