将键关闭保存在数组中并执行
save keydown in array and executes
im 创建一个简单的 2D 游戏,我想将键下键保存到数组中,并在循环中执行它们,这样用户就可以按住一个键并使其看起来像图表器在不停地移动。
我得到了一个 setInterval 函数,它就像一个游戏计时器,它一直都是自己循环的。 我添加了一个侦听器和一个数组来保存密钥。
我检查了数组内的键,它看起来不错,但是,函数 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);
我的问题是:
- 我在做什么?
- 这是个好主意吗?(如果没有,请随时向我推荐另一个:))
(对不起我的英语)
在 setInterval 中注册事件处理程序总是错误的。在您的情况下,每 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;
}
});
由于您正在捕获键,因此您应该设置标志。通过这种方式,您可以跟踪当前按下了哪些键。在 keyup 上,您将再次重置这些标志(为此需要另一个事件处理程序)。
与其将按下的键存储在数组中,不如让每个键代码激活"移动"数组中的相关变量。 例如,当按下左键时,movement['left']=1
.使用 keyup
将其设置回 0。
让你的循环检查数组中每个可能的移动,并在给定时刻触发相关函数到活动运动。
相关文章:
- JavaScript:只有当数组中的所有项都为true时才执行函数
- 如果数组仍在执行,async.forEach()将运行我添加到数组中的新元素
- Var工作,但在使用数组执行相同操作时停止
- 执行过滤对象数组的方法
- 使用数组表示法对多个字段执行jQuery日期选择器
- Bluebird中承诺链数组的串行执行
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- 如何对jquery数组中的项执行函数
- Promise和Promise.all(数组)在数组实现之前执行
- 如何在不选择模式配置参数的情况下,使用mongoose在MongoDB模式实例化中的关联数组/对象中执行foreach
- 如何按顺序执行承诺数组
- 对javascript对象数组执行数学运算
- 从JavaScript数组执行多个回调
- 关联数组执行起来像散列表吗?
- 在Javascript中对Integer数组执行计算
- 获取setInterval以根据数组执行一定次数的操作
- 函数数组-执行单个函数
- 对array构造函数创建的未定义数组执行forEach操作
- 为什么我在为带有 parse.com 的数组执行 fetchAll 时出现错误
- JavaScript引擎是否对多维数组执行任何优化