X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2Frender%2FBlocksRenderer.kt;h=378ed7b9191c048884db9d80fdc953e7273cb155;hb=969518fd0bbde98b81c885c62f973d74ff5f61bb;hp=3409fdf363f72ef44043c0ac629ef3e5b919d336;hpb=fd73b6dd24b9fe55c0bc8f52f8aa1104a5fe3cb0;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/render/BlocksRenderer.kt b/core/src/ru/deadsoftware/cavedroid/game/render/BlocksRenderer.kt index 3409fdf..378ed7b 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/render/BlocksRenderer.kt +++ b/core/src/ru/deadsoftware/cavedroid/game/render/BlocksRenderer.kt @@ -1,10 +1,12 @@ package ru.deadsoftware.cavedroid.game.render +import com.badlogic.gdx.graphics.g2d.Sprite import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.glutils.ShapeRenderer +import com.badlogic.gdx.math.MathUtils import com.badlogic.gdx.math.Rectangle -import ru.deadsoftware.cavedroid.game.GameInput +import ru.deadsoftware.cavedroid.game.mobs.MobsController import ru.deadsoftware.cavedroid.game.model.block.Block import ru.deadsoftware.cavedroid.game.world.GameWorld import ru.deadsoftware.cavedroid.misc.Assets @@ -12,7 +14,7 @@ import ru.deadsoftware.cavedroid.misc.utils.px abstract class BlocksRenderer( protected val gameWorld: GameWorld, - protected val gameInput: GameInput, + protected val mobsController: MobsController, ) : IGameRenderer { protected abstract val background: Boolean @@ -20,24 +22,38 @@ abstract class BlocksRenderer( private val Block.canSeeThrough get() = isNone() || params.isTransparent - private fun blockDamageTexture(index: Int): TextureRegion? { - if (index !in 0..MAX_BLOCK_DAMAGE_INDEX) { + private fun blockDamageSprite(index: Int): Sprite? { + if (index !in 0..< MAX_BLOCK_DAMAGE_INDEX) { return null } - val textureKey = "$BLOCK_DAMAGE_TEXTURE_PREFIX$index" - return Assets.textureRegions[textureKey] + return Assets.blockDamageSprites[index] } - private fun drawBlockDamage(spriteBatch: SpriteBatch, block: Block, x: Float, y: Float) { - val blockDamage = gameInput.blockDamage - if (blockDamage <= 0) { - return + protected fun drawBlockDamage(spriteBatch: SpriteBatch, viewport: Rectangle) { + val player = mobsController.player + val blockDamage = player.blockDamage.takeIf { it > 0f } ?: return + val cursorX = player.cursorX + val cursorY = player.cursorY + + val block = if (background) { + gameWorld.getBackMap(cursorX, cursorY) + } else { + gameWorld.getForeMap(cursorX, cursorY) } - val index = MAX_BLOCK_DAMAGE_INDEX * (blockDamage / block.params.hitPoints) - val texture = blockDamageTexture(index) ?: return + val index = (MAX_BLOCK_DAMAGE_INDEX.toFloat() * (blockDamage.toFloat() / block.params.hitPoints.toFloat())) + .let(MathUtils::floor) + val sprite = blockDamageSprite(index) ?: return - spriteBatch.draw(texture, x, y) + if (gameWorld.hasForeAt(cursorX, cursorY) != background) { + sprite.setBounds( + /* x = */ cursorX.px - viewport.x + block.params.spriteMargins.left, + /* y = */ cursorY.px - viewport.y + block.params.spriteMargins.top, + /* width = */ block.spriteWidth, + /* height = */ block.spriteHeight + ) + sprite.draw(spriteBatch) + } } protected fun shadeBackMap( @@ -72,10 +88,6 @@ abstract class BlocksRenderer( val drawX = x.px - viewport.x val drawY = y.px - viewport.y backgroundBlock.draw(spriteBatch, drawX, drawY) - - if (foregroundBlock.isNone()) { - drawBlockDamage(spriteBatch, backgroundBlock, drawX, drawY) - } } } @@ -86,15 +98,10 @@ abstract class BlocksRenderer( val drawX = x.px - viewport.x val drawY = y.px - viewport.y foregroundBlock.draw(spriteBatch, drawX, drawY) - - if (!foregroundBlock.isNone()) { - drawBlockDamage(spriteBatch, foregroundBlock, drawX, drawY) - } } } companion object { - private const val BLOCK_DAMAGE_TEXTURE_PREFIX = "break_" private const val MAX_BLOCK_DAMAGE_INDEX = 10 }