最近出于兴趣,想做个h5小游戏,但一开始就发现键盘连续点击会出现很明显的延时,这个我之前看过一个文案是说防止输入的时候按键keyup相对慢一点就输一大堆文字,导致输入有问题。其实这个很合理,但置于js游戏里面会很不合理。

先看一下没有解决之前的代码

<div id="a"></div>
<style>#a{position: relative;height: 100px;width: 100px;background-color: #111;}
</style>
<script>
var a = document.getElementById('a'),//获取a
translateX = 0,//translateX初始值,并作为动作的关键
translateY = 0,//translateY初始值,并作为动作的关键
step = 1 //keydown时候的步伐(可以理解为速度)
window.onkeydown=function(e){//筛选不同的按键事件switch(e.keyCode){case 38:translateY  -=step //upbreakcase 40:translateY +=step //downbreakcase 37:translateX -=step //leftbreakcase 39:translateX +=step //rightbreakdefault:break}//a执行动作a.style.transform = `translate(${translateX}px,${translateY}px)`
}
</script>

明显当你换个按钮或者直接按下去的时候会有500ms延时(这个我自己通过new Date().getTime()测过)

后来我参考了墙外的一些小哥的回答,通过设定参考值,通过定时器来执行a的动作。我瞬间豁然开朗。。。确实当你一筹莫展的时候问一下其他人的意见还是焕然一新,在代码海洋中沉溺太久,有时候是“众人皆醒你独醉”。下面是完善后的代码。。。

<div id="a"></div>
<style>#a{position: relative;height: 100px;width: 100px;background-color: #111;}
</style>
<script>//设定一个对象做参考值,这个不一定是对象obj,可以直接设定status=[0,0,0,0],当然这时后面的代码全部要改var obj = {status:[0,0,0,0]//[up+1,down-1,left-1,right+1]}var translateX = 0,translateY = 0,step = 1window.onkeydown = function (e) {switch(e.keyCode){case 38:obj.status[0] = step  //upbreakcase 40:obj.status[1] = step  //downbreakcase 37:obj.status[2] = step  //leftbreakcase 39:obj.status[3] = step  //rightbreakdefault:break}}window.onkeyup = function (e) {switch(e.keyCode){case 38:obj.status[0] = 0 //upbreakcase 40:obj.status[1] = 0 //downbreakcase 37:obj.status[2] = 0 //leftbreakcase 39:obj.status[3] = 0 //rightbreakdefault:break}}function handleStatus() {//X轴的值translateY += obj.status[1] - obj.status[0]//Y轴的值translateX += obj.status[3] - obj.status[2]//a动作a.style.transform = `translate(${translateX}px,${translateY}px)`}//定时器一直读取参考值setInterval(handleStatus,10)</script>

这时候已经搞定了,但说实话我不喜欢switch代码虽然好,但我不喜欢它的累赘,所以我简化了代码,而且存在定时器又不去关闭的时候会影响到内存,所以添加了keyup的时候关闭定时器

<div id="a"></div>
<style>#a{position: relative;height: 100px;width: 100px;background-color: #111;}
</style>
<script>var obj = {status:[0,0,0,0]//[up+1|down-1,left-1|right+1]}var keyCode_data = {38: 0,40: 1,37: 2,39: 3,}var translateX = 0,translateY = 0,step = 1,timer = falsewindow.onkeydown = function (e) {obj.status[keyCode_data[e.keyCode]] = step!timer ? setTimer() : false}window.onkeyup = function (e) {obj.status[keyCode_data[e.keyCode]] = 0obj.status.indexOf(step) == -1 ? clearTimer() : false}function handleStatus() {translateY += obj.status[1] - obj.status[0]translateX += obj.status[3] - obj.status[2]a.style.transform = `translate(${translateX}px,${translateY}px)`// console.log(123) //测试定时器是否关闭}function setTimer() {timer = setInterval(handleStatus,10)}function clearTimer() {clearInterval(timer)timer = false}</script>

js游戏键盘延时问题完美解决方案相关推荐

  1. js手机键盘遮挡_完美解决手机网页中输入框被输入法遮挡的问题

    之前要做一个弹出对话框,填写信息,发现在手机上看的时候,较后的输入框在填写信息时,输入框被输入法遮挡,只能盲填. 前提 1.弹出的对话框用display:fixed定位的 2.对话框大小固定 解决办法 ...

  2. Android判断软键盘弹出并隐藏的简单完美解决方案

    Android判断软键盘弹出并隐藏的简单完美解决方案 参考文章: (1)Android判断软键盘弹出并隐藏的简单完美解决方案 (2)https://www.cnblogs.com/thare1307/ ...

  3. Android 适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

  4. Android适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

  5. android自定义键盘遮挡,Android软键盘遮挡的四种完美解决方案

    一.问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时 ...

  6. js控制excel打印完美解决方案

    js控制excel打印完美解决方案 转自:http://hi.baidu.com/hongz1125/blog/item/0152bcfd84ce1e1008244d5c.html 做web开发大家都 ...

  7. 手游直播正在连接推流服务器,游戏直播时Airplay投屏卡死完美解决方案

    游戏直播时Airplay投屏卡死完美解决方案 作者:葫芦君 来源:小葫芦 时间:2018-03-08 11:38 在使用OBS直播手游时,用投屏软件投屏到电脑上,然后用OBS捕捉到游戏源.比如:手机打 ...

  8. 小米红米手机无电池24H开机完美解决方案

    小米红米手机无电池24H开机完美解决方案 因为小米红米手机比较适合做测试工具,本身也比较廉价,所以拿来当日常管理工具,家庭网关等之类的24H开机的机器再好不过了.但是由于电池的存在并且该电池性能较差, ...

  9. linux关机_【linux】 不要再暴力关机了,讲讲我最近遇到的问题和完美解决方案...

    欢迎关注我的个人公众号:AI蜗牛车 前言 结束了每天的紧张的工作,这两天真的有些肝. 这两天打打字,突然感觉手指头疼起来了,想意识到成天打了十多个小时的键盘, 手指头都疲劳了= = 之后这两天基本上除 ...

最新文章

  1. 威马新车型,率先放话搭载L4自动驾驶
  2. Ubuntu16.04下使用ufw保护docker容器
  3. c语言dll注入器,Module Injector-Module Injector(DLL动态库注入器)下载 v1.0--pc6下载站
  4. mysql 属性函数_4-MySQL函数(字段处理函数条件判断函数)
  5. 【MyBatis框架】高级映射-多对多查询
  6. React项目build之后资源文件路径不正确或打开空白页的问题及简易解决方法
  7. django manage.py model 删除表后怎么重新生成数据库表
  8. 数据分析面试都会问到哪些问题
  9. Win 10 专业版重新激活详细操作步骤
  10. PS线条神器插件Lazy Nezumi Pro(能画出sai般的线条)
  11. POP3协议命令原始码及工作原理
  12. macbook更新系统服务器,为Mac新系统做准备 苹果更新OSX Server
  13. html图片排版技巧,【CSS技巧】多图片的垂直居中排版
  14. c语言关键字code什么意思,C语言中的32个关键字分别是什么意思?
  15. android mms分析,在Android上解析应用程序/ smil MMS MIME类型
  16. 弘扬奥运精神,我们49行画个奥运五环
  17. Android studio ndk目录无法点击选择
  18. 凭什么都是Java开发三年,而他能进大厂薪资是“我”2倍?
  19. 手把手教如何搭建一个百度网盘目录站点【保姆级】
  20. 菜鸟窝-仿京东淘宝项目学习笔记(二)ToolBar的基本使用

热门文章

  1. B/S基于springMVC的网上选课系统(功能齐全javaweb)
  2. c语言开发百度地图,百度地图开发(一)
  3. PAT 1012 The Best Rank (25 分)
  4. 「算法学习」:贪心算法找零问题
  5. 一周学会小程序-日播天气
  6. 4.3 C语言的高级用法以及易错点
  7. ARCore之路-前言
  8. 最佳 Flutter 音乐流媒体选项
  9. 2019第九届MathorCup数学建模
  10. Unhandled fault: alignment exception