EventHandler továbbírva
This commit is contained in:
parent
cf18cd4e84
commit
11178a3ce8
@ -9,9 +9,6 @@ namespace eg3d {
|
|||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
initDrawObjects();
|
initDrawObjects();
|
||||||
|
|
||||||
rotAngle = 0.0f;
|
|
||||||
camPosition = 0.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -376,7 +373,7 @@ namespace eg3d {
|
|||||||
|
|
||||||
void DXWindow::updateConstantBuffers()
|
void DXWindow::updateConstantBuffers()
|
||||||
{
|
{
|
||||||
DirectX::XMStoreFloat4x4(&constantBuffer.transformMatrix, XMMatrixRotationX(-XM_PIDIV2));
|
DirectX::XMStoreFloat4x4(&constantBuffer.transformMatrix, XMMatrixTranspose(XMMatrixRotationX(-XM_PIDIV2)));
|
||||||
|
|
||||||
// TODO vetítés mátrixának kicserélése
|
// TODO vetítés mátrixának kicserélése
|
||||||
float viewHeight = 1.5;
|
float viewHeight = 1.5;
|
||||||
|
164
EventHandler.cpp
164
EventHandler.cpp
@ -5,6 +5,19 @@
|
|||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include <hidusage.h>
|
#include <hidusage.h>
|
||||||
|
|
||||||
|
eg3d::CB_AssigmentData::CB_AssigmentData()
|
||||||
|
{
|
||||||
|
loadDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
void eg3d::CB_AssigmentData::loadDefaults()
|
||||||
|
{
|
||||||
|
eventType = ET_None;
|
||||||
|
pcbFunction = nullptr;
|
||||||
|
pUser = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
eg3d::EventHandler::EventHandler() {
|
eg3d::EventHandler::EventHandler() {
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -13,8 +26,6 @@ void eg3d::EventHandler::init()
|
|||||||
{
|
{
|
||||||
mCamVelocity = 0.0f; // kamera sebességének inicializációja
|
mCamVelocity = 0.0f; // kamera sebességének inicializációja
|
||||||
mMouseLocked = false; // nincs befogva az egér
|
mMouseLocked = false; // nincs befogva az egér
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float eg3d::EventHandler::getCamVelocity() const
|
float eg3d::EventHandler::getCamVelocity() const
|
||||||
@ -22,18 +33,45 @@ float eg3d::EventHandler::getCamVelocity() const
|
|||||||
return mCamVelocity;
|
return mCamVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void eg3d::EventHandler::regKeyCB(char key, const CB_AssigmentData& cbAData)
|
||||||
|
{
|
||||||
|
mKeyAssigments.insert(std::pair<char, CB_AssigmentData>(key, cbAData));
|
||||||
|
}
|
||||||
|
|
||||||
|
void eg3d::EventHandler::regMouseCB(EventType et, const CB_AssigmentData& cbAData)
|
||||||
|
{
|
||||||
|
mMouseAssignments.insert(std::pair<EventType, CB_AssigmentData>(et, cbAData));
|
||||||
|
}
|
||||||
|
|
||||||
|
eg3d::MouseDisplacement eg3d::EventHandler::getMouseDisplacement()
|
||||||
|
{
|
||||||
|
MouseDisplacement md = mMouseDisplacement;
|
||||||
|
|
||||||
|
mMouseDisplacement.dx = 0;
|
||||||
|
mMouseDisplacement.dy = 0;
|
||||||
|
|
||||||
|
return md;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------
|
// -----------------------------------
|
||||||
|
|
||||||
int eg3d::EventHandler::processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
int eg3d::EventHandler::processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||||
// TODO eseménykezelés megvalósítása
|
// TODO eseménykezelés megvalósítása
|
||||||
EventHandler * pThis_EH = static_cast<Window *>((void *)GetWindowLongPtrA(hwnd, GWLP_USERDATA))->getEventHandler(); // ablakhoz rendelt eseménykezelõ elkérése
|
Window * pWindow = static_cast<Window *>((void *)GetWindowLongPtrA(hwnd, GWLP_USERDATA));
|
||||||
|
EventHandler * pThis_EH = pWindow->getEventHandler(); // ablakhoz rendelt eseménykezelõ elkérése
|
||||||
|
|
||||||
UINT rawDataLength = 64;
|
UINT rawDataLength = 64;
|
||||||
BYTE pRawData[64];
|
BYTE pRawData[64];
|
||||||
|
|
||||||
|
EventType et;
|
||||||
|
|
||||||
switch (message)
|
switch (message)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// ----------------
|
||||||
|
// RAW-INPUT KEZELÉSE
|
||||||
|
// ----------------
|
||||||
|
|
||||||
case WM_INPUT:
|
case WM_INPUT:
|
||||||
{
|
{
|
||||||
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, pRawData, &rawDataLength, sizeof(RAWINPUTHEADER));
|
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, pRawData, &rawDataLength, sizeof(RAWINPUTHEADER));
|
||||||
@ -45,39 +83,113 @@ int eg3d::EventHandler::processEvent(HWND hwnd, UINT message, WPARAM wParam, LPA
|
|||||||
int displacementX = pRawInput->data.mouse.lLastX;
|
int displacementX = pRawInput->data.mouse.lLastX;
|
||||||
int displacementY = pRawInput->data.mouse.lLastY;
|
int displacementY = pRawInput->data.mouse.lLastY;
|
||||||
|
|
||||||
LOG(std::string("(") + std::to_string(displacementX) + ", " + std::to_string(displacementY) + ")");
|
pThis_EH->mMouseDisplacement.dx += displacementX;
|
||||||
|
pThis_EH->mMouseDisplacement.dy += displacementY;
|
||||||
|
|
||||||
|
//LOG(std::string("(") + std::to_string(displacementX) + ", " + std::to_string(displacementY) + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// ----------------
|
||||||
|
// EGÉRESEMÉNYEK KEZELÉSE
|
||||||
|
// ----------------
|
||||||
|
|
||||||
|
case WM_LBUTTONDOWN:
|
||||||
|
et = ET_LMouseDown;
|
||||||
|
case WM_LBUTTONUP:
|
||||||
|
et = ET_LMouseUp;
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
et = ET_RMouseDown;
|
||||||
|
case WM_RBUTTONUP: {
|
||||||
|
et = ET_RMouseUp;
|
||||||
|
|
||||||
|
auto assigments = mMouseAssignments.equal_range(et); // hozzárendelések elkérése
|
||||||
|
auto rangeBegin = assigments.first;
|
||||||
|
auto rangeEnd = assigments.second;
|
||||||
|
|
||||||
|
if (rangeBegin == rangeEnd) // ha nincs találat, akkor kilépünk
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// esemény-adatok kitöltése
|
||||||
|
EventHandlerCBData cbData;
|
||||||
|
|
||||||
|
cbData.pEH = pThis_EH; // eseménykezelõ pointere
|
||||||
|
cbData.eventType = et; // esemény típusa
|
||||||
|
|
||||||
|
cbData.hwnd = hwnd; // ablak fogantyúja
|
||||||
|
cbData.message = message; // üzenet
|
||||||
|
cbData.wParam = wParam; // ...
|
||||||
|
cbData.lParam = lParam; // ...
|
||||||
|
|
||||||
|
for (auto iter = rangeBegin; iter != rangeEnd; iter++)
|
||||||
|
{
|
||||||
|
cbData.pUser = iter->second.pUser; // elõre definiált pointer beállítása
|
||||||
|
iter->second.pcbFunction(&cbData); // függvény meghívása
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------
|
||||||
|
// BILLENTYÛZET-KEZELÉS
|
||||||
|
// ----------------
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
{
|
{
|
||||||
switch (wParam)
|
et = ET_KeyDown; // esemény típusának beállítása
|
||||||
{
|
|
||||||
case 'W':
|
if (wParam == 'L') {
|
||||||
pThis_EH->mCamVelocity = -cCAM_VELOCITY;
|
|
||||||
break;
|
|
||||||
case 'S':
|
|
||||||
pThis_EH->mCamVelocity = cCAM_VELOCITY;
|
|
||||||
break;
|
|
||||||
case 'L':
|
|
||||||
pThis_EH->mMouseLocked = !pThis_EH->mMouseLocked;
|
pThis_EH->mMouseLocked = !pThis_EH->mMouseLocked;
|
||||||
LOG(std::string("Mouse ") + (pThis_EH->mMouseLocked ? "" : "un") + "locked");
|
|
||||||
break;
|
bool locked = pThis_EH->mMouseLocked;
|
||||||
|
|
||||||
|
LOG(std::string("Mouse ") + (locked ? "" : "un") + "locked");
|
||||||
|
|
||||||
|
if (locked == true) {
|
||||||
|
RECT clipRect = pWindow->getRect();
|
||||||
|
|
||||||
|
LONG width = clipRect.right - clipRect.left;
|
||||||
|
LONG height = clipRect.bottom - clipRect.top;
|
||||||
|
|
||||||
|
clipRect.top += height / 2;
|
||||||
|
clipRect.bottom = clipRect.top + 1;
|
||||||
|
clipRect.left += width / 2;
|
||||||
|
clipRect.right = clipRect.left + 1;
|
||||||
|
|
||||||
|
ClipCursor(&clipRect);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ClipCursor(nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} // DIRECT NINCS BREAK
|
||||||
|
case WM_KEYUP: {
|
||||||
|
et = ET_KeyUp; // esemény típusának beállítása
|
||||||
|
|
||||||
}
|
// esemény lekezelése
|
||||||
break;
|
if (mKeyAssigments.find(wParam) != mKeyAssigments.end())
|
||||||
|
|
||||||
case WM_KEYUP:
|
|
||||||
{
|
|
||||||
if (wParam == 'W' || wParam == 'S')
|
|
||||||
{
|
{
|
||||||
pThis_EH->mCamVelocity = 0.0f;
|
CB_AssigmentData cbAData = mKeyAssigments[wParam];
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
EventHandlerCBData cbData;
|
||||||
|
|
||||||
|
cbData.pEH = pThis_EH; // eseménykezelõ pointere
|
||||||
|
cbData.eventType = et; // esemény típusa
|
||||||
|
cbData.pUser = cbAData.pUser; // elõre definiált pointer
|
||||||
|
|
||||||
|
cbData.hwnd = hwnd; // ablak fogantyúja
|
||||||
|
cbData.message = message; // üzenet
|
||||||
|
cbData.wParam = wParam; // ...
|
||||||
|
cbData.lParam = lParam; // ...
|
||||||
|
|
||||||
|
cbAData.pcbFunction(&cbData);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1,21 +1,67 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
#include <map>
|
||||||
|
#include "IHasDefault.h"
|
||||||
|
|
||||||
namespace eg3d {
|
namespace eg3d {
|
||||||
|
|
||||||
|
class EventHandler;
|
||||||
|
|
||||||
|
// esemény-típusok
|
||||||
|
enum EventType { ET_KeyUp, ET_KeyDown, ET_LMouseDown, ET_LMouseUp, ET_RMouseDown, ET_RMouseUp, ET_MouseMove, ET_None };
|
||||||
|
|
||||||
|
// esemény-callback adat
|
||||||
|
struct EventHandlerCBData
|
||||||
|
{
|
||||||
|
EventHandler * pEH; // eseménykezelõ pointere
|
||||||
|
EventType eventType; // lenyomás vagy felengedés
|
||||||
|
void * pUser; // egyéb információ
|
||||||
|
int data[4]; // egyéb adat
|
||||||
|
|
||||||
|
HWND hwnd; // ablak fogantyúja
|
||||||
|
UINT message; // üzenet
|
||||||
|
WPARAM wParam; // ...
|
||||||
|
LPARAM lParam; // ...
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (CB_EH)(EventHandlerCBData *); // callback-függvény típusa
|
||||||
|
|
||||||
|
struct CB_AssigmentData : public IHasDefault // hozzárendelési struktúra
|
||||||
|
{
|
||||||
|
EventType eventType; // esemény típusa, melyhez hozzárendelünk
|
||||||
|
CB_EH * pcbFunction; // callback-függvény pointere
|
||||||
|
void * pUser; // tetszõleges adat pointere
|
||||||
|
|
||||||
|
CB_AssigmentData(); // konstr.
|
||||||
|
void loadDefaults() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MouseDisplacement // egér-elmozdulás objektuma
|
||||||
|
{
|
||||||
|
int dx, dy;
|
||||||
|
};
|
||||||
|
|
||||||
class EventHandler {
|
class EventHandler {
|
||||||
private:
|
private:
|
||||||
float mCamVelocity; // kamera mozgási sebessége
|
float mCamVelocity; // kamera mozgási sebessége
|
||||||
bool mMouseLocked; // lockolvan van az egér?
|
bool mMouseLocked; // lockolvan van az egér?
|
||||||
|
|
||||||
void init(); // osztály inicializálása
|
void init(); // osztály inicializálása
|
||||||
|
|
||||||
|
std::multimap<EventType, CB_AssigmentData> mMouseAssignments; // egér-hozzárendelések
|
||||||
|
std::multimap<char, CB_AssigmentData> mKeyAssigments; // billentyû-hozzárendelések
|
||||||
|
MouseDisplacement mMouseDisplacement; //
|
||||||
public:
|
public:
|
||||||
static constexpr float cCAM_VELOCITY = 0.05;
|
static constexpr float cCAM_VELOCITY = 0.05;
|
||||||
|
|
||||||
EventHandler(); // konstr.
|
EventHandler(); // konstr.
|
||||||
int processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // esemény feldolgozása (0 -> feldolgozva, 1 -> nincs feldolgozva)
|
int processEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); // esemény feldolgozása (0 -> feldolgozva, 1 -> nincs feldolgozva)
|
||||||
float getCamVelocity() const; // kamera sebességének lekérése
|
float getCamVelocity() const; // kamera sebességének lekérése
|
||||||
|
|
||||||
|
void regKeyCB(char key, const CB_AssigmentData& cbAData); // billentyûesemények hozzárendelése
|
||||||
|
void regMouseCB(EventType et, const CB_AssigmentData& cbAData); // egéresemények hozzárendelése
|
||||||
|
MouseDisplacement getMouseDisplacement(); // egér elmozdulásának elkérése
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
11
main.cpp
11
main.cpp
@ -27,6 +27,11 @@ void CB_FPSaux(eg3d::Timer *pTimer, const double *pTrigTimeElapsed, void *ptr) {
|
|||||||
|
|
||||||
using namespace eg3d;
|
using namespace eg3d;
|
||||||
|
|
||||||
|
void keyCB(EventHandlerCBData * pCBData)
|
||||||
|
{
|
||||||
|
LOG("Key pressed!");
|
||||||
|
}
|
||||||
|
|
||||||
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) {
|
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) {
|
||||||
|
|
||||||
eg3d::DXWindow win; // megjelenítés be, alapértelmezett window procedure használata
|
eg3d::DXWindow win; // megjelenítés be, alapértelmezett window procedure használata
|
||||||
@ -36,6 +41,11 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA
|
|||||||
EventHandler eventHandler;
|
EventHandler eventHandler;
|
||||||
win.setEventHandler(&eventHandler);
|
win.setEventHandler(&eventHandler);
|
||||||
|
|
||||||
|
CB_AssigmentData cbAData;
|
||||||
|
cbAData.pcbFunction = keyCB;
|
||||||
|
cbAData.pUser = nullptr;
|
||||||
|
eventHandler.regKeyCB('Z', cbAData);
|
||||||
|
|
||||||
// FPS-mérő callback-függvény regisztrálása
|
// FPS-mérő callback-függvény regisztrálása
|
||||||
TimerCallbackData timerCBData;
|
TimerCallbackData timerCBData;
|
||||||
timerCBData.callBackFn = CB_FPSaux;
|
timerCBData.callBackFn = CB_FPSaux;
|
||||||
@ -78,7 +88,6 @@ int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszA
|
|||||||
{
|
{
|
||||||
Sleep(15);
|
Sleep(15);
|
||||||
|
|
||||||
win.moveCam(eventHandler.getCamVelocity()); // kamera elmozdítása
|
|
||||||
win.Draw(drawables); // kirajzolás
|
win.Draw(drawables); // kirajzolás
|
||||||
|
|
||||||
gFrames++; // képkockaszám léptetése
|
gFrames++; // képkockaszám léptetése
|
||||||
|
Loading…
x
Reference in New Issue
Block a user