消除 Javascript 中的按键延迟

2024-03-29

我有以下问题: 我正在尝试编写一个 Javascript 游戏,并且角色由箭头键控制。
问题是,当一个人按住按键时,在触发第一个按键之间有一个短暂的延迟keypress以及重复的keypress.
另外,当按下“向右箭头键”并保持按下状态,然后按下“向上箭头键”时,角色不会移动到右上角,而是停止向右方向移动并开始向上移动。
这是我正在使用的代码:

<body onLoad="Load()" onKeyDown="Pressed(event)">


function Pressed(e) { 
        cxc = e.keyCode;
        if(cxc == 37)
            Move(-1,0);
        if(cxc == 38)
            Move(0,-1);
        if(cxc == 39)
            Move(1,0);
        if(cxc == 40)
            Move(0,1);
    }
  

有人有想法吗?


如果您希望以可控的方式重复按键,则必须自己实现它,因为按键事件的触发取决于操作系统对按键应如何重复的想法。这意味着可能存在可变的初始延迟和后续延迟,并且同时按住两个键只会导致其中一个键重复。

您必须记录当前是否按下每个键,并忽略keydown当按键已经按下时发生的事件。这是因为许多浏览器会触发keydown以及ASAkeypress发生自动重复时发生的事件,如果您自己重复按键,则需要抑制该事件。

例如:

// Keyboard input with customisable repeat (set to 0 for no key repeat)
//
function KeyboardController(keys, repeat) {
    // Lookup of key codes to timer ID, or null for no repeat
    //
    var timers= {};

    // When key is pressed and we don't already think it's pressed, call the
    // key action callback and set a timer to generate another one after a delay
    //
    document.onkeydown= function(event) {
        var key= (event || window.event).keyCode;
        if (!(key in keys))
            return true;
        if (!(key in timers)) {
            timers[key]= null;
            keys[key]();
            if (repeat!==0)
                timers[key]= setInterval(keys[key], repeat);
        }
        return false;
    };

    // Cancel timeout and mark key as released on keyup
    //
    document.onkeyup= function(event) {
        var key= (event || window.event).keyCode;
        if (key in timers) {
            if (timers[key]!==null)
                clearInterval(timers[key]);
            delete timers[key];
        }
    };

    // When window is unfocused we may not get key events. To prevent this
    // causing a key to 'get stuck down', cancel all held keys
    //
    window.onblur= function() {
        for (key in timers)
            if (timers[key]!==null)
                clearInterval(timers[key]);
        timers= {};
    };
};

then:

// Arrow key movement. Repeat key five times a second
//
KeyboardController({
    37: function() { Move(-1, 0); },
    38: function() { Move(0, -1); },
    39: function() { Move(1, 0); },
    40: function() { Move(0, 1); }
}, 200);

尽管如此,大多数基于动作的游戏都有一个固定时间的主框架循环,您可以将按键上/下处理绑定到其中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消除 Javascript 中的按键延迟 的相关文章

随机推荐

  • 具有未定义行为的分支是否可以被假定为不可访问并优化为死代码?

    考虑以下陈述 char NULL 0 undefined behavior 它显然会调用未定义的行为 给定程序中存在这样的语句是否意味着整个程序未定义 或者只有当控制流命中该语句时行为才变得未定义 如果用户从不输入号码 以下程序是否会被明确
  • 如何从另一种语言单词创建英文字母字符串?

    我需要找到一种方法将某些语言的单词 翻译 重写为英语 例如 俄语 听起来像privet 用英语讲 含义和语法并不重要 但我希望它听起来更相似 一切都应该用Python编写 我在网上努力查找 但没有找到好的方法 例如 类似这样的事情 tran
  • Cocoa:避免控制绑定中的“持续更新”

    我有几个面板 其中包含NSTextField绑定到属性内的控件文件的所有者目的 如果用户编辑字段然后按Tab 移动到下一个字段 它按预期工作 但是如果用户不按Tab只需按 确定 按钮 新值不会在文件的所有者 object 为了解决这个问题
  • 声明后在 C++ 向量中分配元素

    请参考下面的代码和注释 vector
  • 如何在对 C# .NET 3.5 服务器进行 DCOM 调用时可靠地检查客户端身份?

    我有一个旧的 Win32 C DCOM 服务器 我正在重写它以使用 C NET 3 5 客户端应用程序位于远程 Windows XP 计算机上 也是用 C 编写的 这些客户端必须保持不变 因此我必须在新的 NET 对象上实现接口 这已经完成
  • jQuery - 如何选择表中所有行的最后一列?

    假设我有一个 HTML 表 如下所示 带有适当的 tr td 标签 a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 table border 1 tr td a1 td td b1 td td c1 td tr tr
  • 如何保护 Next.js next-auth 中的路由?

    我正在尝试将身份验证与next auth应用程序中的库 我一直在遵循这里给出的官方教程https github com nextauthjs next auth example https github com nextauthjs nex
  • Laravel 6 中未定义 Artisan 命令“make:auth”

    我在 Laravel 6 中创建登录 身份验证时遇到问题 我在终端中输入 make auth 然后收到错误 Command make auth 似乎未定义 有解决办法吗 看起来 L6 将 Auth 脚手架移至一个单独的包 https git
  • 实体框架的 SQL 运算符函数是否可以安全防范 SQL 注入?

    这些函数可以访问 SQL 中的特殊函数 SqlClient 例如 喜欢 或 之间 他们还为它们提供了更好的通用抽象层 不要与存储过程 函数 混淆 这是另一篇文章的主题question https stackoverflow com ques
  • xyplot 中的多个 ablines

    我有一个 长 数据框定义为 q lt data frame Indicator Code factor Year numeric Value numeric 我试图在单个 xyplot 中绘制每个不同年份的值作为年份的函数Indicator
  • PHP 包含最佳实践问题

    我一直在学习 PHP 语法并进行练习 我有 NET 背景 因此母版页总是让我在处理页眉和页脚时变得非常简单 到目前为止 我有一个 mainHeader php 和 mainFooter php 其中有我的头部菜单和页脚 html 我创建了一
  • Android 和 iOS 上的 Open Graph SMS 丰富消息

    我正在尝试利用带有开放图元标记的富文本消息 因此 我已将元标记包含在我的网站头部中 并且它通过了所有 Facebook 调试和 iOS API 验证工具 然而 当我通过短信将链接发送给 Android 或 iOS 上的人时 它通常不起作用
  • 获取 Facebook 页面帖子

    我编写了一些 JavaScript 来获取 Facebook 页面上的所有帖子 我这样做的 URL 是这样的 http graph facebook com cocacola feed limit 5 callback facebookRe
  • C# 嵌入vlc控件

    我尝试将 VLC 嵌入到我的 WPF 项目中 我已经注册了 axvlc dll 还下载了 VLC nightly build 版本 2 2 2 System Windows Markup XamlParseException 类型的第一次机
  • Netbeans 删除内置类?

    我有一个 NetBeans 项目 其中有很多类 过去三周我一直在研究这个项目 今天才开始遇到这个问题 单击 NetBeans 中的 运行主项目 按钮时 我看到以下错误 Exception in thread main java lang N
  • 在x86汇编中,为imul使用两个单独的寄存器是否更好?

    我想知道 主要是出于好奇 使用相同的寄存器进行操作是否比使用两个更好 考虑到性能和 或其他问题 什么会更好 mov rbx rcx imul rcx rcx or mov rbx rcx imul rbx rcx 任何有关如何对此进行基准测
  • 适用于 Windows 安装的 GitHub

    安装 GitHub for Windows 时 如何解决此错误 尝试下载时发生错误 http github windows s3 amazonaws com GitHub application http github windows s3
  • 以下是在 Python Mechanize 中按下提交按钮的结果

    所以我有一个经过身份验证的网站 我想通过 mechanize 模块访问该网站 我可以登录 然后转到我想要的页面 但是 由于该页面识别出 mechanize 未启用 javascript 因此它希望我单击提交按钮以重定向到网站的非 javas
  • 如何在 Mockito 中模拟 instanceof

    我有一段代码 我想用 Mockito 测试一下 mockedClass instanceof SampleInterface The mockedClass被嘲笑的抽象类 MockedClass 以及SampleInterface是一个接口
  • 消除 Javascript 中的按键延迟

    我有以下问题 我正在尝试编写一个 Javascript 游戏 并且角色由箭头键控制 问题是 当一个人按住按键时 在触发第一个按键之间有一个短暂的延迟keypress以及重复的keypress 另外 当按下 向右箭头键 并保持按下状态 然后按