我是网络编程的新手,我偶然发现了一个我无法解决的问题,我不确定它是否可以解决。我创造了一个非常简单的游戏"使用jquery,我想让线程停止等待(keydown)输入并继续执行代码,这样我就可以执行简单的向上"跳转"或者"左跳" /"右跳"。可以吗?
以下是我迄今为止所做的代码:
http://www.codecademy.com/pt/pySlayer10761/codebits/OYQ11a/edit
答案 0 :(得分:1)
你需要一个独立于你的keydown处理程序运行的游戏循环。否则,任何可能入侵keydown处理程序的动画都可能在没有输入的情况下停止。
通过查看你的代码,我可以看到你试图通过在那些keydowns上创建一个新的setTimeout()来实现它。您正在为每个触发的keydown事件创建此项。如果引擎没有意识到你一次又一次地创建了相同的超时,那很可能会在某些时候崩溃/冻结你的浏览器。
这样做:在onkeydown处理程序中,您只需将变量keydowncode
设置为键码值。然后你创建一个像这样的新游戏循环
<script>
var keydownCode = 0;
var isInAnimation = false;
var animatedKeydownCode = 0;
var animationStartTime = 0;
var animationStartValue = 0;
// Lightweight keydown handler:
$(document).keydown(function(key) {
keydownCode = parseInt(key.which,10);
}
$(document).keyup(function(key) {
keydownCode = 0;
}
function animation() {
// here comes your animation logic..
// e.g. keep moving for 100 to 200 milliseconds after keypress
// Milli secs difference from
var nowTime = Date.now();
// Animations get prioritized: Only one animation at the same time!
if(isInAnimation) {
switch(animatedKeydownCode) {
case 37:
var delta = (nowTime-animationStartTime)/100*10;
if(delta > 10) { delta = 10; isInAnimation = false; }; // Animation over!
$('img').left(animationStartValue-delta);
case 37:
var delta = (nowTime-animationStartTime)/200*10;
if(delta > 10) { delta = 10; isInAnimation = false; }; // Animation over!
$('img').top(animationStartValue-delta);
case 39:
var delta = (nowTime-animationStartTime)/100*10;
if(delta > 10) { delta = 10; isInAnimation = false; }; // Animation over!
$('img').left(animationStartValue+delta);
}
// Ready to take new input, if its not outdated
} else {
// If some key is down and no animations active
if(keydownCode > 0) {
switch(keydownCode) {
case 37:
animationStartTime = nowTime;
animatedKeydownCode = keydownCode;
animationStartValue = $('img').left();
isInAnimation = true;
case 38:
// Only start a jump if on bottom
if($('img').css("top") == '390px') {
animationStartTime = nowTime;
animatedKeydownCode = keydownCode;
animationStartValue = $('img').top();
isInAnimation = true;
}
case 39:
animationStartTime = nowTime;
animatedKeydownCode = keydownCode;
animationStartValue = $('img').left();
isInAnimation = true;
}
}
}
window.requestAnimationFrame(animation);
}
window.requestAnimationFrame(animation);
</script>
这不是完整的游戏,你需要自己调整才能获得正常的游戏。例如。如果没有输入,你可能想要添加一些引力来再次降低马里奥。
答案 1 :(得分:0)
我认为您正在寻找setTimeout()
。
像这样:
setTimeout(function(){
// do something here which will be executed after 5 seconds.
},5000);
你不能在javascript中停止一个线程,因为它是单线程的。