Obwohl meine Dialoge ziemlich einfach und statisch sind, ist die Berechnung der Positionen ein ziemlicher Graus. Mal ein Beispiel:
private val bounds: Rectangle = Rectangle(0F, 0F, 600F, 620F).center()
...
init {
val titleMeasures = Assets.mainFont.size(title, 0.5F)
val titleWidth = titleMeasures.first
val titleHeight = titleMeasures.second
val w2 = bounds.width / 2F
val lineHeight = bounds.y + bounds.height - titleHeight - 40F
fixedPrimitives = arrayOf(
//background
Picture(Assets.dialog, bounds),
Rect(bounds, Color.GOLD),
//title
Line(at(bounds.x, lineHeight), at(bounds.x + bounds.width, lineHeight), Color.GOLD),
Text(title, at(bounds.x + (bounds.width - titleWidth) / 2F, bounds.y + bounds.height - titleHeight), 0.5F, Color.GOLD))
val leftBounds = Rectangle(bounds.x, bounds.y + 20F, w2, titleHeight + 20F).pad(-20F, 0F)
val closeActor = TextButton("dialog.body.close".i18n(), leftBounds) { it.parent.remove() }
addActor(closeActor)
val rightBounds = Rectangle(bounds.x + w2, bounds.y + 20F, w2, titleHeight + 20F).pad(-20F, 0F)
scanActor = TextButton("dialog.body.scan".i18n(), rightBounds) { scan() }
addActor(scanActor)
miningActors = Array(6) { y ->
val bounds = Rectangle(bounds.x + w2, bounds.y + 95F + cellWidth * (5 - y), w2, titleHeight + 20F).pad(-20F, 0F)
TextButton("dialog.body.extract".i18n(), bounds) { extract(y) }
.also {
addActor(it)
touchable = toTouchable(game.ship.canExtract(body, y))
}
}
...
}
Ich habe also beschlossen, so etwas ähnliches wie einen LayoutManager in Swing zu schreiben, nur sehr viel einfacher und statischer. Im Prinzip eine Klasse, in die ich ein Rechteck reinstecke, und aus der dann eine Map von Namen auf kleinere Rechtecke wieder rauskommen. Diese benutze ich dann „manuell“, um alles auszurichten.
Meine ersten Versuche sahen recht vielversprechend aus. Vielleicht schaffe ich es auch, ein kleines DSL dafür zu schreiben.
Außerdem habe ich beschlossen, den Code erst einmal öffentlich zugänglich zu machen. Das ist noch keine Entscheidung, ob das Projekt Open-Source wird. Die URL ist https://gitlab.com/Landei/r-process