Allow picking up items with a single touch (#29)

* Allow handling middle click events

* Send middle click events when touch starts (Android)

* Punch objects when middle clicking (Touch only, combination with previous change)
This commit is contained in:
sfan5 2016-10-17 22:32:52 +02:00 committed by Maksim Gamarnik
parent 5957cd3ca1
commit b33e6dbcad
4 changed files with 43 additions and 2 deletions

View File

@ -215,6 +215,14 @@ public:
{
return m_receiver->left_active;
}
virtual bool getMiddleState()
{
return m_receiver->middle_active;
}
virtual void resetMiddleState()
{
m_receiver->middle_active = false;
}
virtual bool getRightState()
{
return m_receiver->right_active;
@ -303,6 +311,11 @@ public:
{
return leftdown;
}
virtual bool getMiddleState()
{
return false;
}
virtual void resetMiddleState() {}
virtual bool getRightState()
{
return rightdown;

View File

@ -3670,6 +3670,8 @@ void Game::processPlayerInteraction(GameRunData *runData,
input->resetLeftReleased();
input->resetRightReleased();
input->resetMiddleState();
}
@ -3792,7 +3794,14 @@ void Game::handlePointingAtObject(GameRunData *runData,
runData->selected_object->debugInfoText()));
}
if (input->getLeftState()) {
#ifdef HAVE_TOUCHSCREENGUI
// Interact with object on single touch (touchscreengui.cpp send this event)
bool middle_state = input->getMiddleState();
#else
const bool middle_state = false;
#endif
if (input->getLeftState() || middle_state) {
bool do_punch = false;
bool do_punch_damage = false;
@ -3802,7 +3811,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
runData->object_hit_delay_timer = object_hit_delay;
}
if (input->getLeftClicked())
if (input->getLeftClicked() || middle_state)
do_punch = true;
if (do_punch) {

View File

@ -114,6 +114,8 @@ public:
virtual void setMousePos(s32 x, s32 y) = 0;
virtual bool getLeftState() = 0;
virtual bool getMiddleState() = 0;
virtual void resetMiddleState() = 0; // TODO: handle middle button like all others
virtual bool getRightState() = 0;
virtual bool getLeftClicked() = 0;

View File

@ -611,6 +611,23 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
m_move_downtime = getTimeMs();
m_move_downlocation = v2s32(event.TouchInput.X, event.TouchInput.Y);
m_move_sent_as_mouse_event = false;
// update shootline (in case the game handles the event we send below)
m_shootline = m_device
->getSceneManager()
->getSceneCollisionManager()
->getRayFromScreenCoordinates(m_move_downlocation);
// send a middle click event so the game can handle single touches
SEvent *translated = new SEvent;
memset(translated, 0, sizeof(SEvent));
translated->EventType = EET_MOUSE_INPUT_EVENT;
translated->MouseInput.X = m_move_downlocation.X;
translated->MouseInput.Y = m_move_downlocation.Y;
translated->MouseInput.ButtonStates = EMBSM_MIDDLE; // << important!
translated->MouseInput.Event = EMIE_MMOUSE_LEFT_UP;
m_receiver->OnEvent(*translated);
delete translated;
}
}