0

我在 Crafty 中使用以下代码。0.5.3(因为 Crafty 0.5.4,我的游戏因未知原因而崩溃,nvm,我对crafty0.5.3 还好,至少现在......)让我的玩家移动 4px 8 次(使其完整32px)但是很慢,通过使用超时,我想每次循环延迟 3 毫秒......循环(?)这样我就可以有 24 毫秒的延迟,这应该与我的动画一起设置。

以下是我正在使用的代码,putMessage 是在我已经制作的消息框中显示一些消息的函数,该函数中的第一个参数是消息,第二个是布尔值,它告诉是否应该将其添加到消息框中(msg += value )或应该替换味精(只有味精=值)

    moveLeft: function() {
    for (var i = 0; i < 8; i++) {
        setTimeout(function() {
                var d= new Date();
                putMessage(i+1 + "result : " + d.getSeconds() + "." + d.getMilliseconds() + "<br/ >", true);
                this.move('w',4);
                this.borderCheck();
                putMessage(d.getSeconds() + "." + d.getMilliseconds() + "<br>", true);
        }, 3)
    }
  },

这是消息框中的结果,请不要考虑 1digit 后的毫秒数。
9结果:49.493
9结果:49.493
9结果:49.493 9
结果:49.509 9
结果:49.509 9
结果:49.509 9
结果:49.509
9结果:49.509

看到'9',为什么有 9,因为我想,应该有像 1result、2result、....8result、....9 这样的值。9 不应该在任何地方..而第二个 putMessage 似乎没有工作....玩家都没有被移动。但是如果删除 setTimeout() 之类的,

moveLeft: function() {
    for (var i = 0; i < 8; i++) {
        var d= new Date();
            putMessage(i+1 + "result : " + d.getSeconds() + "." + d.getMilliseconds() + "<br/ >", true);
            this.move('w',4);
            this.borderCheck();
            putMessage(d.getSeconds() + "." + d.getMilliseconds() + "<br>", true);
    }
  },

the result obtained in message box is,
1result : 36.176
36.176
2result : 36.176
36.176
3result : 36.176
36.176
4result : 36.176
36.176
5result : 36.192
36.192
6result : 36.192
36.192
7result : 36.192
36.192
8result : 36.192
36.192

看?完美....更重要的是,玩家移动..!

那么 setTimeout 实际上做了什么......顺便说一句,它在另一个地方工作正常,所以它是否设置了任何限制,比如只执行前 2 行代码之类的?

请帮忙,我对这种语言还很陌生。

先谢谢了

编辑:我在 for 循环之前添加以下行后解决了它

intPlayer = this; //intPlayer = internalPlayer;

然后我用“intPlayer.move”和“intPlayer.borderCheck()”改变了“this.move”和“this.borderCheck()”......事情变得很好......

有人可以解释为什么吗?

4

1 回答 1

0

要回答为什么上下文setTimeout不同:
setTimeout 函数将您的回调函数保存到队列中。时机成熟时,将调用回调函数。问题是您的回调函数的上下文丢失了 - 它不知道您从哪个对象调用 setTimeout,因此它无法调用this设置为上述对象的回调函数。
取自MDN 的 setTimeout文档页面。

于 2014-01-31T23:51:16.893 回答