伊莉討論區

標題: 怎麼解決鍵盤延遲? [打印本頁]

作者: cnb162434    時間: 2011-4-3 08:08 AM     標題: 怎麼解決鍵盤延遲?

最近試了一下做    下樓梯
但橫向的移動一直不順暢

因為按住鍵盤某鍵 會先停頓   才開始自動連續

是否有辦法無停頓

又能在放開的時後瞬間停住嗎@@?

簡單的說  就是

讓鍵盤無延遲" 的方法

要寫在程式裡面的"
作者: huadi73    時間: 2011-4-5 05:14 AM

會有延遲應該是因為當你按下之時所需做的處理太多了吧~
應該是要想如何改善你程式碼的效能
我個人覺得應該是這樣
作者: cnb162434    時間: 2011-4-5 05:31 AM

恩....並不是指我程式碼的東西@@"

這樣說吧  如果你要連續打20個3

會按著3不放吧?

當按下去後  會先出現第一個三  

然後過一小段時間   才會開始出現連續的3

現在就是希望有辦法用程式

讓那一小段時間消去   能按著3就接連出現3

或是有小方法   不需要去改甚麼設定@@"

只要有效果出來就好 "

(因為下樓梯  有時候會按著左  

然後馬上按右  都會變成只往右一步  

過一小段時間才開始接連往右  ...  =>  不順暢)
作者: ponchi96    時間: 2011-4-5 05:55 AM

回復 3# cnb162434

我剛自己測了一下的確有這個問題
但是那"一小段時間"只有約不到一秒不是嗎@@
想知道什麼原因影響到程式目的
作者: cnb162434    時間: 2011-4-5 07:04 AM

本帖最後由 cnb162434 於 2011-4-5 07:09 AM 編輯

阿阿"

就是   下樓梯遊戲

多那一點點時間有差><

各位應該都玩過吧"

下樓梯絕對是不斷的左右左右
然後想停就停

而且是一直按著的左右左右  並不是按一下按一下的


如果沒方法解決

我寫的下樓梯玩起來都不太順暢   

當然是可以玩   但不如真正的下樓梯那樣爽快"

如果照正常玩下樓梯的方法去按

他在切換方向的時候   (如左換右   會先往右一步  然後頓一下  才繼續往右)

所以.."

我只是希望   玩起來能流暢

多了那個頓一下  

連我自己都對我寫的下樓梯沒興趣-3-"


(我試過是讓他按左

那X軸就一直減

按右

X軸就一直加

這樣不會停頓

可是停不下來(廢話)

沒辦法再放開按鍵的那剎那停下來

所以如果能判斷是否放開按鍵    也能達到效果   
)

總之就是

按下按鍵的時候

就是不斷做某動作(不會停頓)

直到放開(停下來)
作者: baepi    時間: 2011-4-5 11:25 AM

不懂~是不是能貼出大大的  "片斷程式碼"
因為~我寫了不少遊戲~不曾發覺有這問題呀~
作者: iseeyou    時間: 2011-4-6 10:18 AM

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <conio.h>

  4. #define PE printf

  5. void GotoXY(int x,int y)
  6. {
  7.     HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
  8.         COORD c;
  9.     c.X=x;
  10.     c.Y=y;

  11.     SetConsoleCursorPosition(h,c);
  12.    
  13. }

  14. void WriteC(int c,int x,int y)
  15. {
  16.         HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
  17.         COORD coord;
  18.     coord.X=x;
  19.     coord.Y=y;
  20.         DWORD wbyte=0;
  21.         SetConsoleCursorPosition(h,coord);
  22.         WriteConsole(h,&c,1,&wbyte,NULL);
  23. }

  24. #define MAX_X 40
  25. #define MAX_Y 20
  26. #define MIN_X 0
  27. #define MIN_Y 0



  28. void DrawBox()
  29. {
  30.         int i;
  31.         int j;
  32.         PE("+");
  33.         for(  i = MIN_X+1 ; i < MAX_X ; ++i)
  34.                 PE("-");
  35.         PE("+\n");
  36.         for( j = MIN_Y+1 ; j < MAX_Y ; ++j)
  37.         {
  38.                 PE("|");
  39.                 for( i = MIN_X+1 ; i < MAX_X ; ++i)
  40.                         PE(" ");
  41.                 PE("|\n");
  42.         }
  43.         PE("+");
  44.         for(  i = MIN_X+1 ; i < MAX_X ; ++i)
  45.                 PE("-");
  46.         PE("+\n");

  47. }

  48. int StarX=(MAX_X+MIN_X)/2;
  49. int StarY=(MAX_Y+MIN_Y)/2;

  50. #define STAR '*'

  51. int Move()
  52. {
  53.         if( GetKeyState(0x51)&0x80 ) return 0; // test 'Q'
  54.         int NewX=StarX;
  55.         int NewY=StarY;
  56.         if( GetKeyState(VK_LEFT)&0x80 ) --NewX;  // 使用GetKeyState 取得left key 的狀態
  57.         if( GetKeyState(VK_RIGHT)&0x80 ) ++NewX;
  58.         if( GetKeyState(VK_UP)&0x80 ) --NewY;
  59.         if( GetKeyState(VK_DOWN)&0x80 ) ++NewY;
  60.        
  61.         if( NewX <= MIN_X ) NewX=MIN_X+1;
  62.         if( NewX >= MAX_X ) NewX=MAX_X-1;
  63.         if( NewY <= MIN_Y ) NewY=MIN_Y+1;
  64.         if( NewY >= MAX_Y ) NewY=MAX_Y-1;
  65.         // 位置有改變
  66.         if( NewX!=StarX || NewY!= StarY )
  67.         {
  68.                 WriteC(' ',StarX,StarY);
  69.                 WriteC(STAR,NewX,NewY);
  70.                 StarX=NewX;
  71.                 StarY=NewY;
  72.                 GotoXY(0,MAX_Y+1);
  73.         }
  74.        
  75.         return 1;
  76. }

  77. int main()
  78. {
  79.         DrawBox();
  80.         WriteC(STAR,StarX,StarY);
  81.         GotoXY(0,MAX_Y+1);
  82.         while(Move())
  83.         {
  84.                 Sleep(1000/30);
  85.         }
  86. }
複製代碼
這是window 下的的程式
最主要你必須要用GetKeyState() 取得目前按鑑狀態
當某key 被按下 用GetKeyState(key) 取得的值它的MSB 會被設為1
沒有按下時不會被設定
作者: kaworucloud    時間: 2011-4-6 02:45 PM

如果你單純以 KeyDown 事件來處理,就會發生你說的問題
因為 windows 在產生第一個 KeyDown 事件後,會等待一個 delay 時間,然後才產生第二個
並且再等待一個 repeat 時間後,產生第三個,之後就都是等待一個 repeat 時間
這個 delay repeat 的值可以在控制台調整
從程式改的話就是用 SystemParametersInfo 搭配 SPI_SETKEYBOARDDELAY、SPI_SETKEYBOARDSPEED
不過 delay 只有四階段能調整,最快的階段也有 250ms 左右的延遲,對做遊戲的人來說這顯然沒任何意義

要做到無延遲,你得主動用一個 timer,定時去檢查當前鍵盤上各個按鍵的狀態,而非被動接收 windows 丟給你的事件
DirectInput 也是相同原理




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!