以下是我的问题:http://testepi.kvalitne.cz/test/
我不希望按键和广场的移动之间的延迟。我还想知道如何对角移动(同时按下两个键)。
我的代码:
$(function(){
document.addEventListener("keydown", move, false);
var x = 0;
var y = 0;
function move(event){
if(event.keyCode==37){
x -= 10;
$("#square").css("left", x);
}
if(event.keyCode==39){
x += 10;
$("#square").css("left", x);
}
if(event.keyCode==38){
y -= 10;
$("#square").css("top", y);
}
if(event.keyCode==40){
y += 10;
$("#square").css("top", y);
}
}
});
答案 0 :(得分:4)
首先,为了避免按键/重复延迟,您必须将程序包装在一个循环中,并使该循环范围内的键盘状态可用,其次要监视您需要跟踪个别的多个按键keydown和keyup事件:
var x = 0;
var y = 0;
// store the current pressed keys in an array
var keys = [];
// if the pressed key is 38 (w) then keys[38] will be true
// keys [38] will remain true untill the key is released (below)
// the same is true for any other key, we can now detect multiple
// keypresses
$(document).keydown(function (e) {
keys[e.keyCode] = true;
});
$(document).keyup(function (e) {
delete keys[e.keyCode];
});
// we use this function to call our mainLoop function every 200ms
// so we are not relying on the key events to move our square
setInterval( mainLoop , 200 );
function mainLoop() {
// here we query the array for each keyCode and execute the required actions
if(keys[37]){
x -= 10;
$("#square").css("left", x);
}
if(keys[39]){
x += 10;
$("#square").css("left", x);
}
if(keys[38]){
y -= 10;
$("#square").css("top", y);
}
if(keys[40]){
y += 10;
$("#square").css("top", y);
}
}
答案 1 :(得分:1)
如果你试图实现类似游戏的2D精灵运动,我建议你有一个x和y速度的概念,而不是在按键上将精灵移动一个固定的数量。
所以在按键时,加上或减去x或y的速度。
var xvel = 0,
yvel = 0,
x = 0,
y = 0;
setInterval(function () {
y += yvel;
x += xvel;
$("#square").css("left", x);
$("#square").css("top", y);
}, 16); //run an update every 16 millis
document.addEventListener("keydown", move, false);
function move(event){
if(event.keyCode==37){
xvel -= 10;
}
if(event.keyCode==39){
xvel += 10;
}
if(event.keyCode==38){
yvel -= 10;
}
if(event.keyCode==40){
yvel += 10;
}
}
然而,你还需要担心一个keyup事件,因为速度会一直持续到你取消它为止。
您可以使用setInterval
每x毫秒更新一次精灵的位置。 (游戏勾号)
要对角移动,只需同时加上/减去x和y的速度。
这只是一个例子,但有更多关于精灵运动的例子。
答案 2 :(得分:0)