Browse Source

Implement virtual gamepad activation/deactivation

pull/3520/head
staphen 4 years ago committed by Anders Jenbo
parent
commit
08e4e8c254
  1. 8
      Source/controls/controller_motion.cpp
  2. 2
      Source/controls/touch/event_handlers.cpp
  3. 52
      Source/controls/touch/gamepad.cpp
  4. 10
      Source/controls/touch/gamepad.h
  5. 5
      Source/diablo.cpp

8
Source/controls/controller_motion.cpp

@ -161,10 +161,10 @@ AxisDirection GetLeftStickOrDpadDirection(bool allowDpad)
bool isRightPressed = stickX >= 0.5 || (allowDpad && IsControllerButtonPressed(ControllerButton_BUTTON_DPAD_RIGHT));
#ifdef VIRTUAL_GAMEPAD
isUpPressed |= VirtualGamepadState.directionPad.isUpPressed;
isDownPressed |= VirtualGamepadState.directionPad.isDownPressed;
isLeftPressed |= VirtualGamepadState.directionPad.isLeftPressed;
isRightPressed |= VirtualGamepadState.directionPad.isRightPressed;
isUpPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isUpPressed;
isDownPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isDownPressed;
isLeftPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isLeftPressed;
isRightPressed |= VirtualGamepadState.isActive && VirtualGamepadState.directionPad.isRightPressed;
#endif
if (isUpPressed) {

2
Source/controls/touch/event_handlers.cpp

@ -119,7 +119,7 @@ void HandleTouchEvent(const SDL_Event &event)
bool VirtualGamepadEventHandler::Handle(const SDL_Event &event)
{
if (!IsAnyOf(event.type, SDL_FINGERDOWN, SDL_FINGERUP, SDL_FINGERMOTION)) {
if (!VirtualGamepadState.isActive || !IsAnyOf(event.type, SDL_FINGERDOWN, SDL_FINGERUP, SDL_FINGERMOTION)) {
VirtualGamepadState.primaryActionButton.didStateChange = false;
VirtualGamepadState.secondaryActionButton.didStateChange = false;
VirtualGamepadState.spellActionButton.didStateChange = false;

52
Source/controls/touch/gamepad.cpp

@ -166,6 +166,43 @@ void InitializeVirtualGamepad()
manaButtonArea.position.y = directionPad.area.position.y - (directionPadSize + padButtonSize + padButtonSpacing) / 2;
manaButtonArea.radius = padButtonSize / 2;
manaButton.isUsable = []() { return !chrflag && !QuestLogIsOpen; };
VirtualGamepadState.isActive = false;
}
void ActivateVirtualGamepad()
{
VirtualGamepadState.isActive = true;
}
void DeactivateVirtualGamepad()
{
VirtualGamepadState.Deactivate();
}
void VirtualGamepad::Deactivate()
{
isActive = false;
menuPanel.Deactivate();
directionPad.Deactivate();
standButton.Deactivate();
primaryActionButton.Deactivate();
secondaryActionButton.Deactivate();
spellActionButton.Deactivate();
cancelButton.Deactivate();
healthButton.Deactivate();
manaButton.Deactivate();
}
void VirtualMenuPanel::Deactivate()
{
charButton.Deactivate();
questsButton.Deactivate();
inventoryButton.Deactivate();
mapButton.Deactivate();
}
void VirtualDirectionPad::UpdatePosition(Point touchCoordinates)
@ -199,4 +236,19 @@ void VirtualDirectionPad::UpdatePosition(Point touchCoordinates)
isRightPressed = PointsRight(angle);
}
void VirtualDirectionPad::Deactivate()
{
position = area.position;
isUpPressed = false;
isDownPressed = false;
isLeftPressed = false;
isRightPressed = false;
}
void VirtualButton::Deactivate()
{
isHeld = false;
didStateChange = false;
}
} // namespace devilution

10
Source/controls/touch/gamepad.h

@ -30,6 +30,7 @@ struct VirtualDirectionPad {
}
void UpdatePosition(Point touchCoordinates);
void Deactivate();
};
struct VirtualButton {
@ -45,6 +46,7 @@ struct VirtualButton {
}
virtual bool Contains(Point point) = 0;
void Deactivate();
};
struct VirtualMenuButton : VirtualButton {
@ -86,6 +88,8 @@ struct VirtualMenuPanel {
: area({ { 0, 0 }, { 0, 0 } })
{
}
void Deactivate();
};
struct VirtualGamepad {
@ -101,12 +105,18 @@ struct VirtualGamepad {
VirtualPadButton healthButton;
VirtualPadButton manaButton;
bool isActive;
VirtualGamepad()
{
}
void Deactivate();
};
void InitializeVirtualGamepad();
void ActivateVirtualGamepad();
void DeactivateVirtualGamepad();
extern VirtualGamepad VirtualGamepadState;

5
Source/diablo.cpp

@ -1521,6 +1521,7 @@ void FreeGameMem()
FreeMonsterSnd();
FreeTownerGFX();
#ifdef VIRTUAL_GAMEPAD
DeactivateVirtualGamepad();
FreeVirtualGamepadGFX();
#endif
}
@ -2042,6 +2043,10 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir)
}
}
#ifdef VIRTUAL_GAMEPAD
ActivateVirtualGamepad();
#endif
if (currlevel >= 17)
music_start(currlevel > 20 ? TMUSIC_L5 : TMUSIC_L6);
else

Loading…
Cancel
Save