Проблема с Kotlin Compose for Desktop Window
Я пытаюсь создать настольное приложение для шахматного движка с компонентом пользовательского интерфейса.
Упомянутый мной метод game() представляет собой простой цикл while, который позволяет мне запрашивать ходы в алгебраической нотации и делать ходы, если они действительны.
У меня есть следующая основная проблема, и моя проблема в том, что если я раскомментирую и запускаю метод game() внутри класса, он не запустит окно приложения, и если я вместо этого попытаюсь раскомментировать тот же метод, но за пределами окна, он все равно не запустит настольное приложение. С другой стороны, если я запустил, он запустит окно пользовательского интерфейса.
fun main() = application {
resetBoard()
printBoardSmall()
Window(onCloseRequest = ::exitApplication, icon = painterResource("black_knight.png"), title = "Chess") {
ui()
//game()
}
//game()
}
@Composable
fun ui() {
var squarePair = false
Row {
Column {
for (n in 8 downTo 1) {
Row {
Text(
"" + n,
textAlign = TextAlign.Center,
modifier = Modifier.width(SIZE_TILE),
fontSize = FONT_SIZE_BOARD,
fontWeight = FontWeight.Bold
)
squarePair = boardLines(n, squarePair)
}
}
Row {
Text(" ", textAlign = TextAlign.Center, modifier = Modifier.width(SIZE_TILE))
for (n in 0..7) {
Text(
"" + ('A' + n),
textAlign = TextAlign.Center,
modifier = Modifier.width(SIZE_TILE),
fontSize = FONT_SIZE_BOARD,
fontWeight = FontWeight.Bold
)
}
}
}
Column {
Text(" Play", textAlign = TextAlign.Center, fontSize = 30.sp)
var move = ""
//var move by remember { mutableStateOf("") }
TextField(
value = move,
onValueChange = { move = it },
label = { Text("Move") },
maxLines = 1,
textStyle = TextStyle(color = Color.Black, fontWeight = FontWeight.Bold),
modifier = Modifier.padding(20.dp)
)
print(move)
}
}
}
@Composable
fun board(n: Int, i: Int){
var team = ""
if(utils.isWhite(BOARD[n-1][i-1])) team = TEAM[0]
if(utils.isBlack(BOARD[n-1][i-1])) team = TEAM[1]
for(k in LOWER_CASE_LETTERS.indices) {
if (BOARD[n-1][i-1] == LOWER_CASE_LETTERS[k] || BOARD[n-1][i-1] == UPPER_CASE_LETTERS[k]) {
Image(painter = painterResource(team + "_" + PIECES[k] + ".png"), contentDescription = PIECES[k])
}
}
}
Я новичок в сочинении, и я не могу понять, в чем проблема, тем более, что я пытаюсь запустить метод за пределами окна
1 ответ
Я не специалист, но постараюсь помочь.
- Это не работает, когда вы вызываете его в окне, потому что это то, что он использует для инициализации своего макета. Так что Окно не будет показываться до упора.
- Не знаю, почему не работает, когда ставишь после Window. Смотря на
fun main() = application { ... }
Я подозреваю, что запуск приложения аналогичен запуску окна, поэтому оно также не запустится, пока не закончится.
Вы должны попробовать поставить
game()
в отдельной ветке. Что-то вроде этого должно работать:
fun() main = application {
resetBoard()
printBoardSmall()
Window( ... ){
ui()
}
Thread {
game()
}.start()
}
PS Я тоже новичок в сочинении. И новичок в программировании. И действительно, очень извините за все грубые упрощения, которые я сделал.
PPS Вы можете добавить TextField в свое приложение и использовать параметр Button onClick для вызова функции проверки перемещения. Тогда не нужно было бы играть с потоками и сопрограммами. И вы также можете использовать кнопки для квадратов доски, потому что вы можете назначить им фон и изображение. Если вам понадобится помощь с чем-либо из этого - HMU.