CGE: Clean eventManager

This commit is contained in:
Strangerke 2011-08-01 09:53:15 +02:00
parent c053762c63
commit 88f6cc9b23
4 changed files with 59 additions and 55 deletions

View File

@ -1696,7 +1696,7 @@ bool CGEEngine::showTitle(const char *name) {
if (_eventManager->_quitFlag)
return false;
}
if (_keyboard->last() == Enter && *_usrFnam)
if (_keyboard->lastKey() == Enter && *_usrFnam)
userOk = true;
}
//Mouse.Off();

View File

@ -33,10 +33,6 @@
namespace CGE {
CGEEvent Evt[EVT_MAX];
uint16 EvtHead = 0, EvtTail = 0;
/*----------------- KEYBOARD interface -----------------*/
const uint16 Keyboard::_code[0x60] = {
@ -85,8 +81,7 @@ const uint16 Keyboard::_scummVmCodes[0x60] = {
0
};
Keyboard::Keyboard() {
_client = NULL;
Keyboard::Keyboard() : _client(NULL) {
Common::set_to(&_key[0], &_key[0x60], false);
_current = 0;
}
@ -139,15 +134,20 @@ void Keyboard::newKeyboard(Common::Event &event) {
_current = Keyboard::_code[keycode];
if (_client) {
CGEEvent &evt = Evt[EvtHead];
EvtHead = (EvtHead + 1) % EVT_MAX;
CGEEvent &evt = _eventManager->getNextEvent();
evt._x = _current; // Keycode
evt._msk = KEYB; // Event mask
evt._ptr = _client; // Sprite pointer
evt._mask = KEYB; // Event mask
evt._spritePtr = _client; // Sprite pointer
}
}
}
uint16 Keyboard::lastKey() {
uint16 cur = _current;
_current = 0;
return cur;
}
/*----------------- MOUSE interface -----------------*/
Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0), _vm(vm) {
@ -185,11 +185,6 @@ Mouse::~Mouse() {
}
//void Mouse::setFun()
//{
//}
void Mouse::on() {
if (_seqPtr && _exist) {
_active = true;
@ -216,30 +211,29 @@ void Mouse::newMouse(Common::Event &event) {
if (!_active)
return;
CGEEvent &evt = Evt[EvtHead];
EvtHead = (EvtHead + 1) % EVT_MAX;
CGEEvent &evt = _eventManager->getNextEvent();
evt._x = event.mouse.x;
evt._y = event.mouse.y;
evt._ptr = spriteAt(evt._x, evt._y);
evt._spritePtr = spriteAt(evt._x, evt._y);
switch (event.type) {
case Common::EVENT_MOUSEMOVE:
evt._msk = ROLL;
evt._mask = ROLL;
break;
case Common::EVENT_LBUTTONDOWN:
evt._msk = L_DN;
evt._mask = L_DN;
_buttons |= 1;
break;
case Common::EVENT_LBUTTONUP:
evt._msk = L_UP;
evt._mask = L_UP;
_buttons &= ~1;
break;
case Common::EVENT_RBUTTONDOWN:
evt._msk = R_DN;
evt._mask = R_DN;
_buttons |= 2;
break;
case Common::EVENT_RBUTTONUP:
evt._msk = R_UP;
evt._mask = R_UP;
_buttons &= ~2;
break;
default:
@ -251,6 +245,8 @@ void Mouse::newMouse(Common::Event &event) {
EventManager::EventManager() {
_quitFlag = false;
_eventQueueHead = 0;
_eventQueueTail = 0;
}
void EventManager::poll() {
@ -282,27 +278,27 @@ void EventManager::poll() {
}
void EventManager::handleEvents() {
while (EvtTail != EvtHead) {
CGEEvent e = Evt[EvtTail];
if (e._msk) {
if (_mouse->_hold && e._ptr != _mouse->_hold)
_mouse->_hold->touch(e._msk | ATTN, e._x - _mouse->_hold->_x, e._y - _mouse->_hold->_y);
while (_eventQueueTail != _eventQueueHead) {
CGEEvent e = _eventQueue[_eventQueueTail];
if (e._mask) {
if (_mouse->_hold && e._spritePtr != _mouse->_hold)
_mouse->_hold->touch(e._mask | ATTN, e._x - _mouse->_hold->_x, e._y - _mouse->_hold->_y);
// update mouse cursor position
if (e._msk & ROLL)
if (e._mask & ROLL)
_mouse->gotoxy(e._x, e._y);
// activate current touched SPRITE
if (e._ptr) {
if (e._msk & KEYB)
e._ptr->touch(e._msk, e._x, e._y);
if (e._spritePtr) {
if (e._mask & KEYB)
e._spritePtr->touch(e._mask, e._x, e._y);
else
e._ptr->touch(e._msk, e._x - e._ptr->_x, e._y - e._ptr->_y);
e._spritePtr->touch(e._mask, e._x - e._spritePtr->_x, e._y - e._spritePtr->_y);
} else if (_sys)
_sys->touch(e._msk, e._x, e._y);
_sys->touch(e._mask, e._x, e._y);
if (e._msk & L_DN) {
_mouse->_hold = e._ptr;
if (e._mask & L_DN) {
_mouse->_hold = e._spritePtr;
if (_mouse->_hold) {
_mouse->_hold->_flags._hold = true;
@ -313,7 +309,7 @@ void EventManager::handleEvents() {
}
}
if (e._msk & L_UP) {
if (e._mask & L_UP) {
if (_mouse->_hold) {
_mouse->_hold->_flags._hold = false;
_mouse->_hold = NULL;
@ -322,10 +318,10 @@ void EventManager::handleEvents() {
///Touched = e.Ptr;
// discard Text if button released
if (e._msk & (L_UP | R_UP))
if (e._mask & (L_UP | R_UP))
killText();
}
EvtTail = (EvtTail + 1) % EVT_MAX;
_eventQueueTail = (_eventQueueTail + 1) % EVT_MAX;
}
if (_mouse->_hold) {
if (_mouse->_hold->_flags._drag)
@ -333,14 +329,20 @@ void EventManager::handleEvents() {
}
}
void EventManager::clrEvt(Sprite *spr) {
void EventManager::clearEvent(Sprite *spr) {
if (spr) {
uint16 e;
for (e = EvtTail; e != EvtHead; e = (e + 1) % EVT_MAX)
if (Evt[e]._ptr == spr)
Evt[e]._msk = 0;
for (e = _eventQueueTail; e != _eventQueueHead; e = (e + 1) % EVT_MAX)
if (_eventQueue[e]._spritePtr == spr)
_eventQueue[e]._mask = 0;
} else
EvtTail = EvtHead;
_eventQueueTail = _eventQueueHead;
}
CGEEvent &EventManager::getNextEvent() {
CGEEvent &evt = _eventQueue[_eventQueueHead];
_eventQueueHead = (_eventQueueHead + 1) % EVT_MAX;
return evt;
}
} // End of namespace CGE

View File

@ -44,20 +44,16 @@ namespace CGE {
class Keyboard {
private:
bool getKey(Common::Event &event, int &cgeCode);
uint16 _current;
public:
static const uint16 _code[0x60];
static const uint16 _scummVmCodes[0x60];
uint16 _current;
Sprite *_client;
bool _key[0x60];
void newKeyboard(Common::Event &event);
uint16 last() {
uint16 cur = _current;
_current = 0;
return cur;
}
uint16 lastKey();
Sprite *setClient(Sprite *spr);
Keyboard();
@ -78,10 +74,10 @@ public:
extern Talk *_talk;
struct CGEEvent {
uint16 _msk;
uint16 _mask;
uint16 _x;
uint16 _y;
Sprite *_ptr;
Sprite *_spritePtr;
};
@ -109,13 +105,19 @@ private:
class EventManager {
private:
Common::Event _event;
CGEEvent _eventQueue[EVT_MAX];
uint16 _eventQueueHead;
uint16 _eventQueueTail;
void handleEvents();
public:
bool _quitFlag;
EventManager();
void poll();
static void clrEvt(Sprite *spr = NULL);
void clearEvent(Sprite *spr);
CGEEvent &getNextEvent();
};
} // End of namespace CGE

View File

@ -771,7 +771,7 @@ void CGEEngine::snKill(Sprite *spr) {
Sprite *nx = spr->_next;
hide1(spr);
_vga->_showQ->remove(spr);
EventManager::clrEvt(spr);
_eventManager->clearEvent(spr);
if (spr->_flags._kill)
delete spr;
else {