OpenGL學習筆記 處理鍵盤輸入

2022-07-30 15:30:23 字數 2166 閱讀 7463

用glfw處理使用者鍵盤輸入有兩種方式,一種是使用**函式,一種是在每一次遊戲迴圈中處理。這兩種方法的最大差別在於是否能連續獲得鍵盤輸入,第二種方法可以。

glfw官方文件 對這種方法的講解很詳盡,下面只簡單記錄一下要點。

我們只需要自定義**函式key_callback,並在進入遊戲迴圈前呼叫函式glfwsetkeycallback(window, key_callback)即可。下面簡單介紹**函式包含的內容。

函式頭為void key_callback(glfwwindow* window, int key, int scancode, int action, int mods),其中,

key為按鍵,例如glfw_key_up,如果敲下的鍵不能被glfw識別,比如play和e-mail,key值就是glfw_key_unknown;

scancode是每個平台自定義的表示按鍵的**,當key值為glfw_key_unknown時scancode會被用來識別鍵,否則scancode會被忽略;另外它可以和key一起用來獲得鍵的名字const char* key_name = glfwgetkeyname(glfw_key_w, 0);,第二個引數就是scancode。scancode可以通過const int scancode = glfwgetkeyscancode(glfw_key_x);獲得;

action代表動作型別,有

其中需要特別注意的是glfw_repeat。引用stack overflow上的乙個回答來解釋它的意義:

也就是說如果我們希望在遊戲中通過鍵盤控制乙個人物的移動的話,是不能依靠glfw_repeat讓人物跑起來的,乙個原因是移動速度不由程式設計師控制,容易引起遊戲混亂,另乙個原因是,如果像下面這樣定義**函式:

void key_callback(glfwwindow* window, int key, int scancode, int action, int mods)

}

連續按「↑」鍵會發現攝像機位置先上移乙個camera_speed的長度,卡頓一會兒,才開始連續向上移動的。當遊戲人物逃避boss追殺時,我們應該不希望他先呆住一兩秒再跑吧?因此要實現連續移動的效果就需要用到第二種方法,而非通過**函式。

mods是"modifier bits"的簡寫,有

通過key和mods的組合就可以實現諸如ctrl+n之類的操作。

這種方法的使用方式如下:

while (!glfwwindowshouldclose(window))

processinputs中包含的要素和上面介紹的**函式差不多,只是用到了另乙個glfw的函式glfwgetkey。最終效果上,這個函式返回任意時間某個鍵的狀態,就是這個函式使得連續效果得以實現。processinputs可以這樣實現:

void processinputs(glfwwindow* window)

除了使用者的操作外,函式glfwsetinputmode也會影響到glfwgetkey的返回值。

void glfwsetinputmode(glfwwindow* window, int mode, int value)

當mode為glfw_sticky_keys且value為glfw_true時,只要按下乙個鍵,那麼glfwgetkey返回的該鍵的狀態一定是按下的,哪怕在glfwgetkey函式被呼叫前這個鍵又被鬆開了。也就是說,當我們只關心鍵是否被按下過、而不關心它是何時被按下的時,就可以設定這個狀態。

glfw可以接受unicode字元流作為輸入,從而允許程式處理來自使用者的文字輸入。我們可以將接受的unicode字元轉換成ascii等其他格式的字元。

在遊戲迴圈前需要呼叫函式glfwsetcharcallback(window, character_callback);

**函式的函式頭為void character_callback(glfwwindow* window, unsigned int codepoint)

OpenGL學習筆記

我是一名ios開發者,opengl是乙個比較重要的技術。所以就此開啟我的菜鳥之路。opengl open graphics library 是乙個跨程式設計語 言 跨平台的程式設計圖形程式接 它將計算機的資源抽象稱為乙個個opengl的物件,對這些資源的操作抽象為乙個的opengl指令.direct...

OpenGL學習筆記

數學基礎 叉積mv矩陣 文章內容主要來自 計算機圖形學程式設計 使用opengl和c 光柵化過程確定了用以顯示3個頂點所確定的三角形的所有畫素需要繪製的位置 光柵化過程開始時先對三角形的每對頂點進行插值 如果光柵化過程到此為止,那麼呈現出的影象將會是線框模型 使用 glpolygonmode gl ...

OpenGL學習筆記

因工作需要,這些天要研究opengl。我給自己定的目標是 1.節前能熟悉opengl基礎知識 2.確定一款以opengl為基礎的gui 3.學習如何使用該gui的控制項繪製3d選單 今天找到幾個 嵌入式系統使用的是opengl es,是桌面opengl的乙個子集,定義了一系列靈活高效的圖形加速介面。...