重叠的关键事件
Overlapping key events
我正在做一个有趣的HTML/JavaScript/CS3小项目。我基本上是在尝试制作一个可以在浏览器窗口中滚动的轮子。为了控制轮子,我对光标键使用了keyup和keydown事件(左右转动轮子,上下滚动)。
到目前为止,它运行得很好,但有两个主要故障。假设我想向前滚动轮子,不停地想向右转动一点,然后我会一直按下向上键并按下右光标键。当我这样做的时候,在它记录两个事件并继续滚动之前,运动会暂停。
这是问题之一,主要的问题是,一旦我执行了上一个动作,然后轮子处于理想的角度,如果我放开右光标键,浏览器会将两个键都注册为释放,轮子就会静止不动。以下是它的jsFiddle:http://jsfiddle.net/UKqwu/1/.我知道代码一团糟,但这是一次正在进行的工作/学习经验,我只编程了一个月左右。
无论如何,谢谢你的帮助。据我所知,目前它只能在Chrome中工作。在这个阶段,我并没有真正费心去解决兼容性问题。
因此,所发生的事情本质上是操作系统内置的限制,但有一个简单的解决方案。首先我将解释限制,然后是解决方法。
如果你(在文本框中)按住"j"按钮,首先会出现一个"j",然后在短时间延迟后,会出现许多"j"
这和你遇到的问题是一样的。事件启动一次,等待片刻,然后再启动多次。
然而,解决方案很简单。与其让你的轮子在事件发生时移动。。。让它不断更新,并分别跟踪哪些关键点是向上或向下的。
密钥处理程序看起来像这样。。。
function KeyHandler() {
this.left = false;
this.right= false;
...
function onKeyDown(e) {
if (e.keyCode == 37) {
this.left = true;
}
...
}
function onKeyUp(e) {
if (e.keyCode == 37) {
this.left = false;
}
...
}
}
(你可以将密钥处理程序连接到主体或任何你想要的元素)
你的轮子会有一个更新功能,看起来像。。。
wheel.update = function() {
// the wheel is turning left
if (wheel.keyhandler.left) {
// make the appropriate adjustments
}
}
然后游戏就会变成这样。。。
wheel = new Wheel;
setInterval(function() {
wheel.update();
},100);
这样,你的轮子将始终根据钥匙的当前状态进行更新,并且你不必依赖于正在触发的事件的限制。:)
下面是我曾经编写的一个简单游戏的片段
//key codes
var KEY_LEFT = 37;
var KEY_RIGHT = 39;
var KEY_A = 65;
var KEY_D = 68;
var KEY_SPACE = 32;
var keys = {};
function onKeyDown(e)
{
e = e || window.event;
var key = window.event.keyCode || e.which; // ie
keys[key] = true;
}
function onKeyUp(e)
{
var key = window.event.keyCode || e.which; // ie
delete keys[key];
}
这将跟踪所有当前关键状态。然后你的游戏"勾选"是在setTimeout()上,而不是在关键事件上移动,并检查合适的关键。
function gameTick()
{
// update paddle angles
if (keys[KEY_LEFT])
{
// move left
}
if (keys[KEY_RIGHT])
{
// move right
}
}
这是游戏;
您面临的问题是,您的代码旨在检测单次按键,而您的游戏需要检测两次按键。
把这一行放在e大小的循环中,这将把所有按下的键都设置为1。目前它只检测到一个按键按下并且一次处理一个按键。
keys[e.keyCode] = 1;
看看这个帖子,你可能会得到你需要的。尽管它是jquery,但在概念上可能会有所帮助。我也在用js做这个。。。如果有新的东西出现,会分享。。。
在jQuery 中检测单个按键事件中的多个按键
如果你在编程方面只有一个月大,那么你的代码和概念就很酷。
- FullCalendar:事件发生时阻止重叠.标题是一样的
- 重叠对象上的HTML画布事件
- 使用两个重叠的画布,我可以将鼠标事件传递到底部的画布吗
- 重叠的关键事件
- knightlab timeline js-如何在不重叠的情况下显示事件
- 背景事件的重叠行为与正常事件相同
- 重叠圆圈阻止鼠标悬停事件-谷歌地图v3
- 创建单击事件并删除画布中圆的重叠
- 在重叠元素上注册鼠标事件
- 用于查找重叠事件/时间的算法
- 是否可以使jQuery单击事件触发播放声音重叠的函数
- 重叠的 SVG 元素上的鼠标事件
- 如何防止重叠元素的冒泡事件
- 两个OnClick事件重叠,导致第一个事件停止正常执行
- 用于将重叠事件相加的算法
- 处理重叠SVG层中的鼠标事件
- 如何在重叠的谷歌地图制作器上执行点击事件
- Fullcalendar js事件重叠
- 事件监听器处理堆叠/重叠的画布元素
- 父单击事件与子单击事件重叠