1. 程式人生 > >聊聊 鍵盤長按將解決卡頓方案

聊聊 鍵盤長按將解決卡頓方案

itl lang false doctype ctype 如何 true etl osi

當我們做遊戲的時候,很多時候遇用到鍵盤事件長按的的時候第一下卡頓的情況,怎麽解決呢?
 以下是我的解決方案,建議復制到編輯器上直接調試

代碼裏面有我思考的過程,大家可以參考

  思考過程

//當按下的時候改變left屬性值
40     //總結:當我們按下的時候,鍵盤的設計者不知道我們是要連續按還是按一下,所以,鍵盤的制造者定了一個規矩,如果按下超過..s的時候就認為是用戶要連續按,於是就出現了一個問題,當我們玩遊戲的時候,我們如果連續按下鍵盤就會先停頓一下,然後在連續的
41     //轉化思想:如何解決這個問題,當按第一下的時候我們就執行left/top的改變,那麽改變的代碼就不能寫在按下的事件裏面,按下只是傳給我們信號,這個信號讓top/left連續改變,當擡起鍵盤的時候,改變這個信號,讓上面的改變停止,傳給他的信號應該是布爾值

 1 老版本

<!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 <style> 8 .box { 9 position: absolute; 10 top: 10px; 11 left: 10px; 12 width: 100px; 13 height
: 100px; 14 background: red; 15 } 16 </style> 17 </head> 18 19 <body> 20 <div class="box"></div> 21 <script> 22 var box = document.querySelector(.box); 23 var isleft = false; 24 var isright = false; 25 var istop = false; 26 var
isbottom = false; 27 setInterval(function() { 28 29 if (isleft) { 30 box.style.left = box.offsetLeft - 5 + px; 31 } else if (isbottom) { 32 box.style.top = box.offsetTop - 5 + px; 33 } else if (istop) { 34 box.style.top = box.offsetTop + 5 + px; 35 } else if (isright) { 36 box.style.left = box.offsetLeft + 5 + px; 37 } 38 }, 20) 39 //當按下的時候改變left屬性值 40 //總結:當我們按下的時候,鍵盤的設計者不知道我們是要連續按還是按一下,所以,鍵盤的制造者定了一個規矩,如果按下超過..s的時候就認為是用戶要連續按,於是就出現了一個問題,當我們玩遊戲的時候,我們如果連續按下鍵盤就會先停頓一下,然後在連續的 41 //轉化思想:如何解決這個問題,當按第一下的時候我們就執行left/top的改變,那麽改變的代碼就不能寫在按下的事件裏面,按下只是傳給我們信號,這個信號讓top/left連續改變,當擡起鍵盤的時候,改變這個信號,讓上面的改變停止,傳給他的信號應該是布爾值 42 window.onkeydown = function(e) { 43 switch (e.keyCode) { 44 case 37: 45 isleft = true; 46 break; 47 case 38: 48 isbottom = true; 49 break; 50 case 39: 51 isright = true; 52 break; 53 case 40: 54 istop = true; 55 break; 56 } 57 } 58 window.onkeyup = function(e) { 59 switch (e.keyCode) { 60 case 37: 61 isleft = false; 62 break; 63 case 38: 64 isbottom = false; 65 break; 66 case 39: 67 isright = false; 68 break; 69 case 40: 70 istop = false; 71 break; 72 } 73 } 74 </script> 75 </body> 76 77 </html>

改良版本

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>Document</title>
 7     <style>
 8     .box {
 9         position: absolute;
10         top: 10px;
11         left: 10px;
12         width: 100px;
13         height: 100px;
14         background: red;
15     }
16     </style>
17 </head>
18 
19 <body>
20     <div class="box"></div>
21     <script>
22     var box = document.querySelector(.box);
23     
24     //當按下的時候改變left屬性值
25     //總結:當我們按下的時候,鍵盤的設計者不知道我們是要連續按還是按一下,所以,鍵盤的制造者定了一個規矩,如果按下超過..s的時候就認為是用戶要連續按,於是就出現了一個問題,當我們玩遊戲的時候,我們如果連續按下鍵盤就會先停頓一下,然後在連續的
26     //轉化思想:如何解決這個問題,當按第一下的時候我們就執行left/top的改變,那麽改變的代碼就不能寫在按下的事件裏面,按下只是傳給我們信號,這個信號讓top/left連續改變,當擡起鍵盤的時候,改變這個信號,讓上面的改變停止,傳給他的信號應該是布爾值
27     window.onkeydown = function(e) {
28         switch (e.keyCode) {
29             case 37:
30                 box.style.left = box.offsetLeft - 5 + px;
31                 break;
32             case 38:
33                 box.style.top = box.offsetTop - 5 + px;
34 
35                 break;
36             case 39:
37                 box.style.left = box.offsetLeft + 5 + px;
38                 break;
39             case 40:
40                 box.style.top = box.offsetTop + 5 + px;
41                 break;
42         }
43     }
44     </script>
45 </body>
46 
47 </html>

聊聊 鍵盤長按將解決卡頓方案