diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt index e4dfe659..f21c0adc 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenButton.kt @@ -70,6 +70,7 @@ abstract class OnScreenButton( * Keeps track of finger when there are multiple touches */ var touchPointerId = -1 + var partnerPointerId = -1 var isEditing = false private set diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt index 8dffbe01..b7fb4a51 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenControllerView.kt @@ -67,8 +67,14 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs button.onFingerUp(x, y) onButtonStateChangedListener?.invoke(button.buttonId, ButtonState.Released) handled = true + } else if (pointerId == button.partnerPointerId) { + button.partnerPointerId = -1 + button.onFingerUp(x, y) + onButtonStateChangedListener?.invoke(button.buttonId, ButtonState.Released) + handled = true } } + MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN -> { if (button.config.enabled && button.isTouched(x, y)) { @@ -79,6 +85,24 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs handled = true } } + + MotionEvent.ACTION_MOVE -> { + if (pointerId == button.touchPointerId) { + for (buttonPair in controls.buttonPairs) { + if (buttonPair.contains(button)) { + for (otherButton in buttonPair) { + if (otherButton != button && otherButton.config.enabled && otherButton.isTouched(x, y)) { + otherButton.partnerPointerId = pointerId + otherButton.onFingerDown(x, y) + performClick() + onButtonStateChangedListener?.invoke(otherButton.buttonId, ButtonState.Pressed) + handled = true + } + } + } + } + } + } } } @@ -126,6 +150,7 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs handled = true } } + MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN -> { if (joystick.config.enabled && joystick.isTouched(x, y)) { @@ -141,6 +166,7 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs handled = true } } + MotionEvent.ACTION_MOVE -> { for (i in 0 until event.pointerCount) { if (event.getPointerId(i) == joystick.touchPointerId) { @@ -166,6 +192,7 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs return@any true } } + MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN -> { if (button.config.enabled && button.isTouched(event.x, event.y)) { @@ -174,6 +201,7 @@ class OnScreenControllerView @JvmOverloads constructor(context : Context, attrs return@any true } } + MotionEvent.ACTION_MOVE -> { if (button.isEditing) { button.edit(event.x, event.y) diff --git a/app/src/main/java/emu/skyline/input/onscreen/OnScreenItemDefinitions.kt b/app/src/main/java/emu/skyline/input/onscreen/OnScreenItemDefinitions.kt index ae3aac85..6a4b3d82 100644 --- a/app/src/main/java/emu/skyline/input/onscreen/OnScreenItemDefinitions.kt +++ b/app/src/main/java/emu/skyline/input/onscreen/OnScreenItemDefinitions.kt @@ -37,7 +37,7 @@ open class CircularButton( /** * Checks if [x] and [y] are within circle */ - override fun isTouched(x : Float, y : Float) : Boolean = PointF(currentX, currentY).minus(PointF(x, y)).length() <= radius + override fun isTouched(x : Float, y : Float) : Boolean = (PointF(currentX, currentY) - (PointF(x, y))).length() <= radius override fun onFingerDown(x : Float, y : Float) { drawable.alpha = 125 @@ -206,15 +206,29 @@ class TriggerButton( ) class Controls(onScreenControllerView : OnScreenControllerView) { - val circularButtons = listOf( - CircularButton(onScreenControllerView, A, 0.95f, 0.65f, 0.025f), - CircularButton(onScreenControllerView, B, 0.9f, 0.75f, 0.025f), - CircularButton(onScreenControllerView, X, 0.9f, 0.55f, 0.025f), - CircularButton(onScreenControllerView, Y, 0.85f, 0.65f, 0.025f), - CircularButton(onScreenControllerView, DpadLeft, 0.2f, 0.65f, 0.025f), - CircularButton(onScreenControllerView, DpadUp, 0.25f, 0.55f, 0.025f), - CircularButton(onScreenControllerView, DpadRight, 0.3f, 0.65f, 0.025f), - CircularButton(onScreenControllerView, DpadDown, 0.25f, 0.75f, 0.025f), + private val buttonA = CircularButton(onScreenControllerView, A, 0.95f, 0.65f, 0.025f) + private val buttonB = CircularButton(onScreenControllerView, B, 0.9f, 0.75f, 0.025f) + private val buttonX = CircularButton(onScreenControllerView, X, 0.9f, 0.55f, 0.025f) + private val buttonY = CircularButton(onScreenControllerView, Y, 0.85f, 0.65f, 0.025f) + + private val buttonDpadLeft = CircularButton(onScreenControllerView, DpadLeft, 0.2f, 0.65f, 0.025f) + private val buttonDpadUp = CircularButton(onScreenControllerView, DpadUp, 0.25f, 0.55f, 0.025f) + private val buttonDpadRight = CircularButton(onScreenControllerView, DpadRight, 0.3f, 0.65f, 0.025f) + private val buttonDpadDown = CircularButton(onScreenControllerView, DpadDown, 0.25f, 0.75f, 0.025f) + + private val buttonL = RectangularButton(onScreenControllerView, L, 0.1f, 0.25f, 0.09f, 0.1f) + private val buttonR = RectangularButton(onScreenControllerView, R, 0.9f, 0.25f, 0.09f, 0.1f) + + private val buttonZL = TriggerButton(onScreenControllerView, ZL, 0.1f, 0.1f, 0.09f, 0.1f) + private val buttonZR = TriggerButton(onScreenControllerView, ZR, 0.9f, 0.1f, 0.09f, 0.1f) + + private val circularButtonPairs = listOf(setOf(buttonA, buttonB, buttonX, buttonY), setOf(buttonDpadLeft, buttonDpadUp, buttonDpadRight, buttonDpadDown)) + + private val triggerButtonPairs = listOf(setOf(buttonL, buttonZL), setOf(buttonR, buttonZR)) + + val buttonPairs = circularButtonPairs + triggerButtonPairs + + val circularButtons = circularButtonPairs.flatten() + listOf( CircularButton(onScreenControllerView, Plus, 0.57f, 0.75f, 0.025f), CircularButton(onScreenControllerView, Minus, 0.43f, 0.75f, 0.025f), CircularButton(onScreenControllerView, Menu, 0.5f, 0.75f, 0.025f) @@ -225,15 +239,9 @@ class Controls(onScreenControllerView : OnScreenControllerView) { JoystickButton(onScreenControllerView, RightStick, 0.75f, 0.6f, 0.05f) ) - val rectangularButtons = listOf( - RectangularButton(onScreenControllerView, L, 0.1f, 0.25f, 0.09f, 0.1f), - RectangularButton(onScreenControllerView, R, 0.9f, 0.25f, 0.09f, 0.1f) - ) + val rectangularButtons = listOf(buttonL, buttonR) - val triggerButtons = listOf( - TriggerButton(onScreenControllerView, ZL, 0.1f, 0.1f, 0.09f, 0.1f), - TriggerButton(onScreenControllerView, ZR, 0.9f, 0.1f, 0.09f, 0.1f) - ) + val triggerButtons = listOf(buttonZL, buttonZR) val allButtons = circularButtons + joysticks + rectangularButtons + triggerButtons