Этап 6: пауза

Тап по полю во время игры ставит/снимает паузу.

- флаг paused; игровой цикл шагает только при !paused
- тап в detectTapGestures переключает паузу (старт/рестарт без изменений)
- оверлей «ПАУЗА» с подсказкой о продолжении
- reset() сбрасывает паузу; подсказка про паузу на стартовом экране

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
george 2026-06-17 18:06:54 +03:00
parent da783d9f0d
commit c3529f08a0
2 changed files with 14 additions and 4 deletions

View File

@ -88,4 +88,8 @@ app/src/main/
расходится затухающее кольцо. Смотри `Animatable` (`popProgress` 0→1),
запуск анимации в `step()` и отрисовку кольца в `drawBoard()`.
Идеи для следующих этапов: пауза, выбор размера поля, экран настроек.
- **`snake-stage-6`** — пауза: тап по полю во время игры ставит/снимает
паузу (свайпы по-прежнему рулят направлением). Смотри флаг `paused`,
условие в игровом цикле и оверлей «ПАУЗА».
Идеи для следующих этапов: выбор размера поля, экран настроек, светлая тема.

View File

@ -82,6 +82,7 @@ fun SnakeGame() {
var best by remember { mutableIntStateOf(0) }
var started by remember { mutableStateOf(false) }
var gameOver by remember { mutableStateOf(false) }
var paused by remember { mutableStateOf(false) } // этап 6: пауза
// Этап 3: контекст и scope для работы с DataStore (рекорд хранится на диске)
val context = LocalContext.current
@ -122,6 +123,7 @@ fun SnakeGame() {
food = randomFreeCell(startSnake)
score = 0
gameOver = false
paused = false
}
// Один шаг змейки
@ -164,7 +166,7 @@ fun SnakeGame() {
LaunchedEffect(Unit) {
while (true) {
delay(stepDelay(score))
if (started && !gameOver) step()
if (started && !gameOver && !paused) step()
}
}
@ -180,6 +182,8 @@ fun SnakeGame() {
started = true
} else if (!started) {
started = true
} else {
paused = !paused // во время игры тап ставит/снимает паузу
}
}
}
@ -223,11 +227,13 @@ fun SnakeGame() {
.padding(top = 48.dp)
)
// Оверлеи: старт и проигрыш
// Оверлеи: старт, пауза и проигрыш
if (!started) {
Overlay(title = "ЗМЕЙКА", subtitle = "Свайпни, чтобы начать", modifier = Modifier.align(Alignment.Center))
Overlay(title = "ЗМЕЙКА", subtitle = "Свайпни, чтобы начать · тап — пауза", modifier = Modifier.align(Alignment.Center))
} else if (gameOver) {
Overlay(title = "GAME OVER", subtitle = "Счёт: $score · тапни для рестарта", modifier = Modifier.align(Alignment.Center))
} else if (paused) {
Overlay(title = "ПАУЗА", subtitle = "Тапни, чтобы продолжить", modifier = Modifier.align(Alignment.Center))
}
}
}