DEADSOFTWARE

3409fdf363f72ef44043c0ac629ef3e5b919d336
[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.Rectangle
7 import ru.deadsoftware.cavedroid.game.GameInput
8 import ru.deadsoftware.cavedroid.game.model.block.Block
9 import ru.deadsoftware.cavedroid.game.world.GameWorld
10 import ru.deadsoftware.cavedroid.misc.Assets
11 import ru.deadsoftware.cavedroid.misc.utils.px
13 abstract class BlocksRenderer(
14 protected val gameWorld: GameWorld,
15 protected val gameInput: GameInput,
16 ) : IGameRenderer {
18 protected abstract val background: Boolean
20 private val Block.canSeeThrough
21 get() = isNone() || params.isTransparent
23 private fun blockDamageTexture(index: Int): TextureRegion? {
24 if (index !in 0..MAX_BLOCK_DAMAGE_INDEX) {
25 return null
26 }
27 val textureKey = "$BLOCK_DAMAGE_TEXTURE_PREFIX$index"
28 return Assets.textureRegions[textureKey]
29 }
31 private fun drawBlockDamage(spriteBatch: SpriteBatch, block: Block, x: Float, y: Float) {
32 val blockDamage = gameInput.blockDamage
33 if (blockDamage <= 0) {
34 return
35 }
37 val index = MAX_BLOCK_DAMAGE_INDEX * (blockDamage / block.params.hitPoints)
38 val texture = blockDamageTexture(index) ?: return
40 spriteBatch.draw(texture, x, y)
41 }
43 protected fun shadeBackMap(
44 shapeRenderer: ShapeRenderer,
45 viewport: Rectangle,
46 x: Int,
47 y: Int
48 ) {
49 val foregroundBlock = gameWorld.getForeMap(x, y)
50 val backgroundBlock = gameWorld.getBackMap(x, y)
52 if (foregroundBlock.canSeeThrough && !backgroundBlock.isNone()) {
53 val drawX = x.px - viewport.x
54 val drawY = y.px - viewport.y
55 val marginLeft = backgroundBlock.params.spriteMargins.left
56 val marginTop = backgroundBlock.params.spriteMargins.top
58 shapeRenderer.rect(
59 /* x = */ drawX + marginLeft,
60 /* y = */ drawY + marginTop,
61 /* width = */ backgroundBlock.width,
62 /* height = */ backgroundBlock.height
63 )
64 }
65 }
67 protected fun drawBackMap(spriteBatch: SpriteBatch, viewport: Rectangle, x: Int, y: Int) {
68 val foregroundBlock = gameWorld.getForeMap(x, y)
69 val backgroundBlock = gameWorld.getBackMap(x, y)
71 if (foregroundBlock.canSeeThrough && !backgroundBlock.isNone()) {
72 val drawX = x.px - viewport.x
73 val drawY = y.px - viewport.y
74 backgroundBlock.draw(spriteBatch, drawX, drawY)
76 if (foregroundBlock.isNone()) {
77 drawBlockDamage(spriteBatch, backgroundBlock, drawX, drawY)
78 }
79 }
80 }
82 protected fun drawForeMap(spriteBatch: SpriteBatch, viewport: Rectangle, x: Int, y: Int) {
83 val foregroundBlock = gameWorld.getForeMap(x, y)
85 if (!foregroundBlock.isNone() && foregroundBlock.params.isBackground == background) {
86 val drawX = x.px - viewport.x
87 val drawY = y.px - viewport.y
88 foregroundBlock.draw(spriteBatch, drawX, drawY)
90 if (!foregroundBlock.isNone()) {
91 drawBlockDamage(spriteBatch, foregroundBlock, drawX, drawY)
92 }
93 }
94 }
96 companion object {
97 private const val BLOCK_DAMAGE_TEXTURE_PREFIX = "break_"
98 private const val MAX_BLOCK_DAMAGE_INDEX = 10
99 }