第一篇的时候,有简单的介绍glfw
管理的一系列输入callback,,我只用了KeyCallback
而已,但也只是做了一个简单的ESC离开功能。在源始码的资料夹里,可以看到除了PC电脑的输入装置的处理,glfw
还有摇杆的处理
今天会完成几个常用的键盘输入功能,会用到以下这几种Callback
输入功能的方向很简单,尤其是单纯制作最上层游戏逻辑的部分,就是
按了甚麽按键,做甚麽事情;滑鼠移到哪里,做甚麽事情
所以开了几个关於「确定这个输入是按下还是放开」的函式
// [iron_window] check is key pressed
int IsKeyPressed(KeyCode keycode);
// [iron_window] check is key released after pressed
int IsKeyReleased(KeyCode keycode);
// [iron_window] check is mouse button pressed
int IsMouseButtonPressed(MouseButton mouse_button);
// [iron_window] check is mouse button released
int IsMouseButtonReleased(MouseButton mouse_button);
// [iron_window] get mouse cursor position
V2f GetMousePosition();
// [iron_window] get mouse scroll roll
float GetScrollYOffset();
然後在WINDOW
这个结构存取使用者的状态。关於KeyCode
跟MouseButton
这两个enum,我在iron_types.h
把glfw
定义的按键ID再复制一份到enum里面,ID的定义可以参考glfw3.h
的363行开始,然後利用这两个enum定义出两个这个阵列存在WINDOW
里,用於纪录每个按键的状态。
之後再依照glfw
文件上处理callback的方式,完成这些功能了。
正要测试的时候发现到一点,我的KeyReleased
跟MouseButtonReleased
如果没按下去,就会一直触发状态(这不是废话吗~),但我想要的是按下之後,放开时要触发。
於是我的处理方法也很简单,直接加上一个跟按键状态同大小的阵列,每一个GameLoop都去比较之前是有按过还是没按过。最後当Game Loop结束的时候,在EndScene
函式里面更新按键的状态。
// iron_window.EndScene
glfwSwapBuffers(WINDOW.wnd);
// reset input state
// must put before call `glfwPollEvents`
// keyboard
for (int i = 0; i < MAX_KEY_CODE; i++) {
WINDOW.Keyboard.key_previous_state[i] = WINDOW.Keyboard.key_current_state[i];
}
// mouse
for (int i = 0; i < MAX_MOUSE_BUTTON; i++) {
WINDOW.Mouse.mouse_btn_previous_state[i] = WINDOW.Mouse.mouse_btn_current_state[i];
}
WINDOW.Mouse.scroll_offset = 0.0f;
glfwPollEvents();
这样基本上就大功告成了...
大家早安阿! 来到我们冒险的第三天了,今天我要继续来介绍HTML的其他常用元素,还没看过昨天的建议先...
接下来要玩 Scale ,讲者提供一个最简单的例子。 左边的方块,Y 值改变的时候,右边的方块的 S...
昨天聊过 abstract constract,今天来聊聊 interfaces。 在 OOP 语言...
接下来我们使用物件来写一个游戏中的玩家设计 ...
ID选择器(ID selector) : 符合指定id的HTML元素做为要套用样式规则的对象,命名格...