问题描述
我目前正在尝试使用TornadoFX在Kotlin开发一个小型棋盘游戏,主要用于练习目的。但是我目前正在努力将这些部分添加到董事会中。我尝试了许多对我来说似乎合乎逻辑的方法,但是每次它以太给我一个错误消息或根本不起作用时。因此,当我没有任何想法或可能的解决方案时,我现在在这里寻求有关Stackoverflow的帮助(这是有史以来第一次:-))。
从Controller向棋盘添加棋子的最佳方法或最惯用的方法是什么?我还应该提到,我以前从未真正使用过JavaFX,因此我正在从头开始学习TornadoFX。
这是我的董事会视图:
class BoardView : View("BoardView")
{
private val numberOfCells = 8
private val cellSize = 100.0
private val controller: BoardController by inject()
override val root = pane {
prefheight = cellSize * numberOfCells
prefWidth = cellSize * numberOfCells
gridpane {
for (y in 0 until numberOfCells)
{
row {
for (x in 0 until numberOfCells)
{
if ((x + y) % 2 == 0)
{
add(ChessCell(cellSize,true,x,y))
}
else
{
add(ChessCell(cellSize,false,y))
}
}
}
}
}
}
}
我的碎片片段:
class Stone(light: Boolean,x: Double,y: Double): Fragment()
{
private val colorLight = c("E4E4E4")
private val colorDark = c("1B1B1B")
override val root = pane {
circle {
fill = if (light)
{
colorLight
}
else
{
colorDark
}
radius = 30.0
centerY = y
centerX = x
}
}
}
最后是我的Controller类:
class BoardController(): Controller()
{
private val board: BoardView by inject()
fun startGame()
{
// How to place a Stone (aka piece) from here?
}
}
非常感谢您提供任何帮助
解决方法
经过一周的工作,我终于找到了解决方案。如果将来有人需要,我将在这里发布。
我在BoardView
内添加了以下功能:
fun placeStone(light: Boolean,xPos: Double,yPos: Double)
{
with(root)
{
this += Stone(light,xPos,yPos)
}
}
然后我在startGame()
中更改了函数BoardController
:
fun startGame()
{
for (x in 0 until 8)
{
for (y in 0 until 8)
{
if ((x + y) % 2 != 0)
{
if (y < 3)
{
board.placeStone(false,x,y)
}
else if (y > 4)
{
board.placeStone(true,y)
}
}
}
}
}