即时创建一个简单的2D游戏,我希望将keydown键保存到数组中,并在循环中执行它们,这样用户就可以按住一个键,使其看起来像是一个不停的移动。
我有一个setInterval函数,就像游戏Timer一样,它只是一直循环自我。我添加了一个监听器和一个数组来保存密钥。
我检查了数组中的键,看起来很好但是,函数moveRight和moveLeft不能用于某些共鸣。
这是代码:
this.keysPressed = new Array();
InitGameLoop: function () {
var that = this;
setInterval(function () {
$(document).keydown(function (e) {
var key = e.which;
that.keysPressed.push(key);
for (var i = 0; i < that.keysPressed.length; i++) {
if (that.keysPressed[i] == 38) {
that.moveRight(worldWidth, 10);
}
else if (that.keysPressed[i] == 37) {
that.moveLeft(10);
}
log(that.keysPressed, that.yPos);
that.keysPressed.pop();
}
});
}, 60);
我的问题是:
(对不起我的英文)
答案 0 :(得分:1)
不是将按下的键存储在数组中,使每个键代码激活“移动”数组中的相关变量。例如按下左键时,movement['left']=1
。使用keyup
将其重新设置为0.
让你的循环检查数组中每个可能的移动,并在corelance中触发相关的函数,以便在给定时刻进行主动移动。
答案 1 :(得分:1)
在setInterval中注册eventhandler总是错误的。在您的情况下,您每60毫秒创建一个额外的侦听器,当您按下某个键时,所有侦听器都将触发。此外,绝对不需要将它们存储在数组中。只需注册一次监听器,每按一次键就会触发。如果按下多个键,则监听器将单独触发每个键。
$(document).keydown(function (e) {
var key = e.which;
console.log(key);
// call your according functions here
switch (key){
case 37: // moving left
// do stuff
// set a flag to indicate that you are moving left
moveleft = true;
break;
case 39: // moving right
// do stuff
// set a flag to indicate that you are moving right
moveright = true;
break;
}
});
由于你正在捕获keydown,你应该设置标志。这样您就可以跟踪当前按下的键。在keyup上,你再次重置这些标志(需要另一个事件处理程序)。