DEADSOFTWARE

Move block damage and cursor to player class
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / render / BlocksRenderer.kt
1 package ru.deadsoftware.cavedroid.game.render
3 import com.badlogic.gdx.graphics.g2d.SpriteBatch
4 import com.badlogic.gdx.graphics.g2d.TextureRegion
5 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
6 import com.badlogic.gdx.math.MathUtils
7 import com.badlogic.gdx.math.Rectangle
8 import ru.deadsoftware.cavedroid.game.GameInput
9 import ru.deadsoftware.cavedroid.game.mobs.MobsController
10 import ru.deadsoftware.cavedroid.game.model.block.Block
11 import ru.deadsoftware.cavedroid.game.world.GameWorld
12 import ru.deadsoftware.cavedroid.misc.Assets
13 import ru.deadsoftware.cavedroid.misc.utils.px
15 abstract class BlocksRenderer(
16 protected val gameWorld: GameWorld,
17 protected val mobsController: MobsController,
18 ) : IGameRenderer {
20 protected abstract val background: Boolean
22 private val Block.canSeeThrough
23 get() = isNone() || params.isTransparent
25 private fun blockDamageTexture(index: Int): TextureRegion? {
26 if (index !in 0..MAX_BLOCK_DAMAGE_INDEX) {
27 return null
28 }
29 val textureKey = "$BLOCK_DAMAGE_TEXTURE_PREFIX$index"
30 return Assets.textureRegions[textureKey]
31 }
33 protected fun drawBlockDamage(spriteBatch: SpriteBatch, viewport: Rectangle) {
34 val player = mobsController.player
35 val blockDamage = player.blockDamage.takeIf { it > 0f } ?: return
36 val cursorX = player.cursorX
37 val cursorY = player.cursorY
39 val block = if (background) {
40 gameWorld.getBackMap(cursorX, cursorY)
41 } else {
42 gameWorld.getForeMap(cursorX, cursorY)
43 }
45 val index = (MAX_BLOCK_DAMAGE_INDEX.toFloat() * (blockDamage.toFloat() / block.params.hitPoints.toFloat()))
46 .let(MathUtils::floor)
47 val texture = blockDamageTexture(index) ?: return
49 if (gameWorld.hasForeAt(cursorX, cursorY) != background) {
50 spriteBatch.draw(texture, cursorX.px - viewport.x, cursorY.px - viewport.y)
51 }
52 }
54 protected fun shadeBackMap(
55 shapeRenderer: ShapeRenderer,
56 viewport: Rectangle,
57 x: Int,
58 y: Int
59 ) {
60 val foregroundBlock = gameWorld.getForeMap(x, y)
61 val backgroundBlock = gameWorld.getBackMap(x, y)
63 if (foregroundBlock.canSeeThrough && !backgroundBlock.isNone()) {
64 val drawX = x.px - viewport.x
65 val drawY = y.px - viewport.y
66 val marginLeft = backgroundBlock.params.spriteMargins.left
67 val marginTop = backgroundBlock.params.spriteMargins.top
69 shapeRenderer.rect(
70 /* x = */ drawX + marginLeft,
71 /* y = */ drawY + marginTop,
72 /* width = */ backgroundBlock.width,
73 /* height = */ backgroundBlock.height
74 )
75 }
76 }
78 protected fun drawBackMap(spriteBatch: SpriteBatch, viewport: Rectangle, x: Int, y: Int) {
79 val foregroundBlock = gameWorld.getForeMap(x, y)
80 val backgroundBlock = gameWorld.getBackMap(x, y)
82 if (foregroundBlock.canSeeThrough && !backgroundBlock.isNone()) {
83 val drawX = x.px - viewport.x
84 val drawY = y.px - viewport.y
85 backgroundBlock.draw(spriteBatch, drawX, drawY)
86 }
87 }
89 protected fun drawForeMap(spriteBatch: SpriteBatch, viewport: Rectangle, x: Int, y: Int) {
90 val foregroundBlock = gameWorld.getForeMap(x, y)
92 if (!foregroundBlock.isNone() && foregroundBlock.params.isBackground == background) {
93 val drawX = x.px - viewport.x
94 val drawY = y.px - viewport.y
95 foregroundBlock.draw(spriteBatch, drawX, drawY)
96 }
97 }
99 companion object {
100 private const val BLOCK_DAMAGE_TEXTURE_PREFIX = "break_"
101 private const val MAX_BLOCK_DAMAGE_INDEX = 10