Skip to content

Commit b331ee8

Browse files
committed
add swipe direction movement input
1 parent 5d8f11e commit b331ee8

File tree

6 files changed

+62
-19
lines changed

6 files changed

+62
-19
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.racingcar.models
22

33
enum class MovementInput {
4-
Gestures,
4+
SwipeGestures,
5+
TapGestures,
56
Accelerometer
67
}

app/src/main/java/com/example/racingcar/ui/MainActivity.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import androidx.lifecycle.Lifecycle
1717
import androidx.lifecycle.lifecycleScope
1818
import androidx.lifecycle.repeatOnLifecycle
1919
import com.example.racingcar.models.MovementInput.Accelerometer
20-
import com.example.racingcar.models.MovementInput.Gestures
2120
import com.example.racingcar.ui.theme.RacingCarTheme
2221
import com.example.racingcar.ui.viewmodel.MainViewModel
2322
import dagger.hilt.android.AndroidEntryPoint
@@ -53,13 +52,8 @@ class MainActivity : ComponentActivity(), SensorEventListener {
5352
repeatOnLifecycle(Lifecycle.State.CREATED) {
5453
viewModel.movementInput.collect {
5554
when (it) {
56-
Gestures -> {
57-
unregisterAccelerometer()
58-
}
59-
60-
Accelerometer -> {
61-
registerAccelerometer()
62-
}
55+
Accelerometer -> registerAccelerometer()
56+
else -> unregisterAccelerometer()
6357
}
6458
}
6559
}

app/src/main/java/com/example/racingcar/ui/game/RacingGameScreen.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import com.example.racingcar.R
2727
import com.example.racingcar.models.AccelerationData
2828
import com.example.racingcar.models.MovementInput
2929
import com.example.racingcar.models.MovementInput.Accelerometer
30-
import com.example.racingcar.models.MovementInput.Gestures
30+
import com.example.racingcar.models.MovementInput.SwipeGestures
31+
import com.example.racingcar.models.MovementInput.TapGestures
3132
import com.example.racingcar.ui.game.state.BackgroundState
3233
import com.example.racingcar.ui.game.state.BlockersState
3334
import com.example.racingcar.ui.game.state.CarState
@@ -105,17 +106,21 @@ fun RacingGameScreen(
105106
modifier = Modifier
106107
.fillMaxSize()
107108
.then(
108-
when (movementInput()) {
109-
Gestures -> Modifier.then(
110-
if (gameState.isRunning())
109+
if (gameState.isRunning())
110+
when (movementInput()) {
111+
TapGestures ->
111112
Modifier.detectCarPositionByPointerInput(maxWidth = maxWidth.value.toInt()) { position ->
112113
carState.moveWithTapGesture(position)
113114
}
114-
else Modifier
115-
)
116115

117-
Accelerometer -> Modifier
118-
}
116+
SwipeGestures -> Modifier.detectSwipeDirection(maxWidth.value.toInt()) { swipeDirection ->
117+
carState.moveWithSwipeGesture(swipeDirection)
118+
}
119+
120+
Accelerometer -> Modifier
121+
}
122+
else
123+
Modifier
119124
)
120125
) {
121126
RacingGameCanvas(
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.example.racingcar.ui.game
2+
3+
import androidx.compose.foundation.gestures.detectDragGestures
4+
import androidx.compose.runtime.getValue
5+
import androidx.compose.runtime.mutableFloatStateOf
6+
import androidx.compose.runtime.mutableIntStateOf
7+
import androidx.compose.runtime.remember
8+
import androidx.compose.runtime.setValue
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.composed
11+
import androidx.compose.ui.input.pointer.pointerInput
12+
import com.example.racingcar.models.SwipeDirection
13+
import com.example.racingcar.utils.Constants
14+
import kotlin.math.abs
15+
16+
fun Modifier.detectSwipeDirection(maxWidth: Int, onSwipeDirection: (SwipeDirection) -> Unit) =
17+
composed {
18+
19+
var swipeOffsetX by remember { mutableFloatStateOf(0f) }
20+
val minSwipeOffset by remember {
21+
mutableIntStateOf(maxWidth / Constants.SWIPE_MIN_OFFSET_FROM_MAX_WIDTH)
22+
}
23+
24+
Modifier.pointerInput(Unit) {
25+
detectDragGestures(
26+
onDrag = { change, dragAmount ->
27+
change.consume()
28+
swipeOffsetX += dragAmount.x
29+
},
30+
onDragEnd = {
31+
when {
32+
(swipeOffsetX < 0 && abs(swipeOffsetX) > minSwipeOffset) -> SwipeDirection.Left
33+
(swipeOffsetX > 0 && abs(swipeOffsetX) > minSwipeOffset) -> SwipeDirection.Right
34+
else -> null
35+
}?.let { direction ->
36+
onSwipeDirection(direction)
37+
}
38+
39+
swipeOffsetX = 0F
40+
}
41+
)
42+
}
43+
}

app/src/main/java/com/example/racingcar/ui/settings/MovementInputRow.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fun MovementInputRow(
4040
if (isAccelerometer)
4141
MovementInput.Accelerometer
4242
else
43-
MovementInput.Gestures
43+
MovementInput.TapGestures
4444
)
4545
},
4646
)

app/src/main/java/com/example/racingcar/ui/viewmodel/MainViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class MainViewModel @Inject constructor(
3636
private val _acceleration = MutableStateFlow(AccelerationData(0f, 0f, 0f))
3737
val acceleration = _acceleration.asStateFlow()
3838

39-
private val _movementInput = MutableStateFlow(MovementInput.Gestures)
39+
private val _movementInput = MutableStateFlow(MovementInput.SwipeGestures)
4040
val movementInput = _movementInput.asStateFlow()
4141

4242
private val _gameScore = MutableStateFlow(INITIAL_GAME_SCORE)

0 commit comments

Comments
 (0)