DEADSOFTWARE

CaveGame in kotlin
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / touch / JoystickInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.touch
3 import com.badlogic.gdx.utils.TimeUtils
4 import ru.deadsoftware.cavedroid.MainConfig
5 import ru.deadsoftware.cavedroid.game.GameScope
6 import ru.deadsoftware.cavedroid.game.GameUiWindow
7 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler
8 import ru.deadsoftware.cavedroid.game.input.Joystick
9 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
10 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
11 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
12 import ru.deadsoftware.cavedroid.game.mobs.Mob
13 import ru.deadsoftware.cavedroid.game.mobs.MobsController
14 import ru.deadsoftware.cavedroid.game.mobs.player.Player
15 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
16 import ru.deadsoftware.cavedroid.game.world.GameWorld
17 import javax.inject.Inject
19 @GameScope
20 class JoystickInputHandler @Inject constructor(
21 private val mainConfig: MainConfig,
22 private val mobsController: MobsController,
23 private val gameWindowsManager: GameWindowsManager,
24 private val gameWorld: GameWorld,
25 ) : IGameInputHandler<MouseInputAction> {
27 private var activateTimeMs = 0L
28 private var cursorTimeoutMs = 100L
30 private var active = false
31 set(value) {
32 if (!value) {
33 resetVelocity()
34 if (TimeUtils.timeSinceMillis(activateTimeMs) < 200L &&
35 mobsController.player.controlMode != Player.ControlMode.CURSOR) {
36 mobsController.player.jump()
37 }
38 } else {
39 activateTimeMs = TimeUtils.millis()
40 }
41 field = value
42 }
44 private fun resetVelocity() {
45 mobsController.player.velocity.x = 0f
47 if (mobsController.player.isFlyMode) {
48 mobsController.player.velocity.y = 0f
49 }
50 }
52 override fun checkConditions(action: MouseInputAction): Boolean {
53 return gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
54 mainConfig.isTouch &&
55 // mobsController.player.controlMode == Player.ControlMode.WALK &&
56 mainConfig.joystick != null &&
57 (action.actionKey is MouseInputActionKey.Touch) &&
58 (action.actionKey.pointer == mainConfig.joystick?.pointer || !active) &&
59 ((action.actionKey is MouseInputActionKey.Dragged) ||
60 (action.screenX < action.cameraViewport.width / 2 && !action.actionKey.touchUp || active)) &&
61 !(action.actionKey is MouseInputActionKey.Screen && isInsideHotbar(action))
63 }
65 private fun handleTouchDown(action: MouseInputAction) {
66 val key = action.actionKey as MouseInputActionKey.Screen
67 mainConfig.joystick?.activate(action.screenX, action.screenY, key.pointer) ?: return
68 active = true
69 }
71 private fun handleTouchUp(action: MouseInputAction) {
72 mainConfig.joystick?.deactivate()
73 active = false
74 }
76 private fun handleCursor() {
77 val joystick = mainConfig.joystick ?: return
79 if (TimeUtils.timeSinceMillis(cursorTimeoutMs) < 150L) {
80 return
81 }
83 val pastCursorX = mobsController.player.cursorX
84 val pastCursorY = mobsController.player.cursorY
86 if (Math.abs(joystick.activeX - joystick.centerX) >= Joystick.RADIUS / 2) {
87 mobsController.player.cursorX += if (joystick.activeX > joystick.centerX) 1 else -1
88 cursorTimeoutMs = TimeUtils.millis()
89 }
91 if (Math.abs(joystick.activeY - joystick.centerY) >= Joystick.RADIUS / 2) {
92 mobsController.player.cursorY += if (joystick.activeY > joystick.centerY) 1 else -1
93 cursorTimeoutMs = TimeUtils.millis()
94 }
96 mobsController.player.checkCursorBounds(gameWorld)
98 if (mobsController.player.cursorX != pastCursorX || mobsController.player.cursorY != pastCursorY) {
99 mobsController.player.blockDamage = 0f
103 private fun handleDragged() {
104 if (!active) {
105 return
108 if (mobsController.player.controlMode == Player.ControlMode.CURSOR) {
109 handleCursor()
110 return
113 val joystick = mainConfig.joystick ?: return
114 val joyVector = joystick.getVelocityVector()
116 if (mobsController.player.isFlyMode) {
117 joyVector.scl(2f);
120 mobsController.player.velocity.x = joyVector.x
122 mobsController.player.setDir(
123 if (joyVector.x < 0) {
124 Mob.Direction.LEFT
125 } else {
126 Mob.Direction.RIGHT
130 if (mobsController.player.isFlyMode) {
131 mobsController.player.velocity.y = joyVector.y
135 override fun handle(action: MouseInputAction) {
136 when (action.actionKey) {
137 is MouseInputActionKey.Dragged -> handleDragged()
138 else -> {
139 if (action.actionKey.touchUp) {
140 handleTouchUp(action)
141 } else {
142 handleTouchDown(action)