Split map into layers for base image, features, overlays, and fog

Added Marsh and Lakes images
IT LOOKS SO GOOD NOW DAMN
This commit is contained in:
Yair Morgenstern
2019-03-20 12:09:54 +02:00
parent fe9fc110d8
commit 1d88e76452
13 changed files with 96 additions and 70 deletions

View File

@ -11,7 +11,7 @@ class GameSettings {
var hasCrashedRecently = false
var soundEffectsVolume = 0.5f
var turnsBetweenAutosaves = 1
var tileSet:String = "Default"
var tileSet:String = "FantasyHex"
fun save(){
GameSaver().setGeneralSettings(this)

View File

@ -17,7 +17,7 @@ class UnCivGame : Game() {
* This exists so that when debugging we can see the entire map.
* Remember to turn this to false before commit and upload!
*/
val viewEntireMapForDebug = false
val viewEntireMapForDebug = true
// For when you need to test something in an advanced game and don't have time to faff around
val superchargedForDebug = false

View File

@ -26,7 +26,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
Layers:
Base image + overlay
Feature overlay / city overlay
Units, improvements, resources, border
Misc: Units, improvements, resources, border
Circle, Crosshair, Fog layer
City name
*/
@ -51,7 +51,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
protected var civilianUnitImage: UnitGroup? = null
protected var militaryUnitImage: UnitGroup? = null
val circleCrosshairFogLayerGroup = Group().apply { isTransform=false }
private val circleImage = ImageGetter.getCircle() // for blue and red circles on the tile
private val crosshairImage = ImageGetter.getImage("OtherIcons/Crosshair.png") // for when a unit is targete
protected val fogImage = ImageGetter.getImage(tileSetLocation+"CrosshatchHexagon")
@ -68,6 +68,10 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
val groupSize = 54f
init {
this.setSize(groupSize, groupSize)
this.addActor(baseLayerGroup)
this.addActor(featureLayerGroup)
this.addActor(miscLayerGroup)
this.addActor(circleCrosshairFogLayerGroup)
updateTileImage(false)
@ -82,7 +86,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
circleImage.width = 50f
circleImage.height = 50f
circleImage.center(this)
addActor(circleImage)
circleCrosshairFogLayerGroup.addActor(circleImage)
circleImage.isVisible = false
}
@ -92,7 +96,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
fogImage.setOrigin(Align.center)
fogImage.center(this)
fogImage.color = Color.WHITE.cpy().apply { a = 0.2f }
addActor(fogImage)
circleCrosshairFogLayerGroup.addActor(fogImage)
}
private fun addCrosshairImage() {
@ -101,7 +105,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
crosshairImage.center(this)
crosshairImage.isVisible = false
crosshairImage.color = Color.WHITE.cpy().apply { a = 0.5f }
addActor(crosshairImage)
circleCrosshairFogLayerGroup.addActor(crosshairImage)
}
fun showCrosshair() {
@ -134,11 +138,10 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
tileBaseImage.y = -groupSize/6
tileBaseImage.toBack()
addActor(tileBaseImage)
baseLayerGroup.addActor(tileBaseImage)
}
fun addAcquirableIcon(){
this.
populationImage = ImageGetter.getStatIcon("Acquire")
populationImage!!.run {
color = Color.GREEN.cpy().lerp(Color.BLACK, 0.5f)
@ -146,7 +149,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
center(this@TileGroup)
x += 20 // right
}
addActor(populationImage)
miscLayerGroup.addActor(populationImage)
}
fun addPopulationIcon() {
@ -158,7 +161,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
center(this@TileGroup)
x += 20 // right
}
addActor(populationImage)
miscLayerGroup.addActor(populationImage)
}
protected fun removePopulationIcon() {
@ -219,13 +222,13 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
setSize(40f, 40f)
center(this@TileGroup)
}
addActor(baseTerrainOverlayImage)
baseLayerGroup.addActor(baseTerrainOverlayImage)
}
private fun updateCityImage() {
if (cityImage == null && tileInfo.isCityCenter()) {
cityImage = ImageGetter.getImage("OtherIcons/City.png")
addActor(cityImage)
featureLayerGroup.addActor(cityImage)
cityImage!!.run {
setSize(60f, 60f)
center(this@TileGroup)
@ -287,7 +290,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
image.moveBy(relativeWorldPosition.y * i * 4, -relativeWorldPosition.x * i * 4)
image.color = civColor
addActor(image)
miscLayerGroup.addActor(image)
images.add(image)
}
}
@ -331,7 +334,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
image.setOrigin(0f, 1f) // This is so that the rotation is calculated from the middle of the road and not the edge
image.rotation = (180 / Math.PI * Math.atan2(relativeWorldPosition.y.toDouble(), relativeWorldPosition.x.toDouble())).toFloat()
addActor(image)
featureLayerGroup.addActor(image)
}
@ -355,7 +358,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
val terrainFeatureOverlayLocation = tileSetLocation +"$terrainFeature"+"Overlay"
if(!ImageGetter.imageExists(terrainFeatureOverlayLocation)) return
terrainFeatureOverlayImage = ImageGetter.getImage(terrainFeatureOverlayLocation)
addActor(terrainFeatureOverlayImage)
featureLayerGroup.addActor(terrainFeatureOverlayImage)
terrainFeatureOverlayImage!!.run {
setSize(30f, 30f)
setColor(1f, 1f, 1f, 0.5f)
@ -373,7 +376,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
if (tileInfo.improvement != null && showResourcesAndImprovements) {
improvementImage = ImageGetter.getImprovementIcon(tileInfo.improvement!!)
addActor(improvementImage)
miscLayerGroup.addActor(improvementImage)
improvementImage!!.run {
setSize(20f, 20f)
center(this@TileGroup)
@ -403,7 +406,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
resourceImage!!.center(this)
resourceImage!!.x = resourceImage!!.x - 22 // left
resourceImage!!.y = resourceImage!!.y + 10 // top
addActor(resourceImage!!)
miscLayerGroup.addActor(resourceImage!!)
}
}
@ -419,7 +422,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
newImage.blackSpinningCircle = ImageGetter.getCircle()
.apply { rotation= oldUnitGroup.blackSpinningCircle!!.rotation}
}
addActor(newImage)
miscLayerGroup.addActor(newImage)
newImage.center(this)
newImage.y += yFromCenter

View File

@ -17,7 +17,6 @@ class TileGroupMap<T: TileGroup>(tileGroups:Collection<T>, padding:Float): Group
tileGroup.setPosition(positionalVector.x * 0.8f * groupSize.toFloat(),
positionalVector.y * 0.8f * groupSize.toFloat())
addActor(tileGroup)
topX = Math.max(topX, tileGroup.x + groupSize)
topY = Math.max(topY, tileGroup.y + groupSize)
bottomX = Math.min(bottomX, tileGroup.x)
@ -28,8 +27,25 @@ class TileGroupMap<T: TileGroup>(tileGroups:Collection<T>, padding:Float): Group
group.moveBy(-bottomX + padding, -bottomY + padding)
}
for(group in tileGroups.sortedByDescending { it.tileInfo.position.x + it.tileInfo.position.y })
group.toFront()
val baseLayers = ArrayList<Group>()
val featureLayers = ArrayList<Group>()
val miscLayers = ArrayList<Group>()
val circleCrosshairFogLayers = ArrayList<Group>()
for(group in tileGroups.sortedByDescending { it.tileInfo.position.x + it.tileInfo.position.y }){
// now, we steal the subgroups from all the tilegroups, that's how we form layers!
baseLayers.add(group.baseLayerGroup.apply { setPosition(group.x,group.y) })
featureLayers.add(group.featureLayerGroup.apply { setPosition(group.x,group.y) })
miscLayers.add(group.miscLayerGroup.apply { setPosition(group.x,group.y) })
circleCrosshairFogLayers.add(group.circleCrosshairFogLayerGroup.apply { setPosition(group.x,group.y) })
}
for(group in baseLayers) addActor(group)
for(group in featureLayers) addActor(group)
for(group in miscLayers) addActor(group)
for(group in circleCrosshairFogLayers) addActor(group)
for(group in tileGroups) addActor(group) // The above layers are for the visual layers, this is for the clicks
// there are tiles "below the zero",
// so we zero out the starting position of the whole board so they will be displayed as well

View File

@ -179,7 +179,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
tileGroup.update(canSeeTile, showSubmarine)
val unitsInTile = tileGroup.tileInfo.getUnits()
val canSeeEnemy = unitsInTile.isNotEmpty() && !unitsInTile.first().civInfo.isPlayerCivilization()
val canSeeEnemy = unitsInTile.isNotEmpty() && unitsInTile.first().civInfo.isAtWarWith(civInfo)
&& (showSubmarine || unitsInTile.firstOrNull {!it.isInvisible()}!=null)
if(canSeeTile && canSeeEnemy)
tileGroup.showCircle(Color.RED) // Display ALL viewable enemies with a red circle so that users don't need to go "hunting" for enemy units