Resolved #8350 - unit icons no longer overlap unit action images, improved render time for unit images

This commit is contained in:
Yair Morgenstern
2023-01-09 23:30:23 +02:00
parent 8cd9bca7bf
commit 7fe2b9e99b
53 changed files with 777 additions and 768 deletions

View File

@ -1,6 +1,5 @@
package com.unciv.ui.cityscreen
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.utils.Align
import com.unciv.UncivGame
@ -24,7 +23,6 @@ class CityTileGroup(private val city: CityInfo, tileInfo: TileInfo, tileSetStrin
icons.addPopulationIcon(ImageGetter.getImage("OtherIcons/Star"))
}
unitLayerGroup.isVisible = false
unitImageLayerGroup.isVisible = false
}
fun update() {

View File

@ -7,8 +7,9 @@ import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.utils.Align
import com.unciv.ui.utils.extensions.center
class IconCircleGroup(size: Float, val actor: Actor, resizeActor: Boolean = true, color: Color = Color.WHITE): Group(){
val circle = ImageGetter.getCircle().apply {
class IconCircleGroup(size: Float, val actor: Actor, resizeActor: Boolean = true,
color: Color = Color.WHITE, circleImage:String = "OtherIcons/Circle"): Group(){
val circle = ImageGetter.getImage(circleImage).apply {
setSize(size, size)
setColor(color)
}

View File

@ -113,7 +113,6 @@ class TileGroupMap<T: TileGroup>(
val pixelUnitLayers = ArrayList<ActionlessGroup>()
val circleFogCrosshairLayers = ArrayList<ActionlessGroup>()
val unitLayers = ArrayList<Group>()
val unitImageLayers = ArrayList<ActionlessGroup>()
val cityButtonLayers = ArrayList<Group>()
// Apparently the sortedByDescending is kinda memory-intensive because it needs to sort ALL the tiles
@ -127,7 +126,6 @@ class TileGroupMap<T: TileGroup>(
pixelUnitLayers.add(group.pixelCivilianUnitGroup.apply { setPosition(group.x,group.y) })
circleFogCrosshairLayers.add(group.highlightFogCrosshairLayerGroup.apply { setPosition(group.x,group.y) })
unitLayers.add(group.unitLayerGroup.apply { setPosition(group.x,group.y) })
unitImageLayers.add(group.unitImageLayerGroup.apply { setPosition(group.x,group.y) })
cityButtonLayers.add(group.cityButtonLayerGroup.apply { setPosition(group.x,group.y) })
if (worldWrap) {
@ -140,7 +138,6 @@ class TileGroupMap<T: TileGroup>(
pixelUnitLayers.add(mirrorTile.pixelCivilianUnitGroup.apply { setPosition(mirrorTile.x,mirrorTile.y) })
circleFogCrosshairLayers.add(mirrorTile.highlightFogCrosshairLayerGroup.apply { setPosition(mirrorTile.x,mirrorTile.y) })
unitLayers.add(mirrorTile.unitLayerGroup.apply { setPosition(mirrorTile.x,mirrorTile.y) })
unitImageLayers.add(mirrorTile.unitImageLayerGroup.apply { setPosition(mirrorTile.x,mirrorTile.y) })
cityButtonLayers.add(mirrorTile.cityButtonLayerGroup.apply { setPosition(mirrorTile.x,mirrorTile.y) })
}
}
@ -159,7 +156,6 @@ class TileGroupMap<T: TileGroup>(
}
}
for (group in unitLayers) addActor(group) // Aaand units above everything else.
for (group in unitImageLayers) addActor(group) // This is so the individual textures for the units are rendered together
for (group in cityButtonLayers) addActor(group) // city buttons + clickability
// there are tiles "below the zero",

View File

@ -113,15 +113,8 @@ open class TileGroup(
}
}
class UnitImageLayerGroupClass(groupSize: Float) : ActionlessGroup(groupSize) {
override fun draw(batch: Batch?, parentAlpha: Float) = super.draw(batch, parentAlpha)
init {
touchable = Touchable.disabled
}
}
// We separate the units from the units' backgrounds, because all the background elements are in the same texture, and the units' aren't
val unitLayerGroup = UnitLayerGroupClass(groupSize)
val unitImageLayerGroup = UnitImageLayerGroupClass(groupSize)
class CityButtonLayerGroupClass(val tileInfo: TileInfo, groupSize: Float) : Group() {
override fun draw(batch: Batch?, parentAlpha: Float) {

View File

@ -72,11 +72,6 @@ class TileGroupIcons(val tileGroup: TileGroup) {
newImage.center(tileGroup)
newImage.y += yFromCenter
// We "steal" the unit image so that all backgrounds are rendered next to each other
// to save texture swapping and improve framerate
tileGroup.unitImageLayerGroup.addActor(newImage.unitBaseImage)
newImage.unitBaseImage.center(tileGroup)
newImage.unitBaseImage.y += yFromCenter
// Display number of carried air units
if (unit.getTile().airUnits.any { unit.isTransportTypeOf(it) } && !unit.getTile().isCityCenter()) {

View File

@ -12,6 +12,8 @@ import com.unciv.ui.images.ImageGetter
import com.unciv.ui.utils.extensions.center
import com.unciv.ui.utils.extensions.surroundWithCircle
val unitCircleLocation = "UnitIcons/Circle"
class UnitGroup(val unit: MapUnit, val size: Float): Group() {
var actionGroup :Group? = null
val unitBaseImage = ImageGetter.getUnitIcon(unit.name, unit.civInfo.nation.getInnerColor())
@ -70,8 +72,8 @@ class UnitGroup(val unit: MapUnit, val size: Float): Group() {
val actionImage = getActionImage()
if (actionImage != null) {
val actionCircle = actionImage.surroundWithCircle(size / 2 * 0.9f)
.surroundWithCircle(size / 2, false, Color.BLACK)
val actionCircle = actionImage.surroundWithCircle(size / 2 * 0.9f, circleImageLocation = unitCircleLocation)
.surroundWithCircle(size / 2, false, Color.BLACK, circleImageLocation = unitCircleLocation)
actionCircle.setPosition(size / 2, 0f)
addActor(actionCircle)
actionGroup = actionCircle

View File

@ -309,7 +309,8 @@ fun Actor.onChange(function: (event: ChangeListener.ChangeEvent?) -> Unit): Acto
return this
}
fun Actor.surroundWithCircle(size: Float, resizeActor: Boolean = true, color: Color = Color.WHITE): IconCircleGroup {
fun Actor.surroundWithCircle(size: Float, resizeActor: Boolean = true,
color: Color = Color.WHITE, circleImageLocation:String = "OtherIcons/Circle"): IconCircleGroup {
return IconCircleGroup(size, this, resizeActor, color)
}