X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2Fmodel%2Fblock%2FBlock.kt;h=fa99bfd91ed2afa2ed63221b23374ba221ad1baa;hb=3a443514027417133d7a7e18766720dfea028a87;hp=76c6ac580c0df1a6604c447e3f1c0e930496f456;hpb=f34df6e5eb1052467333f1461c67e75b21eb0d95;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/model/block/Block.kt b/core/src/ru/deadsoftware/cavedroid/game/model/block/Block.kt index 76c6ac5..fa99bfd 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/model/block/Block.kt +++ b/core/src/ru/deadsoftware/cavedroid/game/model/block/Block.kt @@ -20,14 +20,14 @@ sealed class Block { val spriteWidth: Float get() = 16f - params.spriteMargins.left - params.spriteMargins.right val spriteHeight: Float get() = 16f - params.spriteMargins.top - params.spriteMargins.bottom - private var animation: Array? = null + protected var animation: Array? = null private var _sprite: Sprite? = null get() { return animation?.get(currentAnimationFrame) ?: field } - val sprite: Sprite + open val sprite: Sprite get() = requireNotNull(_sprite) { "null sprite for block '${params.key}'" } private val currentAnimationFrame: Int @@ -111,6 +111,21 @@ sealed class Block { return this is Slab } + fun isContainer(): Boolean { + contract { returns(true) implies (this@Block is Container) } + return this is Container + } + + fun isFurnace(): Boolean { + contract { returns(true) implies (this@Block is Furnace) } + return this is Furnace + } + + fun isChest(): Boolean { + contract { returns(true) implies (this@Block is Chest) } + return this is Chest + } + fun isNone(): Boolean { contract { returns(true) implies (this@Block is None) } return this is None @@ -125,6 +140,8 @@ sealed class Block { ) } + sealed class Container() : Block() + data class None( override val params: CommonBlockParams ) : Block() @@ -133,6 +150,41 @@ sealed class Block { override val params: CommonBlockParams, ) : Block() + data class Furnace( + override val params: CommonBlockParams, + ): Container() { + + override val sprite: Sprite + get() = getSprite(false) + + private fun getSprite(isActive: Boolean): Sprite { + return animation?.let { animation -> + if (isActive) { + animation[1] + } else { + animation[0] + } + } ?: sprite + } + + fun draw(spriter: SpriteBatch, x: Float, y: Float, isActive: Boolean) { + getSprite(isActive).apply { + setBounds( + /* x = */ x + params.spriteMargins.left, + /* y = */ y + params.spriteMargins.top, + /* width = */ spriteWidth, + /* height = */ spriteHeight + ) + draw(spriter) + } + } + + } + + data class Chest( + override val params: CommonBlockParams + ): Container() + data class Slab( override val params: CommonBlockParams, val fullBlockKey: String,