Aurora Engine 遊戲引擎入門 13(新增平臺的輸入)
#1 基本的輸入操作,滑鼠,鍵盤
#2 宣告基類,方便後續擴充和修改
#3 新增基於Window的窗體實現類
#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().GetNativeWindow());
auto state = glfwGetKey(window, keycode);
return state == GLFW_PRESS || state == GLFW_REPEAT;
}
bool WindowsInput::IsMouseButtonPressedImpl(int button)
{
auto window = static_cast<GLFWwindow*>(Application::Get().GetWindow().GetNativeWindow());
auto state = glfwGetMouseButton(window, button);
return state == GLFW_PRESS;
}
std::pair<float, float> WindowsInput::GetMousePositionImpl()
{
auto window = static_cast<GLFWwindow*>(Application::Get().GetWindow().GetNativeWindow());
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
return { (float)xpos, (float)ypos };
}
float WindowsInput::GetMouseXImpl()
{
auto [x, y] = GetMousePositionImpl();
return x;
}
float WindowsInput::GetMouseYImpl()
{
auto [x, y] = GetMousePositionImpl();
return y;
}
}
相關文章
- 快速入門 TI 的 Codec Engine
- 【LaTeX入門】13、怎樣在數學環境輸入中文
- IsWorld收藏平臺—使用入門
- VUE 實現 Studio 管理後臺(十二):新增輸入組合,複雜輸入,輸入框 Input 系列Vue
- 高通MDM平臺開發入門
- c++入門:輸入輸出流C++
- 五筆輸入法入門
- 直播電商平臺開發,輸入框的防抖
- H5 遊戲開發:遊戲引擎入門推薦H5遊戲開發遊戲引擎
- ubuntu新增中文輸入法Ubuntu
- 微信公眾平臺開發入門
- .Net平臺下ActiveMQ入門例項MQ
- 度量快速開發平臺——快速入門
- Qt入門(13)——Qt的呼叫退出QT
- Android跨平臺入門:手把手帶你快速入門Flutter!AndroidFlutter
- 直播平臺製作,html+css復刻登入輸入框HTMLCSS
- MySQL入門--儲存引擎MySql儲存引擎
- win10怎麼新增新的輸入法_如何在win10新增輸入法Win10
- Android 2D遊戲引擎AndEngine快速入門教程Android遊戲引擎
- MLFlow機器學習管理平臺入門教程一覽機器學習
- Nucleo入門--004通用輸入輸出
- 自媒體入門基礎知識,教你快速入門自媒體平臺
- SQL Server中的執行引擎入門SQLServer
- njs最詳細的入門手冊:Nginx JavaScript EngineJSNginxJavaScript
- win10增加輸入法的方法_win10輸入法如何新增Win10
- win10搜狗輸入法怎麼新增日語_win10新增日語輸入法的方法Win10
- vue 基礎入門筆記 13Vue筆記
- 基於eui的白鷺引擎H5小遊戲入門總結UIH5遊戲
- MySQL儲存引擎入門介紹MySql儲存引擎
- 全文搜尋引擎 Elasticsearch 入門教程Elasticsearch
- MySQL入門--設定儲存引擎MySql儲存引擎
- imemode 控制輸入法,控制輸入框的輸入法
- C#程式語言及.NET 平臺快速入門指南C#
- 壓力測試平臺(nGrinder)入門到精通教程
- 大資料競賽平臺——Kaggle 入門篇大資料
- 持續整合平臺 01 jenkins 入門介紹Jenkins
- SAP BTP 平臺 CloudFoundry 環境入門級別的介紹Cloud
- win10系統如何新增輸入法_win10電腦怎麼新增輸入法Win10