處理鍵盤

鍵盤講述結構

它應該作它更容易了解這個別輔導是你很多是熟悉牽扯到鍵盤接近的機會資料類型,所以我將首先解釋他們.

SDLKey

SDLKey是一種在SDL中定義列舉類型包含SDL_keysym.h和這裡畫詳圖.每一SDLKey符號代表一關鍵, SDLK_a相符合向前'一'在一鍵盤, SDLK_SPACE上關鍵等等與空格鍵相符.

SDLMod

SDLMod是一種和但是它列舉鍵盤修改者((控制手段,Alt,輪班)的SDLKey 相似列舉類型.修改者符號的完整清單在這裡. SDLMod價值觀能是和一起希望代表許多個修改者.

SDL_keysym

  TSDL_KeySym=記錄
scancode:Uint8;//硬體為特定目標的東西scancode
sym:TSDLKey;//SDL事實上keysym
修改者:TSDLMod;//目前重要修改者
unicode:Uint16;//翻譯個性
末端;

SDL_keysym結構描繪一重要壓或者一重要發行.除非你知道什麼,scancode 田野是硬體為特定目標的東西和應該被忽視你的做的事.sym田野是按是或者發佈鍵的 SDLKey價值.在重要壓或者發行發生的的時候 極時髦的田野描繪鍵盤修改者的狀態.那樣一 KMOD_NUM的價值 |KMOD_CAPS|KMOD_LSHIFT將意味著Numlock,Capslock和左邊換檔鍵是所有的壓(或者在鎖關鍵)的情況有助於.最後,unicode田野儲藏關鍵的16位unicode價值.

筆記:它應該指出被和懂得當SDL_keysym正描繪一重要壓,不是一重要發行的時候,這田野是僅僅有效.因為unicode價值描繪一國際個性和僅重要壓生產個性,Unicode珍視僅有關一重要壓製造感覺.更多關於Unicode的資訊能在www.unicode.org被找出

筆記:Unicode翻譯一定是有助於使用 SDL_EnableUNICODE功能.

SDL_KeyboardEvent

TSDL_KeyboardEvent=記錄
type_:Uint8;//SDL_KEYDOWN或者SDL_KEYUP
哪一個:Uint8;//鍵盤裝置索引
狀態:Uint8;//SDL_PRESSED或者SDL_RELEASED
keysym:TSDL_KeySym;
末端;

SDL_KeyboardEvent(顯然)描繪一鍵盤事件.SDL_Event 聯合的重要成員是一SDL_KeyboardEvent結構.類型田野具體指定是否事件是一重要發行((SDL_KEYUP)或者一重要壓((SDL_KEYDOWN)事件. 狀態基本上是冗餘,它報告同樣的作為類型田野資訊但是使用不同價值觀((SDL_RELEASEDSDL_PRESSED ).keysym含有重要壓的資訊或者這事件代表的發行((在上方)注意到.

閱讀鍵盤事件

從事件行列看出keybaord事件是很簡單((事件排隊這裡)和使用它被描繪.我們閱讀事件使用SDL_PollEvent 進入一陣子用繩圈緊和為 SDL_KEYUPSDL_KEYDOWN檢查事件使用一項開關聲明相像的那樣:

例子3-10.閱讀鍵盤事件

  事件:TSDL_Event;
.
.
為事件//民意測驗.SDL_PollEvent當那裡不是的時候,歸還0
有關事件//更多事件排隊我們在圈將出去的同時什麼時候
發生的//.
(SDL_PollEvent((&event)>0)的同時
開始
//我們是關於SDL_KEYDOWN和SDL_KEYUP事件僅僅憂慮
event.type_裝入盒子
SDL_KEYDOWN:
開始
MessageBox((0',Key察覺'壓',錯誤',MB_OK或者MB_ICONHAND);
末端;

SDL_KEYUP:
開始
MessageBox((0',Key察覺'發行',錯誤',MB_OK或者MB_ICONHAND);
末端;
末端;
末端;
.
.

這個是一個很基本例子.沒有關於重要壓或者發行的資訊被解釋.我們將下面探查從我們首先完整例子裡面另一極端報告所有的可用關於一鍵盤事件的資訊.

一更詳細樣子

在我們能閱讀事件之前,SDL一定是和 SDL_Init在一起initialised和一影像方式一定是使使用 SDL_SetVideoMode.那裡是但是我們必須過去經常得到所有的資訊要求的二個其它功能我們必須透過大聲說出SDL_EnableUNICODE(1)有助於unicode翻譯和我們必須把SDLKey價值觀變成可印刷的某樣東西使用SDL_GetKeyName

筆記:它是有用指出unicode估價<0x80直接翻譯一個性ASCII價值.這個在下面例子使用的

例子3-11.解釋重要事件資訊


使用SDL;

//功能製作原型
過程PrintKeyInfo關鍵:PSDL_KeyboardEvent;
過程PrintModifiers蓋爾人音樂詩歌大會:TSDLMod;


事件:TSDL_Event;
離開:boolean;
//總管道
開始
離開:=虛假;

//Initialise SDL
如果(SDL_Init((SDL_INIT_VIDEO)<0)那時
開始
MessageBox 0,PChar格式化Couldn t預置SDL:%s'[,SDL_GetError'],錯誤,MB_OK或者MB_ICONHAND;
停止((-1);
末端;

//設定一影像方式
如果(SDL_SetVideoMode((320,200,0,0)<0)那時
開始
MessageBox 0,PChar格式化Couldn t設定影像方式:%s'[,SDL_GetError'],錯誤,MB_OK或者MB_ICONHAND;
SDL_Quit;
停止((-1);
末端;

//有助於Unicode翻譯
SDL_EnableUNICODE((1);

直到一SDL_QUIT事件//圈被發現
(!quit)的同時
開始

為事件//民意測驗
(SDL_PollEvent((&event)>0)的同時
開始
把event.type_裝入盒子
//鍵盤事件
//Pass到PrintKeyInfo上面事件資料
SDL_KEYDOWN:
SDL_KEYUP:
開始
PrintKeyInfo((@event.key);
末端;

//SDL_QUITEV事件((窗戶結束)
SDL_QUITEV:
開始
真實離開:=;
末端;
末端;
末端;
末端;

//打掃
SDL_Quit;
停止((0);
末端;

//加印整個關於一重要事件的資訊
過程PrintKeyInfo關鍵:PSDL_KeyboardEvent;

KeyInfo:繩子;
開始
//它是一發行或者一壓嗎?
如果那時(key.type_=SDL_KEYUP)
KeyInfo:='Release:-'
其他
KeyInfo:='Press:-';

//首先加印硬體scancode
KeyInfo:=KeyInfo+格式Scancode:$%02X,key.keysym.scancode+#13#10;
//加印關鍵的名字
KeyInfo:=KeyInfo+格式名字:%s,SDL_GetKeyName((重要>keysym.sym)+#13#10;
//我們想要加印unicode資訊但是我們需要開始
//有把握它的一壓事件第一記住,發佈事件
//沒有unicode資訊
如果那時(key.type_=SDL_KEYDOWN)
開始
//如果Unicode價值是那時不到0x80
//unicode價值能被過去經常到達一可印刷的
使用(燒焦物)unicode關鍵的//代表.
KeyInfo:=KeyInfo+Unicode:';
如果(key.keysym.unicode<80美元)(關鍵>keysym.unicode>0)那時
開始
KeyInfo:=KeyInfo+格式('(%c(($%04X)'[(,燒焦物)key.keysym.unicode,key.keysym.unicode])+#13#10;
末端
其他
開始
KeyInfo:=KeyInfo+格式嗎?($%04X)[,key.keysym.unicode];
末端;
末端;

//印刷修改者資訊
PrintModifiers((key.keysym.mod);
末端;

//印刷修改者資訊
過程PrintModifiers smod:TSDLMod;

牛津大學文學士學位的第一次考試:繩子;
開始
牛津大學文學士學位的第一次考試:=Modifers:+#13#10;

如果有沒有一點兒,那時//說那樣和返回
如果那時(smod=KMOD_NONE)
開始
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'沒有一點兒';
末端
其他
開始

為有每一SDLMod價值存在//檢查
//這個看起來髒亂,但是那裡確實不是
//一種更清楚方式.
如果那時(smodKMOD_NUM)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'NUMLOCK'+#13#10;
如果那時(smodKMOD_CAPS)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'CAPSLOCK'+#13#10;
如果那時(smodKMOD_LCTRL)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'LCTRL'+#13#10;
如果那時(smodKMOD_RCTRL)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'RCTRL'+#13#10;
如果那時(smodKMOD_RSHIFT)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'RSHIFT'+#13#10;
如果那時(smodKMOD_LSHIFT)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'LSHIFT'+#13#10;
如果那時(smodKMOD_RALT)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'RALT'+#13#10;
如果那時(smodKMOD_LALT)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'LALT'+#13#10;
如果那時(smodKMOD_CTRL)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'CTRL'+#13#10;
如果那時(smodKMOD_SHIFT)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'輪班'+#13#10;
如果那時(smodKMOD_ALT)
牛津大學文學士學位的第一次考試:=牛津大學文學士學位的第一次考試+'ALT'+#13#10;
末端;
MessageBox((0,PChar((牛津大學文學士學位的第一次考試)',錯誤',MB_OK或者MB_ICONHAND);
末端;

勇敢類型投入

我已經發現那人們為運動會使用鍵盤事件和其它交互作用的應用確實不一定懂得一fundemental點

當一重要狀態從是unpressed變成的時候,鍵盤事件發生向前反之亦然擠.

以為你有一個外國人,當去左邊把你按左邊箭,當你擠的時候,你想要他的鍵一語帶過的時候,你希望不停地走動使用游標關鍵的形象順關鍵而下你想要他偷偷溜走順銀幕而下.檢查下列的代碼,它強調和很多人有的錯誤開始.

 
//外來銀幕被整理成序
alien_x:整數=0;
alien_y:整數=0;
.
.
//Initialise SDL和影像方式等等
.
//主要勇敢圈
為事件//檢查
(SDL_PollEvent((&event))的同時
開始
event.type_裝入盒子
為一keypress//Look
SDL_KEYDOWN:
開始
//檢查SDLKey價值觀和移動改變coords
event.key.keysym.sym裝入盒子
SDLK_LEFT:
開始
十二月((alien_x);
末端;

SDLK_RIGHT:
開始
inc((alien_x);
末端;

SDLK_UP:
開始
十二月((alien_y);
末端;

SDLK_DOWN:
開始
inc((alien_y);
末端;
末端;
末端;
末端;
末端;
.
.
乍一看你可以認為這個是一完美合乎情理條為任務代碼,但是它不是.就像我說鍵盤,當一關鍵改變狀態,所以用戶將必須按左邊游標鍵去左邊提議外來100映像點100次和發佈的時候,事件僅發生.

在這個我們一定不要使用事件改變的問題周圍得到外國人的位置,我們使用事件設定旗幟那時在一seperate段代碼使用的感動外國人.像這樣某樣東西:

例子3-12.恰當勇敢動作

    

//外來銀幕被整理成序
alien_x:整數=0;
alien_y:整數=0;
alien_xvel:整數=0;
alien_yvel:整數=0;
.
.
//Initialise SDL和影像方式等等
.
//主要勇敢圈
為事件//檢查
(SDL_PollEvent((@event)>0)的同時
開始
event.type_裝入盒子
為一keypress//Look
SDL_KEYDOWN:
開始
//檢查SDLKey價值觀和移動改變coords
event.key.keysym.sym裝入盒子
SDLK_LEFT:
開始
alien_xvel:=-1;
末端;

SDLK_RIGHT:
開始
alien_xvel:=1;
末端;

SDLK_UP:
開始
alien_yvel:=-1;
末端;

SDLK_DOWN:
開始
alien_yvel:=1;
末端;
末端;
末端;
*我們必須也使用SDL_KEYUP事件對x*/作歸零校正
*和y速度變數.但是我們必須也是*/
小心不要當我們的時候,對速度作歸零校正*shouldn't*/
SDL_KEYUP:
開始
event.key.keysym.sym裝入盒子
SDLK_LEFT:
開始
//我們檢查確保外國人正移動
去左邊//.如果那時它是,我們作歸零校正
//速度.如果外國人正移動向
//就在那時正確關鍵仍然是壓
//所以我們不做tocuh速度
如果(alien_xvel<0)那時
alien_xvel:=0;
末端;

SDLK_RIGHT:
開始
如果(alien_xvel>0)那時
alien_xvel:=0;
末端;

SDLK_UP:
開始
如果(alien_yvel<0)那時
alien_yvel:=0;
末端;

SDLK_DOWN:
開始
如果(alien_yvel>0)那時
alien_yvel:=0;
末端;
末端;
末端;
末端;
末端;
.
.
//更新外來位置
inc((alien_x,alien_xvel);
inc((alien_y,alien_yvel);

當能被注意到時,我們使用代表輪船的運動的二額外變數,alien_xvel和alien_yvel,這是我們當我們察覺keypresses和發行的時候,更新的這些變數.