From d06984b261b1c2ce2da9fba95ea4855bb7c99b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 3 Feb 2021 23:19:57 +0100 Subject: [PATCH] [Editor] Refactor map model --- .../editor/controller/map/MapController.kt | 3 +- .../base/editor/model/map/layer/Layer.kt | 4 +- .../base/editor/model/map/layer/TileLayer.kt | 12 +--- .../base/editor/model/map/map/GameMap.kt | 36 +--------- .../render/canvas/layer/TileLayerCanvas.kt | 18 +++++ .../editor/render/canvas/map/MapCanvas.kt | 70 +++++++++++++++++++ .../render => render/model}/Renderable.kt | 2 +- .../base/editor/view/component/map/MapPane.kt | 12 +++- .../base/editor/view/fragment/MapFragment.kt | 2 +- .../view/render/{ => renderer}/Renderer.kt | 3 +- 10 files changed, 106 insertions(+), 56 deletions(-) create mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/layer/TileLayerCanvas.kt create mode 100755 editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapCanvas.kt rename editor/src/main/kotlin/com/bartlomiejpluta/base/editor/{view/render => render/model}/Renderable.kt (64%) rename editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/{ => renderer}/Renderer.kt (78%) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt index 6be20704..f1623af9 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/controller/map/MapController.kt @@ -1,8 +1,7 @@ package com.bartlomiejpluta.base.editor.controller.map import com.bartlomiejpluta.base.editor.controller.tileset.TileSetController -import com.bartlomiejpluta.base.editor.model.map.GameMap -import com.bartlomiejpluta.base.editor.model.map.tileset.TileSet +import com.bartlomiejpluta.base.editor.model.map.map.GameMap import tornadofx.Controller class MapController : Controller() { diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/Layer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/Layer.kt index fce32aca..31b08f2d 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/Layer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/Layer.kt @@ -1,5 +1,3 @@ package com.bartlomiejpluta.base.editor.model.map.layer -import com.bartlomiejpluta.base.editor.view.render.Renderable - -interface Layer : Renderable \ No newline at end of file +interface Layer \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/TileLayer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/TileLayer.kt index f25a9db9..8e3271ff 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/TileLayer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/layer/TileLayer.kt @@ -3,17 +3,7 @@ package com.bartlomiejpluta.base.editor.model.map.layer import com.bartlomiejpluta.base.editor.model.map.tileset.Tile import javafx.scene.canvas.GraphicsContext -class TileLayer(private val layer: Array>) : Layer { +class TileLayer(val layer: Array>) : Layer { fun setTile(row: Int, column: Int, tile: Tile?) = apply { layer[row][column] = tile } - - override fun render(gc: GraphicsContext) { - for ((row, columns) in layer.withIndex()) { - for ((column, tile) in columns.withIndex()) { - if (tile != null) { - gc.drawImage(tile.image, column * tile.image.width, row * tile.image.height) - } - } - } - } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt index c3d6afb1..28630f5f 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/model/map/map/GameMap.kt @@ -1,39 +1,12 @@ -package com.bartlomiejpluta.base.editor.model.map +package com.bartlomiejpluta.base.editor.model.map.map import com.bartlomiejpluta.base.editor.model.map.layer.Layer import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer -import com.bartlomiejpluta.base.editor.model.map.tileset.Tile import com.bartlomiejpluta.base.editor.model.map.tileset.TileSet -import com.bartlomiejpluta.base.editor.view.render.Renderable -import javafx.beans.property.SimpleIntegerProperty -import javafx.scene.canvas.GraphicsContext -class Grid(private val tileSet: TileSet, private val rows: Int, private val columns: Int) : Renderable { - private var tileWidth = tileSet.tileWidth.toDouble() - private var tileHeight = tileSet.tileHeight.toDouble() - private var mapWidth = columns * tileWidth - private var mapHeight = rows * tileHeight - override fun render(gc: GraphicsContext) { - gc.lineWidth = LINE_WIDTH - - for (row in 0 until rows) { - gc.strokeLine(0.0, row * tileHeight, mapWidth, row * tileHeight) - } - - for (column in 0 until columns) { - gc.strokeLine(column * tileWidth, 0.0, column * tileWidth, mapHeight) - } - } - - companion object { - const val LINE_WIDTH = 1.5 - } -} - -class GameMap(private val tileSet: TileSet, private val rows: Int, private val columns: Int) : Renderable { +class GameMap(val tileSet: TileSet, val rows: Int, val columns: Int) { val layers = mutableListOf() - private val grid = Grid(tileSet, rows, columns) val width = columns * tileSet.tileWidth @@ -66,9 +39,4 @@ class GameMap(private val tileSet: TileSet, private val rows: Int, private val c fun setTile(layer: Int, row: Int, column: Int, tileRow: Int, tileColumn: Int) = apply { (layers[layer] as TileLayer).setTile(row, column, tileSet.getTile(tileRow, tileColumn)) } - - override fun render(gc: GraphicsContext) { - layers.forEach { it.render(gc) } - grid.render(gc) - } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/layer/TileLayerCanvas.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/layer/TileLayerCanvas.kt new file mode 100755 index 00000000..a8a50af5 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/layer/TileLayerCanvas.kt @@ -0,0 +1,18 @@ +package com.bartlomiejpluta.base.editor.render.canvas.layer + +import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer +import com.bartlomiejpluta.base.editor.render.model.Renderable +import javafx.scene.canvas.GraphicsContext + +class TileLayerCanvas(private val tileLayer: TileLayer) : Renderable { + + override fun render(gc: GraphicsContext) { + for ((row, columns) in tileLayer.layer.withIndex()) { + for ((column, tile) in columns.withIndex()) { + if (tile != null) { + gc.drawImage(tile.image, column * tile.image.width, row * tile.image.height) + } + } + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapCanvas.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapCanvas.kt new file mode 100755 index 00000000..8e750032 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/canvas/map/MapCanvas.kt @@ -0,0 +1,70 @@ +package com.bartlomiejpluta.base.editor.render.canvas.map + +import com.bartlomiejpluta.base.editor.model.map.map.GameMap +import com.bartlomiejpluta.base.editor.model.map.layer.Layer +import com.bartlomiejpluta.base.editor.model.map.layer.TileLayer +import com.bartlomiejpluta.base.editor.render.model.Renderable +import javafx.scene.canvas.GraphicsContext + +class MapCanvas(gameMap: GameMap) : Renderable { + private var layers: List + private var rows: Int + private var columns: Int + private var tileWidth: Double + private var tileHeight: Double + private var mapWidth: Double + private var mapHeight: Double + + init { + layers = gameMap.layers + rows = gameMap.rows + columns = gameMap.columns + tileWidth = gameMap.tileSet.tileWidth.toDouble() + tileHeight = gameMap.tileSet.tileHeight.toDouble() + mapWidth = columns * tileWidth + mapHeight = rows * tileHeight + } + + fun updateMap(gameMap: GameMap) { + layers = gameMap.layers + rows = gameMap.rows + columns = gameMap.columns + tileWidth = gameMap.tileSet.tileWidth.toDouble() + tileHeight = gameMap.tileSet.tileHeight.toDouble() + mapWidth = columns * tileWidth + mapHeight = rows * tileHeight + } + + override fun render(gc: GraphicsContext) { + layers.forEach { dispatchLayerRender(gc, it) } + renderGrid(gc) + } + + private fun dispatchLayerRender(gc: GraphicsContext, layer: Layer) { + when (layer) { + is TileLayer -> renderTileLayer(gc, layer) + } + } + + private fun renderTileLayer(gc: GraphicsContext, tileLayer: TileLayer) { + for ((row, columns) in tileLayer.layer.withIndex()) { + for ((column, tile) in columns.withIndex()) { + if (tile != null) { + gc.drawImage(tile.image, column * tile.image.width, row * tile.image.height) + } + } + } + } + + private fun renderGrid(gc: GraphicsContext) { + gc.lineWidth = 1.5 + + for (row in 0 until rows) { + gc.strokeLine(0.0, row * tileHeight, mapWidth, row * tileHeight) + } + + for (column in 0 until columns) { + gc.strokeLine(column * tileWidth, 0.0, column * tileWidth, mapHeight) + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/Renderable.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/model/Renderable.kt similarity index 64% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/Renderable.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/model/Renderable.kt index d29ad9b8..c9d7cf53 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/Renderable.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/render/model/Renderable.kt @@ -1,4 +1,4 @@ -package com.bartlomiejpluta.base.editor.view.render +package com.bartlomiejpluta.base.editor.render.model import javafx.scene.canvas.GraphicsContext diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt index be9c8ea5..79de2fc4 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/component/map/MapPane.kt @@ -1,15 +1,21 @@ package com.bartlomiejpluta.base.editor.view.component.map -import com.bartlomiejpluta.base.editor.model.map.GameMap -import com.bartlomiejpluta.base.editor.view.render.Renderer +import com.bartlomiejpluta.base.editor.model.map.map.GameMap +import com.bartlomiejpluta.base.editor.render.canvas.map.MapCanvas +import com.bartlomiejpluta.base.editor.view.render.renderer.Renderer import javafx.scene.canvas.Canvas class MapPane(map: GameMap) : Canvas() { - private val renderer = Renderer(graphicsContext2D, map) + private val mapCanvas = MapCanvas(map) + private val renderer = Renderer(graphicsContext2D, mapCanvas) init { width = map.width.toDouble() height = map.height.toDouble() renderer.start() } + + fun updateMap(map: GameMap) { + mapCanvas.updateMap(map) + } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt index dfa98504..02e6aefb 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/fragment/MapFragment.kt @@ -1,6 +1,6 @@ package com.bartlomiejpluta.base.editor.view.fragment -import com.bartlomiejpluta.base.editor.model.map.GameMap +import com.bartlomiejpluta.base.editor.model.map.map.GameMap import com.bartlomiejpluta.base.editor.view.component.map.MapPane import tornadofx.Fragment import tornadofx.group diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/Renderer.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/renderer/Renderer.kt similarity index 78% rename from editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/Renderer.kt rename to editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/renderer/Renderer.kt index 5f8c1921..f9712f83 100755 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/Renderer.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/view/render/renderer/Renderer.kt @@ -1,5 +1,6 @@ -package com.bartlomiejpluta.base.editor.view.render +package com.bartlomiejpluta.base.editor.view.render.renderer +import com.bartlomiejpluta.base.editor.render.model.Renderable import javafx.animation.AnimationTimer import javafx.scene.canvas.GraphicsContext