伊莉討論區
標題:
怎麼解決鍵盤延遲?
[打印本頁]
作者:
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
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define PE printf
void GotoXY(int x,int y)
{
HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(h,c);
}
void WriteC(int c,int x,int y)
{
HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X=x;
coord.Y=y;
DWORD wbyte=0;
SetConsoleCursorPosition(h,coord);
WriteConsole(h,&c,1,&wbyte,NULL);
}
#define MAX_X 40
#define MAX_Y 20
#define MIN_X 0
#define MIN_Y 0
void DrawBox()
{
int i;
int j;
PE("+");
for( i = MIN_X+1 ; i < MAX_X ; ++i)
PE("-");
PE("+\n");
for( j = MIN_Y+1 ; j < MAX_Y ; ++j)
{
PE("|");
for( i = MIN_X+1 ; i < MAX_X ; ++i)
PE(" ");
PE("|\n");
}
PE("+");
for( i = MIN_X+1 ; i < MAX_X ; ++i)
PE("-");
PE("+\n");
}
int StarX=(MAX_X+MIN_X)/2;
int StarY=(MAX_Y+MIN_Y)/2;
#define STAR '*'
int Move()
{
if( GetKeyState(0x51)&0x80 ) return 0; // test 'Q'
int NewX=StarX;
int NewY=StarY;
if( GetKeyState(VK_LEFT)&0x80 ) --NewX; // 使用GetKeyState 取得left key 的狀態
if( GetKeyState(VK_RIGHT)&0x80 ) ++NewX;
if( GetKeyState(VK_UP)&0x80 ) --NewY;
if( GetKeyState(VK_DOWN)&0x80 ) ++NewY;
if( NewX <= MIN_X ) NewX=MIN_X+1;
if( NewX >= MAX_X ) NewX=MAX_X-1;
if( NewY <= MIN_Y ) NewY=MIN_Y+1;
if( NewY >= MAX_Y ) NewY=MAX_Y-1;
// 位置有改變
if( NewX!=StarX || NewY!= StarY )
{
WriteC(' ',StarX,StarY);
WriteC(STAR,NewX,NewY);
StarX=NewX;
StarY=NewY;
GotoXY(0,MAX_Y+1);
}
return 1;
}
int main()
{
DrawBox();
WriteC(STAR,StarX,StarY);
GotoXY(0,MAX_Y+1);
while(Move())
{
Sleep(1000/30);
}
}
複製代碼
這是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!