diff options
author | uruk | 2014-06-01 21:44:07 +0200 |
---|---|---|
committer | uruk | 2014-06-01 21:44:07 +0200 |
commit | 8eb6a4db8bb73df76c5cc1d90775d0925a5a6adb (patch) | |
tree | b23c8a4daf2347b4bcfee0eac9eb1f729e37c79e /engines/cge2/events.cpp | |
parent | 82898716cf24098e664211a5e2f904f9fe98d2d5 (diff) | |
download | scummvm-rg350-8eb6a4db8bb73df76c5cc1d90775d0925a5a6adb.tar.gz scummvm-rg350-8eb6a4db8bb73df76c5cc1d90775d0925a5a6adb.tar.bz2 scummvm-rg350-8eb6a4db8bb73df76c5cc1d90775d0925a5a6adb.zip |
CGE2: Add display of mouse cursor.
The actual click-handling is not working yet.
Diffstat (limited to 'engines/cge2/events.cpp')
-rw-r--r-- | engines/cge2/events.cpp | 174 |
1 files changed, 169 insertions, 5 deletions
diff --git a/engines/cge2/events.cpp b/engines/cge2/events.cpp index 670ea61c93..5c0300f1e1 100644 --- a/engines/cge2/events.cpp +++ b/engines/cge2/events.cpp @@ -63,23 +63,187 @@ void Keyboard::newKeyboard(Common::Event &event) { /*----------------- MOUSE interface -----------------*/ Mouse::Mouse(CGE2Engine *vm) : Sprite(vm), _busy(NULL), _hold(NULL), _hx(0), _vm(vm) { - warning("STUB: Mouse::Mouse() - Recheck the whole implementation!!!"); + _hold = NULL; + _hx = 0; + _hy = 0; + _exist = true; + _buttons = 0; + _busy = NULL; + _active = false; + _flags._kill = false; + + setSeq(_stdSeq8); + + BitmapPtr *MC = new BitmapPtr[3]; + MC[0] = new Bitmap(_vm, "MOUSE"); + MC[1] = new Bitmap(_vm, "DUMMY"); + MC[2] = NULL; + setShapeList(MC, 2); + + step(1); + on(); + off(); } Mouse::~Mouse() { - warning("STUB: Mouse::~Mouse()"); + off(); } void Mouse::on() { - warning("STUB: Mouse::on()"); + if (_seqPtr && _exist) { + _active = true; + step(0); + if (_busy) + _busy->step(0); + } } void Mouse::off() { - warning("STUB: Mouse::off()"); + if (_seqPtr == 0) { + if (_exist) { + _active = false; + } + + step(1); + if (_busy) + _busy->step(1); + } } void Mouse::newMouse(Common::Event &event) { - warning("STUB: Mouse::newMouse()"); + if (!_active) + return; + + CGE2Event &evt = _vm->_eventManager->getNextEvent(); + evt._x = event.mouse.x; + evt._y = event.mouse.y; + evt._keyCode = Common::KEYCODE_INVALID; + evt._spritePtr = _vm->spriteAt(evt._x, evt._y); + + switch (event.type) { + case Common::EVENT_MOUSEMOVE: + evt._mask = kMouseRoll; + break; + case Common::EVENT_LBUTTONDOWN: + evt._mask = kMouseLeftDown; + _buttons |= 1; + break; + case Common::EVENT_LBUTTONUP: + evt._mask = kMouseLeftUp; + _buttons &= ~1; + break; + case Common::EVENT_RBUTTONDOWN: + evt._mask = kMouseRightDown; + _buttons |= 2; + break; + case Common::EVENT_RBUTTONUP: + evt._mask = kMouseRightUp; + _buttons &= ~2; + break; + default: + break; + } +} + +/*----------------- EventManager interface -----------------*/ + +EventManager::EventManager(CGE2Engine *vm) : _vm(vm){ + _eventQueueHead = 0; + _eventQueueTail = 0; + memset(&_eventQueue, 0, kEventMax * sizeof(CGE2Event)); + memset(&_event, 0, sizeof(Common::Event)); +} + +void EventManager::poll() { + while (g_system->getEventManager()->pollEvent(_event)) { + switch (_event.type) { + case Common::EVENT_KEYDOWN: + case Common::EVENT_KEYUP: + // Handle keyboard events + _vm->_keyboard->newKeyboard(_event); + handleEvents(); + break; + case Common::EVENT_MOUSEMOVE: + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONDOWN: + case Common::EVENT_RBUTTONUP: + // Handle mouse events + _vm->_mouse->newMouse(_event); + handleEvents(); + break; + default: + break; + } + } +} + +void EventManager::handleEvents() { + while (_eventQueueTail != _eventQueueHead) { + CGE2Event e = _eventQueue[_eventQueueTail]; + if (e._mask) { + if (_vm->_mouse->_hold && e._spritePtr != _vm->_mouse->_hold) + _vm->_mouse->_hold->touch(e._mask | kEventAttn, e._x - _vm->_mouse->_hold->_pos2D.x, e._y - _vm->_mouse->_hold->_pos2D.y, e._keyCode); + + // update mouse cursor position + if (e._mask & kMouseRoll) + _vm->_mouse->gotoxyz(e._x, kWorldHeight - e._y); + + // activate current touched SPRITE + if (e._spritePtr) { + if (e._mask & kEventKeyb) + e._spritePtr->touch(e._mask, e._x, e._y, e._keyCode); + else + e._spritePtr->touch(e._mask, e._x - e._spritePtr->_pos2D.x, e._y - e._spritePtr->_pos2D.y, e._keyCode); + } else if (_vm->_sys) + _vm->_sys->touch(e._mask, e._x, e._y, e._keyCode); + + if (e._mask & kMouseLeftDown) { + _vm->_mouse->_hold = e._spritePtr; + if (_vm->_mouse->_hold) { + _vm->_mouse->_hold->_flags._hold = true; + + if (_vm->_mouse->_hold->_flags._drag) { + _vm->_mouse->_hx = e._x - _vm->_mouse->_hold->_pos2D.x; + _vm->_mouse->_hy = e._y - _vm->_mouse->_hold->_pos2D.y; + } + } + } + + if (e._mask & kMouseLeftUp) { + if (_vm->_mouse->_hold) { + _vm->_mouse->_hold->_flags._hold = false; + _vm->_mouse->_hold = NULL; + } + } + ///Touched = e.Ptr; + + // discard Text if button released + if (e._mask & (kMouseLeftUp | kMouseRightUp)) + _vm->killText(); + } + _eventQueueTail = (_eventQueueTail + 1) % kEventMax; + } + if (_vm->_mouse->_hold) { + if (_vm->_mouse->_hold->_flags._drag) + _vm->_mouse->_hold->gotoxyz(_vm->_mouse->_pos2D.x - _vm->_mouse->_hx, kWorldHeight - _vm->_mouse->_pos2D.y - _vm->_mouse->_hy); + } +} + +void EventManager::clearEvent(Sprite *spr) { + if (spr) { + for (uint16 e = _eventQueueTail; e != _eventQueueHead; e = (e + 1) % kEventMax) + if (_eventQueue[e]._spritePtr == spr) + _eventQueue[e]._mask = 0; + } else + _eventQueueTail = _eventQueueHead; +} + +CGE2Event &EventManager::getNextEvent() { + CGE2Event &evt = _eventQueue[_eventQueueHead]; + _eventQueueHead = (_eventQueueHead + 1) % kEventMax; + + return evt; } } // End of namespace CGE2 |