Проблема с 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.

Другие вопросы по тегам