gpt4 book ai didi

javascript - 在javascript中排队一个片段?

转载 作者:行者123 更新时间:2023-11-30 10:36:02 24 4
gpt4 key购买 nike

我需要对片段进行排队并在给定时间(每秒一次)执行它们。这些片段实际上是玩家的 Action ,例如 jump()、attack()、walk('left') 等。

当用户按下一个键时,我需要将他的操作排队并每秒执行一次所有操作。

现在我的方法是将每个片段添加到一个数组并使用 eval() 循环遍历它,因为没有更好的主意。这是我的代码:

var queue = [];

// On player or AI action
queue.push('attack()'); // Could be walk('left'), jump() etc.

// On new frame
for(var i=0;i<queue.length;i++){
eval(queue[i]);
}
queue = [];

我确定我的方法很糟糕,但我想澄清我想做什么,我想这样的问题并不少见。有任何信息/想法吗?

最佳答案

可怕的——eval是邪恶的。相反,使用 closures :

var queue = [];

queue.push(function() { attack(); });

while (queue.length) {
queue.shift().call();
}

这是一般情况,但在这种情况下可以简化:function() { attack(); 是一种更复杂和更慢的编写 attack 的方法,所以 queue.push(attack) 也可以工作(如果你有一个 function attack() { ... } 定义在可访问的地方)。显然,如果您的函数采用参数(或者更确切地说,如果每个函数采用不同的参数;您可以在 call(thisobj, param) 调用中提供统一的参数列表),则您不能这样做。

编辑您的附加查询:

在您编写的代码中,这应该已将变量捕获到闭包中;如果您更改变量,该值将是您执行它时将获得的值。如果你有 undefined,我猜你稍后在某处执行了 closerEnemy = undefined。这是一个常见的错误来源,例如,人们试图将点击处理程序绑定(bind)到循环中的多个元素,并在处理程序中使用循环计数器 - 处理程序捕获计数器而不是它的值,并且总是在以后计算到元素的数量(循环结束时它留下的最后一个值)。

要捕获值而不是变量,请使用这个技巧:

(function(capturedCloserEnemy) {
queue.push(function() {
attack(capturedCloserEnemy);
});
})(closerEnemy);

(变量的命名不同只是为了便于阅读;它们可以全部命名,这无关紧要,因为有阴影。)

关于javascript - 在javascript中排队一个片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13966092/

24 4 0
文章推荐: Java:获取键集值
文章推荐: java - 返回类型 ResponseEntity 和 ResponseEntity 和 ResponseEntity 有什么区别