Files
PlanetFleet/eventListener.cpp
T
devZoGok 179f4c28ac factored out a state manager
using GameManager via a singleton
2021-10-30 08:09:30 +03:00

110 lines
4.3 KiB
C++

#include "eventListener.h"
#include "stateManager.h"
using namespace irr;
namespace game{
namespace core{
EventListener::EventListener(GameManager* gM) {
gameManager = gM;
}
EventListener::~EventListener() {}
bool EventListener::OnEvent(const SEvent& event) {
int offsetTrigger = -1;
StateManager *stateManager = GameManager::getSingleton()->getStateManager();
if (event.EventType == EET_KEY_INPUT_EVENT) {
for (int i = 0; i < stateManager->getAppStateNumber(); i++) {
for (Key *k : stateManager->getAppState(i)->getKeys()) {
if (k->key && k->trigger == event.KeyInput.Key) {
if (!k->analog) {
if (!event.KeyInput.PressedDown)
k->beingUsed=false;
if (!k->beingUsed) {
if (event.KeyInput.PressedDown)
k->beingUsed=true;
k->pressed=event.KeyInput.PressedDown;
stateManager->getAppState(i)->onAction(k->bind, k->pressed);
}
} else {
k->pressed=event.KeyInput.PressedDown;
stateManager->getAppState(i)->onAnalog(k->bind, 0.);
}
}
stateManager->getAppState(i)->onRawKeyPress(event.KeyInput);
}
}
}
else if (event.EventType == EET_MOUSE_INPUT_EVENT && event.MouseInput.Event != EMIE_MOUSE_MOVED) {
bool isPressed = false;
switch (event.MouseInput.Event) {
case EMIE_LMOUSE_PRESSED_DOWN:
offsetTrigger = 0;
isPressed = true;
break;
case EMIE_LMOUSE_LEFT_UP:
offsetTrigger = 0;
isPressed = false;
break;
case EMIE_MMOUSE_PRESSED_DOWN:
offsetTrigger = 1;
isPressed = true;
break;
case EMIE_MMOUSE_LEFT_UP:
offsetTrigger = 1;
isPressed = false;
break;
case EMIE_RMOUSE_PRESSED_DOWN:
offsetTrigger = 2;
isPressed = true;
break;
case EMIE_RMOUSE_LEFT_UP:
offsetTrigger = 2;
isPressed = false;
break;
case EMIE_MOUSE_WHEEL:
if (event.MouseInput.Wheel == 1)
offsetTrigger = 3;
else
offsetTrigger = 4;
break;
}
for (int i = 0; i < stateManager->getAppStateNumber(); i++) {
for (Key *k : stateManager->getAppState(i)->getKeys()) {
if (offsetTrigger == k->trigger) {
if (!k->analog) {
k->pressed=isPressed;
stateManager->getAppState(i)->onAction(k->bind, k->pressed);
} else {
k->beingUsed=isPressed;
}
}
if(offsetTrigger<=2)
stateManager->getAppState(i)->onRawMousePress(event.MouseInput);
}
}
}
return false;
}
void EventListener::update() {
StateManager *stateManager = GameManager::getSingleton()->getStateManager();
for (int i = 0; i < stateManager->getAppStateNumber(); i++) {
for (Key *k : stateManager->getAppState(i)->getKeys()) {
if (k->beingUsed && k->analog) {
stateManager->getAppState(i)->onAnalog(k->bind, 0.);
}
}
}
}
}
}