简介
本序列由澳大利亚的一个游戏引擎爱好者整理制作,使用了前瞻的语言技术,
经常多次的修改制作,一个个小的知识点贯通,非常具有引导学习意义!
Bilibili站转载学习,非个人研究,鸣谢!
原作者Github
Bilibili直达链接
YouTube直达链接
#1 基本的输入操作,鼠标,键盘
#2 声明基类,方便后续拓展和修改
#3 添加基于Window的窗体实现类
#4 添加鼠标键盘的按键定义
#5 测试按键和输入事件
#1 基本的输入操作,鼠标,键盘
#2 声明基类,方便后续拓展和修改
// Input.h
#pragma once
#include "Aurora/Core.h"
namespace Aurora
{
// AURORA_API 编译的时候会生成dll
// 打包成库,方便二次使用
class AURORA_API Input
{
public:
// inline 是内联函数,防止开辟过多的栈空间,进行编译优化
// inline 的函数一般情况下是函数体比较小,太大的函数使用inline不划算
inline static bool IsKeyPressed(int keyCode) {
return s_Instance->IsKeyPressedImpl(keyCode); }
inline static bool IsMouseButtonPressed(int button) {
return s_Instance->IsMouseButtonPressedImpl(button); }
// pair 标准库tuple派生的2个值的封装,属于攻击模板类
inline static std::pair<float, float> GetMousePosition() {
return s_Instance->GetMousePositionImpl(); }
inline static float GetMouseX() {
return s_Instance->GetMouseXImpl(); }
inline static float GetMouseY() {
return s_Instance->GetMouseYImpl(); }
protected:
virtual bool IsKeyPressedImpl(int keycode) = 0;
virtual bool IsMouseButtonPressedImpl(int button) = 0;
virtual std::pair<float, float> GetMousePositionImpl() = 0;
virtual float GetMouseXImpl() = 0;
virtual float GetMouseYImpl() = 0;
private:
static Input* s_Instance;
};
}
#3 添加基于Window的窗体实现类
// WindowsInput.h
#pragma once
#include "Aurora/Input.h"
namespace Aurora
{
class WindowsInput : public Input
{
protected:
virtual bool IsKeyPressedImpl(int keycode) override;
virtual bool IsMouseButtonPressedImpl(int button) override;
virtual std::pair<float, float> GetMousePositionImpl() override;
virtual float GetMouseXImpl() override;
virtual float GetMouseYImpl() override;
};
}
// WindowsInput.cpp
#include "aopch.h"
#include "WindowsInput.h"
#include "Aurora/Application.h"
#include <GLFW/glfw3.h>
namespace Aurora {
// 全局定义静态单例
Input* Input::s_Instance = new WindowsInput();
bool WindowsInput::IsKeyPressedImpl(int keycode)
{
auto window = static_cast<GLFWwindow*>(Application::Get().GetWindow()