Key and Mouse Codes

引言

上一节我们看了输入轮询,本节我们继续深入创造我们引擎自己的键盘与鼠标代码。

现在存在的问题在于我们的代码过于依赖 glfw,这意味着开发者必须非常了解 glfw 而不仅仅是我们的引擎,我们希望开发者包含的唯一内容就是我们的引擎。

所以今天我们要消除对 glfw 的直接依赖,同时确保不管我们在后端最终使用什么图形库都有一种可以访问的密钥集。

键鼠映射

Infinite/ 文件夹下新建 KeyCodes.h,键盘映射我们可以拷贝头文件 glfw.h

#pragma once

// From glfw3.h
#define IFN_KEY_SPACE 32
#define IFN_KEY_APOSTROPHE 39 /* ' */
#define IFN_KEY_COMMA 44 /* , */
#define IFN_KEY_MINUS 45 /* - */
#define IFN_KEY_PERIOD 46 /* . */
#define IFN_KEY_SLASH 47 /* / */
#define IFN_KEY_0 48
#define IFN_KEY_1 49
#define IFN_KEY_2 50
#define IFN_KEY_3 51
#define IFN_KEY_4 52
#define IFN_KEY_5 53
#define IFN_KEY_6 54
#define IFN_KEY_7 55
#define IFN_KEY_8 56
#define IFN_KEY_9 57
#define IFN_KEY_SEMICOLON 59 /* ; */
#define IFN_KEY_EQUAL 61 /* = */
#define IFN_KEY_A 65
#define IFN_KEY_B 66
#define IFN_KEY_C 67
#define IFN_KEY_D 68
#define IFN_KEY_E 69
#define IFN_KEY_F 70
#define IFN_KEY_G 71
#define IFN_KEY_H 72
#define IFN_KEY_I 73
#define IFN_KEY_J 74
#define IFN_KEY_K 75
#define IFN_KEY_L 76
#define IFN_KEY_M 77
#define IFN_KEY_N 78
#define IFN_KEY_O 79
#define IFN_KEY_P 80
#define IFN_KEY_Q 81
#define IFN_KEY_R 82
#define IFN_KEY_S 83
#define IFN_KEY_T 84
#define IFN_KEY_U 85
#define IFN_KEY_V 86
#define IFN_KEY_W 87
#define IFN_KEY_X 88
#define IFN_KEY_Y 89
#define IFN_KEY_Z 90
#define IFN_KEY_LEFT_BRACKET 91 /* [ */
#define IFN_KEY_BACKSLASH 92 /* \ */
#define IFN_KEY_RIGHT_BRACKET 93 /* ] */
#define IFN_KEY_GRAVE_ACCENT 96 /* ` */
#define IFN_KEY_WORLD_1 161 /* non-US #1 */
#define IFN_KEY_WORLD_2 162 /* non-US #2 */

/* Function keys */
#define IFN_KEY_ESCAPE 256
#define IFN_KEY_ENTER 257
#define IFN_KEY_TAB 258
#define IFN_KEY_BACKSPACE 259
#define IFN_KEY_INSERT 260
#define IFN_KEY_DELETE 261
#define IFN_KEY_RIGHT 262
#define IFN_KEY_LEFT 263
#define IFN_KEY_DOWN 264
#define IFN_KEY_UP 265
#define IFN_KEY_PAGE_UP 266
#define IFN_KEY_PAGE_DOWN 267
#define IFN_KEY_HOME 268
#define IFN_KEY_END 269
#define IFN_KEY_CAPS_LOCK 280
#define IFN_KEY_SCROLL_LOCK 281
#define IFN_KEY_NUM_LOCK 282
#define IFN_KEY_PRINT_SCREEN 283
#define IFN_KEY_PAUSE 284
#define IFN_KEY_F1 290
#define IFN_KEY_F2 291
#define IFN_KEY_F3 292
#define IFN_KEY_F4 293
#define IFN_KEY_F5 294
#define IFN_KEY_F6 295
#define IFN_KEY_F7 296
#define IFN_KEY_F8 297
#define IFN_KEY_F9 298
#define IFN_KEY_F10 299
#define IFN_KEY_F11 300
#define IFN_KEY_F12 301
#define IFN_KEY_F13 302
#define IFN_KEY_F14 303
#define IFN_KEY_F15 304
#define IFN_KEY_F16 305
#define IFN_KEY_F17 306
#define IFN_KEY_F18 307
#define IFN_KEY_F19 308
#define IFN_KEY_F20 309
#define IFN_KEY_F21 310
#define IFN_KEY_F22 311
#define IFN_KEY_F23 312
#define IFN_KEY_F24 313
#define IFN_KEY_F25 314
#define IFN_KEY_KP_0 320
#define IFN_KEY_KP_1 321
#define IFN_KEY_KP_2 322
#define IFN_KEY_KP_3 323
#define IFN_KEY_KP_4 324
#define IFN_KEY_KP_5 325
#define IFN_KEY_KP_6 326
#define IFN_KEY_KP_7 327
#define IFN_KEY_KP_8 328
#define IFN_KEY_KP_9 329
#define IFN_KEY_KP_DECIMAL 330
#define IFN_KEY_KP_DIVIDE 331
#define IFN_KEY_KP_MULTIPLY 332
#define IFN_KEY_KP_SUBTRACT 333
#define IFN_KEY_KP_ADD 334
#define IFN_KEY_KP_ENTER 335
#define IFN_KEY_KP_EQUAL 336
#define IFN_KEY_LEFT_SHIFT 340
#define IFN_KEY_LEFT_CONTROL 341
#define IFN_KEY_LEFT_ALT 342
#define IFN_KEY_LEFT_SUPER 343
#define IFN_KEY_RIGHT_SHIFT 344
#define IFN_KEY_RIGHT_CONTROL 345
#define IFN_KEY_RIGHT_ALT 346
#define IFN_KEY_RIGHT_SUPER 347
#define IFN_KEY_MENU 348

Infinite/ 文件夹下新建 MouseButtonCodes.h,鼠标映射也是同理:

#pragma once

// From glfw3.h
#define IFN_MOUSE_BUTTON_1 0
#define IFN_MOUSE_BUTTON_2 1
#define IFN_MOUSE_BUTTON_3 2
#define IFN_MOUSE_BUTTON_4 3
#define IFN_MOUSE_BUTTON_5 4
#define IFN_MOUSE_BUTTON_6 5
#define IFN_MOUSE_BUTTON_7 6
#define IFN_MOUSE_BUTTON_8 7
#define IFN_MOUSE_BUTTON_LAST IFN_MOUSE_BUTTON_8
#define IFN_MOUSE_BUTTON_LEFT IFN_MOUSE_BUTTON_1
#define IFN_MOUSE_BUTTON_RIGHT IFN_MOUSE_BUTTON_2
#define IFN_MOUSE_BUTTON_MIDDLE IFN_MOUSE_BUTTON_3

接着在 Infinite.h 中引入两个映射表:

#pragma once

//For use by Infinite Applications

#include "Application.h"
#include "Layer.h"
#include "Log.h"
#include "Core.h"

#include "Input.h"
+#include "KeyCodes.h"
+#include "MouseButtonCodes.h"

#include <stdio.h>

#include "ImGui/ImGuiLayer.h"

//--------------------- Entry Point ---------------------//
#include "EntryPoint.h"
//-------------------------------------------------------//

调试

Sandbox.cpp 中添加测试:

void OnUpdate() override
{
// IFN_INFO("ExampleLayer::Update");

if (Infinite::Input::IsKeyPressed(IFN_KEY_TAB))
IFN_INFO("Tab key is pressed!");
}

void OnEvent(Infinite::Event& event) override
{
if (event.GetEventType() == Infinite::EventType::KeyPressed)
{
Infinite::KeyPressedEvent& e = (Infinite::KeyPressedEvent&)event;
IFN_TRACE("{0}", (char)e.GetKeyCode());
}
}

void OnUpdate() override
{
// IFN_INFO("ExampleLayer::Update");

if (Infinite::Input::IsKeyPressed(IFN_KEY_TAB))
IFN_INFO("Tab key is pressed (poll)!");
}

void OnEvent(Infinite::Event& event) override
{
if (event.GetEventType() == Infinite::EventType::KeyPressed)
{
Infinite::KeyPressedEvent& e = (Infinite::KeyPressedEvent&)event;
if (Infinite::Input::IsKeyPressed(IFN_KEY_TAB))
IFN_INFO("Tab key is pressed (event)!");

IFN_TRACE("{0}", (char)e.GetKeyCode());
}
}