[Day6] 初见输入系统

今日目标

  • 键盘滑鼠输入

GLFW Input Callback

第一篇的时候,有简单的介绍glfw管理的一系列输入callback,,我只用了KeyCallback而已,但也只是做了一个简单的ESC离开功能。在源始码的资料夹里,可以看到除了PC电脑的输入装置的处理,glfw还有摇杆的处理

今天会完成几个常用的键盘输入功能,会用到以下这几种Callback

  • Key Callback (键盘输入)
  • Mouse Button Callback (滑鼠按键输入)
  • Mouse Cursor Position Callback (滑鼠游标位置)
  • Mouse Scroll Callback (滑鼠滚轮)

建立简单的Input System

输入功能的方向很简单,尤其是单纯制作最上层游戏逻辑的部分,就是

按了甚麽按键,做甚麽事情;滑鼠移到哪里,做甚麽事情

所以开了几个关於「确定这个输入是按下还是放开」的函式

// [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这个结构存取使用者的状态。关於KeyCodeMouseButton这两个enum,我在iron_types.hglfw定义的按键ID再复制一份到enum里面,ID的定义可以参考glfw3.h的363行开始,然後利用这两个enum定义出两个这个阵列存在WINDOW里,用於纪录每个按键的状态。

之後再依照glfw文件上处理callback的方式,完成这些功能了。

正要测试的时候发现到一点,我的KeyReleasedMouseButtonReleased如果没按下去,就会一直触发状态(这不是废话吗~),但我想要的是按下之後,放开时要触发。

於是我的处理方法也很简单,直接加上一个跟按键状态同大小的阵列,每一个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();

这样基本上就大功告成了...

参考

这是今天的成果


<<:  SystemC: 哈罗,暖个身吧

>>:  Day1. 用户体验设计三大类职能

Day 03:专案01 - 超简单个人履历02 | HTML基本元素

大家早安阿! 来到我们冒险的第三天了,今天我要继续来介绍HTML的其他常用元素,还没看过昨天的建议先...

连续 30 天 玩玩看 ProtoPie - Day 18

接下来要玩 Scale ,讲者提供一个最简单的例子。 左边的方块,Y 值改变的时候,右边的方块的 S...

[区块链&DAPP介绍 Day14] Solidity 教学 - interfaces

昨天聊过 abstract constract,今天来聊聊 interfaces。 在 OOP 语言...

javascript物件教学2

接下来我们使用物件来写一个游戏中的玩家设计 ...

Day20_CSS语法3

ID选择器(ID selector) : 符合指定id的HTML元素做为要套用样式规则的对象,命名格...