Counters for the Defenders
Now we’re going to look at the Image
and ImageView
setup for the counters that represent the defending units.
The Counters
CheckPoint Alpha
Heavy Tank
Light Tank
Missile Tank
Ground Effect Vehicle (GEV)
Howitzer
Infantry (Single Unit)
Infantry (Two Units)
Infantry are the only units where two are allowed to occupy the same Tile
, so we need to have a counter for each situation.
Linking the Images to Data
We need a class to be able to treat these Images
more like data. Since it’s a set of discrete values, an Enum
makes sense:
enum class CounterType(val label: String, private val resourceName: String) {
NONE("None", ""),
HVYTK("Heavy Tank", "HeavyTank"),
LGHTK("Light Tank", "LightTank"),
HWZR("Howitzer", "Howitzer"),
INFTY1("Infantry 1", "Infantry1"),
INFTY2("Infantry 2", "Infantry2"),
GEV("Gev", "Gev"),
MSLTK("Missile Tank", "MslTank"),
CPA("CP Alpha", "CpAlpha"),
CT1("CyberTank1", "cybertank1");
companion object {
private val images = mutableMapOf<CounterType, Image?>()
private fun createImage(resourceName: String) =
CounterType::class.java.getResource("/counters/black/${resourceName}.png")?.toExternalForm()?.let { Image(it) }
private fun getImage(counterType: CounterType): Image? {
if (!images.contains(counterType)) {
images[counterType] = createImage(counterType.resourceName)
println("Creating image: ${counterType.name} -> ${images[counterType]}")
}
return images[counterType]
}
fun byLabel(label: String) = values().find { it.label == label } ?: NONE
}
val image: Image? by lazy { getImage(this) }
}
Now we can refer to the counters by their Enum
value, and pull the image via the getImage()
function.
For now, that’s all we need.