DEADSOFTWARE

MainComponent in kotlin
[cavedroid.git] / core / src / main / kotlin / ru / deadsoftware / cavedroid / game / render / DebugRenderer.kt
1 package ru.deadsoftware.cavedroid.game.render
3 import com.badlogic.gdx.graphics.Color
4 import com.badlogic.gdx.graphics.g2d.SpriteBatch
5 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
6 import com.badlogic.gdx.math.Rectangle
7 import ru.deadsoftware.cavedroid.MainConfig
8 import ru.deadsoftware.cavedroid.game.GameScope
9 import ru.deadsoftware.cavedroid.game.debug.DebugInfoStringsProvider
10 import ru.deadsoftware.cavedroid.game.mobs.MobsController
11 import ru.deadsoftware.cavedroid.game.model.block.Block
12 import ru.deadsoftware.cavedroid.game.world.GameWorld
13 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
14 import ru.deadsoftware.cavedroid.misc.utils.bl
15 import ru.deadsoftware.cavedroid.misc.utils.drawString
16 import ru.deadsoftware.cavedroid.misc.utils.forEachBlockInArea
17 import ru.deadsoftware.cavedroid.misc.utils.px
18 import javax.inject.Inject
20 @GameScope
21 @BindRenderer
22 class DebugRenderer @Inject constructor(
23 private val mainConfig: MainConfig,
24 private val gameWorld: GameWorld,
25 private val mobsController: MobsController,
26 private val debugInfoStringsProvider: DebugInfoStringsProvider,
27 ) : IGameRenderer {
29 override val renderLayer get() = RENDER_LAYER
31 private fun getMinimapColor(x: Int, y: Int): Color? {
32 val foregroundBlock = gameWorld.getForeMap(x, y)
34 return if (!foregroundBlock.isNone()) {
35 when (foregroundBlock) {
36 is Block.Water -> Color.BLUE
37 is Block.Lava -> Color.RED
38 else -> Color.BLACK
39 }
40 } else if (gameWorld.hasBackAt(x, y)) {
41 Color.DARK_GRAY
42 } else {
43 null
44 }
45 }
47 private fun drawMinimap(
48 spriteBatch: SpriteBatch,
49 shapeRenderer: ShapeRenderer,
50 minimapX: Float,
51 minimapY: Float,
52 minimapSize: Float
53 ) {
54 val mapArea = Rectangle(
55 /* x = */ mobsController.player.x - (minimapSize.px / 2),
56 /* y = */ mobsController.player.y - (minimapSize.px / 2),
57 /* width = */ minimapSize.px,
58 /* height = */ minimapSize.px
59 )
61 spriteBatch.end()
62 shapeRenderer.begin(ShapeRenderer.ShapeType.Filled)
63 shapeRenderer.color = Color.LIGHT_GRAY
64 shapeRenderer.rect(minimapX, minimapY, minimapSize, minimapSize)
66 forEachBlockInArea(mapArea) { x, y ->
67 getMinimapColor(x, y)?.let { color ->
68 shapeRenderer.setColor(color)
69 shapeRenderer.rect(
70 /* x = */ minimapX + (x - mapArea.x.bl),
71 /* y = */ minimapY + (y - mapArea.y.bl),
72 /* width = */ 1f,
73 /* height = */ 1f
74 )
75 }
76 }
78 shapeRenderer.color = Color.OLIVE
79 shapeRenderer.rect(minimapX + minimapSize / 2, minimapY + minimapSize / 2, 1f, 2f)
80 shapeRenderer.end()
81 spriteBatch.begin()
82 }
84 private fun drawDebugInfo(spriteBatch: SpriteBatch) {
85 debugInfoStringsProvider.getDebugStrings().forEachIndexed { index, str ->
86 spriteBatch.drawString(str, 0f, index * 10f)
87 }
88 }
90 override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
91 if (mainConfig.isShowInfo) {
92 drawDebugInfo(spriteBatch)
93 }
95 if (mainConfig.isShowMap) {
96 drawMinimap(
97 spriteBatch = spriteBatch,
98 shapeRenderer = shapeRenderer,
99 minimapX = viewport.width - MinimapConfig.margin - MinimapConfig.size,
100 minimapY = MinimapConfig.margin,
101 minimapSize = MinimapConfig.size
107 companion object {
108 private const val RENDER_LAYER = Int.MAX_VALUE
110 private data object MinimapConfig {
111 const val margin = 24f
112 const val size = 64f