第三章:輸入接口
所謂“控制感”
這篇文章主要介紹使用輸入接口對圖元進行控制。
[遊戲當中的輸入分類]
1.主動檢索式,在Serial中檢測按鍵的狀態,作出不同的反應,這個適用於控制要求及時、快速的情況,例如控制遊戲角色等。
2.被動驅動,類似於AWT的事件回調,用於控制要求頻度不高,但往往是單次調用的過程,例如遊戲菜單的控制。
二者誰也無法替代誰,使用回調控制角色,會有很大的滯後感;而使用主動檢索驅動UI菜單,則會敏感度過高,稍微一按就飛出好幾項之後了。
[主動檢索式]
例子:
@Override
public void Serial(int arg0) {
if(UES.getKeyStatus(KeyEvent.VK_LEFT)){
rect.setDx(rect.getDx() - 3);
}
if(UES.getKeyStatus(KeyEvent.VK_RIGHT)){
rect.setDx(rect.getDx() + 3);
}
if(UES.getKeyStatus(KeyEvent.VK_UP)){
rect.setDy(rect.getDy() - 3);
}
if(UES.getKeyStatus(KeyEvent.VK_DOWN)){
rect.setDy(rect.getDy() + 3);
}
}
將第二章動態繪製中的Serial改寫如上,運行的結果就是可以使用鍵盤的上下左右控制綠色矩形移動。
API介紹:
UES:boolean getKeyStatus(int keyCode);
keyCode是鍵盤按鍵對應的ascii碼,但是我們不需要去記憶整數碼,可以使用KeyEvent.VK_鍵盤字母 的格式進行引用。
該方法返回此時鍵盤的按鍵狀態,若爲按下,則返回true,否則爲false;
除去鍵盤,鼠標也有類似的API:
UES.getMouseButtonStatus(arg0),它可以獲得當前鼠標的按鈕狀態,1,2,3在本人的設備上分別對應左鍵、中鍵(滾輪按下)、右鍵;
UES.getCrtMouseX(),UES.getCrtMouseY()則返回當前鼠標位置。
=====================================================
[被動驅動]
被動驅動的實現就沒有上面簡單了。
以鍵盤爲例:
[interface geivcore.KeyFactor]
KeyFactor接口:所有響應鍵盤迴調的類需要實現KeyFactor接口,它包括了三個方法:
public void setKeyListener(KeyListener keyListener);
public void removeKeyListener();
public void keyFactor(int keyCode,boolean ispressed);
如果需要響應鍵盤的類沒有繼承其他類,則可選擇繼承geivcore.DefaultFactor類,進行默認的鍵盤響應實現。
[interface geivcore. KeyListener]
KeyListener接口:所有處理回調的邏輯實現自該接口,該接口只有一個方法:
public void doKeyBord(KeyFactor whom,intkeyCode,boolean ispressed);
whom是響應的KeyFactor對象,keyCode是按鍵對應的ascii碼,ispressed標識着是按下還是擡起。
在實現了上兩個接口後,使用UES.pushKeyBoardIO(KeyFactor factor)方法,將KeyFactor壓入鍵盤IO的棧頂,我們的鍵盤指令會始終傳遞給棧頂的KeyFactor,這是爲了適應傳統的UI系統。
*注意,雖然KeyFactor、KeyListener與UES鍵盤棧系統被保留到高層,允許開發者自己去實現,但這一過程確實有些複雜,因此在開發工具集中留有Component類作爲UI組件工具,也有AutoList類用於從XML文件中構架菜單結構,在工具類的介紹章節裏會詳細介紹。
[總結]
介紹了主動監測與被動回調兩種輸入方案,其中被動驅動的實現較爲複雜,因此建議儘量使用工具類中的現成組件。