forked from george/snake-compose
Этап 6: пауза
Тап по полю во время игры ставит/снимает паузу. - флаг paused; игровой цикл шагает только при !paused - тап в detectTapGestures переключает паузу (старт/рестарт без изменений) - оверлей «ПАУЗА» с подсказкой о продолжении - reset() сбрасывает паузу; подсказка про паузу на стартовом экране Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
da783d9f0d
commit
c3529f08a0
@ -88,4 +88,8 @@ app/src/main/
|
|||||||
расходится затухающее кольцо. Смотри `Animatable` (`popProgress` 0→1),
|
расходится затухающее кольцо. Смотри `Animatable` (`popProgress` 0→1),
|
||||||
запуск анимации в `step()` и отрисовку кольца в `drawBoard()`.
|
запуск анимации в `step()` и отрисовку кольца в `drawBoard()`.
|
||||||
|
|
||||||
Идеи для следующих этапов: пауза, выбор размера поля, экран настроек.
|
- **`snake-stage-6`** — пауза: тап по полю во время игры ставит/снимает
|
||||||
|
паузу (свайпы по-прежнему рулят направлением). Смотри флаг `paused`,
|
||||||
|
условие в игровом цикле и оверлей «ПАУЗА».
|
||||||
|
|
||||||
|
Идеи для следующих этапов: выбор размера поля, экран настроек, светлая тема.
|
||||||
|
|||||||
@ -82,6 +82,7 @@ fun SnakeGame() {
|
|||||||
var best by remember { mutableIntStateOf(0) }
|
var best by remember { mutableIntStateOf(0) }
|
||||||
var started by remember { mutableStateOf(false) }
|
var started by remember { mutableStateOf(false) }
|
||||||
var gameOver by remember { mutableStateOf(false) }
|
var gameOver by remember { mutableStateOf(false) }
|
||||||
|
var paused by remember { mutableStateOf(false) } // этап 6: пауза
|
||||||
|
|
||||||
// Этап 3: контекст и scope для работы с DataStore (рекорд хранится на диске)
|
// Этап 3: контекст и scope для работы с DataStore (рекорд хранится на диске)
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
@ -122,6 +123,7 @@ fun SnakeGame() {
|
|||||||
food = randomFreeCell(startSnake)
|
food = randomFreeCell(startSnake)
|
||||||
score = 0
|
score = 0
|
||||||
gameOver = false
|
gameOver = false
|
||||||
|
paused = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Один шаг змейки
|
// Один шаг змейки
|
||||||
@ -164,7 +166,7 @@ fun SnakeGame() {
|
|||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
while (true) {
|
while (true) {
|
||||||
delay(stepDelay(score))
|
delay(stepDelay(score))
|
||||||
if (started && !gameOver) step()
|
if (started && !gameOver && !paused) step()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,6 +182,8 @@ fun SnakeGame() {
|
|||||||
started = true
|
started = true
|
||||||
} else if (!started) {
|
} else if (!started) {
|
||||||
started = true
|
started = true
|
||||||
|
} else {
|
||||||
|
paused = !paused // во время игры тап ставит/снимает паузу
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -223,11 +227,13 @@ fun SnakeGame() {
|
|||||||
.padding(top = 48.dp)
|
.padding(top = 48.dp)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Оверлеи: старт и проигрыш
|
// Оверлеи: старт, пауза и проигрыш
|
||||||
if (!started) {
|
if (!started) {
|
||||||
Overlay(title = "ЗМЕЙКА", subtitle = "Свайпни, чтобы начать", modifier = Modifier.align(Alignment.Center))
|
Overlay(title = "ЗМЕЙКА", subtitle = "Свайпни, чтобы начать · тап — пауза", modifier = Modifier.align(Alignment.Center))
|
||||||
} else if (gameOver) {
|
} else if (gameOver) {
|
||||||
Overlay(title = "GAME OVER", subtitle = "Счёт: $score · тапни для рестарта", modifier = Modifier.align(Alignment.Center))
|
Overlay(title = "GAME OVER", subtitle = "Счёт: $score · тапни для рестарта", modifier = Modifier.align(Alignment.Center))
|
||||||
|
} else if (paused) {
|
||||||
|
Overlay(title = "ПАУЗА", subtitle = "Тапни, чтобы продолжить", modifier = Modifier.align(Alignment.Center))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user