对角线移动不工作,左长按/右同时发出
但在双按键的船疯了!
$(document).bind('keydown', function(e) {
var box = $("#plane"),
left = 37,
up = 38,
right = 39,
down = 40
if (e.keyCode == left) {
box.animate({left: "-=5000"},3000);
}
if (e.keyCode == up) {
box.animate({top: "-=5000"},3000);
}
if (e.keyCode == right) {
box.animate({left:"+=5000"},3000);
}
if (e.keyCode == down) {
box.animate({top: "+=5000"},3000);
}
});
$(document).bind('keyup', function() {
$('#plane').stop();
});
3条答案
按热度按时间nle07wnf1#
我搞了一个类似的事情,这里有一个解决方案,我遇到的工程。
Demo
延迟的问题似乎是大多数浏览器将接受第一个输入(在keyDown上),然后在一遍又一遍地运行函数之前有半秒的延迟。如果我们不调用keydown函数,而是用一个区间检查一个关联数组,在这个数组中我们存储了哪些键被按下,这似乎可以平滑移动。它还允许同时按下多个键,这意味着对角线移动。然后我们将使用keyup事件删除相应的键。
在这个解决方案中,你有两种方法来管理你移动的元素的速度。
1.间隔的更新频率。(以上演示中为20 ms)
1.平面每次移动的像素计数。(5在上面的演示)
我发现20毫秒的间隔频率给你相当平稳的运动。
我意识到这是一个非常古老的线程,但我想我会贡献无论如何。
e5nszbig2#
关于那段时间,
http://jsfiddle.net/fbFuW/21/
31moq8wy3#
依靠键盘事件来移动元素将使其依赖于操作系统按键间隔延迟。相反,使用游戏间隔并检查存储在对象中的按键
在
keydown keyup
事件中,如果event.which
返回的keyCode是>=37 && <=40
,则表示使用了箭头键。在K
(keys)Object中存储key-number属性的布尔值。间隔:
在
window.requestAnimationFrame
中,如果key-number属性(在我们的K
对象中)是true
(if(K[37])
),则增加或减少元素的x
,y
位置。对角线移动:
同时使用对角移动元素,即。↑和→需要对对角线距离进行补偿:
1 / Math.sqrt(2)
(0.7071..)或者这里有一个轻微的翻拍,使用
new Set()
来记录当前按下的键盘键,new Map()
为每个按下的键注册功能: