a point to insert the item image to the item sprite

This commit is contained in:
minjaesong
2022-01-06 14:56:36 +09:00
parent b1856852e4
commit 0d14f9e027
11 changed files with 73 additions and 36 deletions

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.spriteassembler.ADProperties import net.torvald.spriteassembler.ADProperties
import net.torvald.spriteassembler.AssembleSheetPixmap import net.torvald.spriteassembler.AssembleSheetPixmap
import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/** /**
@@ -30,11 +31,11 @@ interface HasAssembledSprite {
* reassembleSprite(this.sprite, this.spriteGlow) * reassembleSprite(this.sprite, this.spriteGlow)
* ``` * ```
*/ */
fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null, item: GameItem?) {
if (animDesc != null && sprite != null) if (animDesc != null && sprite != null)
_rebuild(animDesc!!, sprite) _rebuild(animDesc!!, sprite, null)
if (animDescGlow != null && spriteGlow != null) if (animDescGlow != null && spriteGlow != null)
_rebuild(animDescGlow!!, spriteGlow) _rebuild(animDescGlow!!, spriteGlow, null)
} }
/*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { /*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {
@@ -44,10 +45,10 @@ interface HasAssembledSprite {
_rebuild(disk, animGlow, spriteGlow) _rebuild(disk, animGlow, spriteGlow)
}*/ }*/
private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) { private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation, item: GameItem?) {
// TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job? // TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job?
val pixmap = AssembleSheetPixmap.fromAssetsDir(ad) val pixmap = AssembleSheetPixmap.fromAssetsDir(ad, item)
val texture = Texture(pixmap) val texture = Texture(pixmap)
texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest)
pixmap.dispose() pixmap.dispose()

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.Pixmap
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.utils.GdxRuntimeException import com.badlogic.gdx.utils.GdxRuntimeException
import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.linearSearch import net.torvald.terrarum.linearSearch
import net.torvald.terrarum.savegame.ByteArray64InputStream import net.torvald.terrarum.savegame.ByteArray64InputStream
import net.torvald.terrarum.savegame.ByteArray64Reader import net.torvald.terrarum.savegame.ByteArray64Reader
@@ -47,25 +48,25 @@ object AssembleSheetPixmap {
} }
private fun drawAndGetCanvas(properties: ADProperties, fileGetter: (String) -> InputStream?): Pixmap { private fun drawAndGetCanvas(properties: ADProperties, fileGetter: (String) -> InputStream?, injectedItem: GameItem?): Pixmap {
val canvas = Pixmap(properties.cols * properties.frameWidth, properties.rows * properties.frameHeight, Pixmap.Format.RGBA8888) val canvas = Pixmap(properties.cols * properties.frameWidth, properties.rows * properties.frameHeight, Pixmap.Format.RGBA8888)
canvas.blending = Pixmap.Blending.SourceOver canvas.blending = Pixmap.Blending.SourceOver
// actually draw // actually draw
properties.transforms.forEach { t, _ -> properties.transforms.forEach { t, _ ->
drawThisFrame(t, canvas, properties, fileGetter) drawThisFrame(t, canvas, properties, fileGetter, injectedItem)
} }
return canvas return canvas
} }
fun fromAssetsDir(properties: ADProperties) = drawAndGetCanvas(properties, getAssetsDirFileGetter(properties)) fun fromAssetsDir(properties: ADProperties, injectedItem: GameItem?) = drawAndGetCanvas(properties, getAssetsDirFileGetter(properties), injectedItem)
fun fromVirtualDisk(disk: SimpleFileSystem, entrynum: Long, properties: ADProperties): Pixmap { fun fromVirtualDisk(disk: SimpleFileSystem, entrynum: Long, properties: ADProperties, injectedItem: GameItem?): Pixmap {
val bodypartMapping = Properties() val bodypartMapping = Properties()
bodypartMapping.load(ByteArray64Reader(disk.getFile(entrynum)!!.bytes, Common.CHARSET)) bodypartMapping.load(ByteArray64Reader(disk.getFile(entrynum)!!.bytes, Common.CHARSET))
return drawAndGetCanvas(properties, getVirtualDiskFileGetter(bodypartMapping, disk)) return drawAndGetCanvas(properties, getVirtualDiskFileGetter(bodypartMapping, disk), injectedItem)
} }
fun getPartPixmap(getFile: (String) -> InputStream?, partName: String): Pixmap? { fun getPartPixmap(getFile: (String) -> InputStream?, partName: String): Pixmap? {
@@ -131,7 +132,8 @@ object AssembleSheetPixmap {
private fun drawThisFrame(frameName: String, private fun drawThisFrame(frameName: String,
canvas: Pixmap, canvas: Pixmap,
properties: ADProperties, properties: ADProperties,
fileGetter: (String) -> InputStream? fileGetter: (String) -> InputStream?,
injectedItem: GameItem?
) { ) {
val theAnim = properties.getAnimByFrameName(frameName) val theAnim = properties.getAnimByFrameName(frameName)
val skeleton = theAnim.skeleton.joints.reversed() val skeleton = theAnim.skeleton.joints.reversed()
@@ -158,7 +160,7 @@ object AssembleSheetPixmap {
// AppLoader.printdbg(this, "Frame to draw: $frameName (R$animRow C$animFrame)") // AppLoader.printdbg(this, "Frame to draw: $frameName (R$animRow C$animFrame)")
drawFrame(animRow, animFrame, canvas, properties, bodypartOrigins, bodypartImages, transformList) drawFrame(animRow, animFrame, canvas, properties, bodypartOrigins, bodypartImages, transformList, injectedItem)
bodypartImages.values.forEach { it?.dispose() } bodypartImages.values.forEach { it?.dispose() }
} }
@@ -168,7 +170,8 @@ object AssembleSheetPixmap {
props: ADProperties, props: ADProperties,
bodypartOrigins: HashMap<String, ADPropertyObject.Vector2i>, bodypartOrigins: HashMap<String, ADPropertyObject.Vector2i>,
bodypartImages: Map<String, Pixmap?>, bodypartImages: Map<String, Pixmap?>,
transformList: List<Pair<String, ADPropertyObject.Vector2i>> transformList: List<Pair<String, ADPropertyObject.Vector2i>>,
injectedItem: GameItem?
) { ) {
val tmpFrame = Pixmap(props.frameWidth, props.frameHeight, Pixmap.Format.RGBA8888) val tmpFrame = Pixmap(props.frameWidth, props.frameHeight, Pixmap.Format.RGBA8888)
@@ -187,6 +190,8 @@ object AssembleSheetPixmap {
(row - 1) * props.frameHeight (row - 1) * props.frameHeight
) )
// TODO use injectedItem
tmpFrame.dispose() tmpFrame.dispose()
} }

View File

@@ -298,7 +298,7 @@ class SpriteAssemblerPreview: Game() {
} }
private fun assembleImage(prop: ADProperties) { private fun assembleImage(prop: ADProperties) {
image = AssembleSheetPixmap.fromAssetsDir(prop) image = AssembleSheetPixmap.fromAssetsDir(prop, null)
} }
// TODO rename to requestAssembly // TODO rename to requestAssembly

View File

@@ -9,6 +9,7 @@ import net.torvald.spriteassembler.AssembleSheetPixmap
import net.torvald.terrarum.App import net.torvald.terrarum.App
import net.torvald.terrarum.Terrarum import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.savegame.SimpleFileSystem import net.torvald.terrarum.savegame.SimpleFileSystem
import net.torvald.terrarum.utils.PlayerLastStatus import net.torvald.terrarum.utils.PlayerLastStatus
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
@@ -71,6 +72,12 @@ class IngamePlayer : ActorHumanoid {
} }
/** To be used later by the game to rebuild the sprite.
* Which `_rebuild` function to use is determined at the load time.
*/
private lateinit var rebuildfun: (item: GameItem?) -> Unit
private lateinit var rebuildfunGlow: (item: GameItem?) -> Unit
/** /**
* Example usage: * Example usage:
@@ -82,19 +89,19 @@ class IngamePlayer : ActorHumanoid {
* reassembleSprite(this.sprite, this.spriteGlow) * reassembleSprite(this.sprite, this.spriteGlow)
* ``` * ```
*/ */
fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation?, heldItem: GameItem?) {
if (animDesc != null && sprite != null) { if (animDesc != null && sprite != null) {
_rebuild(animDesc!!, sprite) rebuildfun = { item: GameItem? -> _rebuild(animDesc!!, sprite, item) }; rebuildfun(heldItem)
spriteHeadTexture = AssembleSheetPixmap.getMugshotFromAssetsDir(animDesc!!) spriteHeadTexture = AssembleSheetPixmap.getMugshotFromAssetsDir(animDesc!!)
} }
if (animDescGlow != null && spriteGlow != null) if (animDescGlow != null && spriteGlow != null)
_rebuild(animDescGlow!!, spriteGlow) rebuildfunGlow = { item: GameItem? -> _rebuild(animDescGlow!!, spriteGlow, item) }; rebuildfunGlow(heldItem)
} }
fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { fun reassembleSpriteFromDisk(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation?, heldItem: GameItem?) {
if (animDesc != null && sprite != null) { if (animDesc != null && sprite != null) {
_rebuild(disk, -1025L, animDesc!!, sprite) rebuildfun = { item: GameItem? -> _rebuild(disk, -1025L, animDesc!!, sprite, item) }; rebuildfun(heldItem)
if (disk.getEntry(-1025L) != null) if (disk.getEntry(-1025L) != null)
spriteHeadTexture = AssembleSheetPixmap.getMugshotFromVirtualDisk(disk, -1025L, animDesc!!) spriteHeadTexture = AssembleSheetPixmap.getMugshotFromVirtualDisk(disk, -1025L, animDesc!!)
@@ -102,13 +109,13 @@ class IngamePlayer : ActorHumanoid {
spriteHeadTexture = AssembleSheetPixmap.getMugshotFromAssetsDir(animDesc!!) spriteHeadTexture = AssembleSheetPixmap.getMugshotFromAssetsDir(animDesc!!)
} }
if (animDescGlow != null && spriteGlow != null) if (animDescGlow != null && spriteGlow != null)
_rebuild(disk, -1026L, animDescGlow!!, spriteGlow) rebuildfunGlow = { item: GameItem? -> _rebuild(disk, -1026L, animDescGlow!!, spriteGlow, item) }; rebuildfunGlow(heldItem)
} }
private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) { private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation, item: GameItem?) {
// TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job? // TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job?
val pixmap = AssembleSheetPixmap.fromAssetsDir(ad) val pixmap = AssembleSheetPixmap.fromAssetsDir(ad, item)
val texture = Texture(pixmap) val texture = Texture(pixmap)
texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest)
pixmap.dispose() pixmap.dispose()
@@ -129,10 +136,10 @@ class IngamePlayer : ActorHumanoid {
sprite.nRows = newAnimDelays.size sprite.nRows = newAnimDelays.size
} }
private fun _rebuild(disk: SimpleFileSystem, entrynum: Long, ad: ADProperties, sprite: SpriteAnimation) { private fun _rebuild(disk: SimpleFileSystem, entrynum: Long, ad: ADProperties, sprite: SpriteAnimation, item: GameItem?) {
// TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job? // TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job?
val pixmap = if (disk.getEntry(entrynum) != null) AssembleSheetPixmap.fromVirtualDisk(disk, entrynum, ad) else AssembleSheetPixmap.fromAssetsDir(ad) val pixmap = if (disk.getEntry(entrynum) != null) AssembleSheetPixmap.fromVirtualDisk(disk, entrynum, ad, item) else AssembleSheetPixmap.fromAssetsDir(ad, item)
val texture = Texture(pixmap) val texture = Texture(pixmap)
texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest)
pixmap.dispose() pixmap.dispose()
@@ -156,4 +163,24 @@ class IngamePlayer : ActorHumanoid {
override fun getSpriteHead(): TextureRegion? { override fun getSpriteHead(): TextureRegion? {
return spriteHeadTexture return spriteHeadTexture
} }
override fun equipItem(item: GameItem) {
super.equipItem(item)
// TODO redraw sprite with held item sprite (use sprite joint "HELD_ITEM")
if (item.equipPosition == GameItem.EquipPosition.HAND_GRIP) {
rebuildfun(item)
animDescGlow?.let { rebuildfunGlow(item) }
}
}
override fun unequipItem(item: GameItem?) {
super.unequipItem(item)
// redraw sprite without held item sprite (use sprite joint "HELD_ITEM")
item?.let { item -> if (item.equipPosition == GameItem.EquipPosition.HAND_GRIP) {
rebuildfun(null)
animDescGlow?.let { rebuildfunGlow(null) }
} }
}
} }

View File

@@ -29,7 +29,7 @@ object PlayerBuilderTestSubject1 {
p.sprite = SpriteAnimation(p) p.sprite = SpriteAnimation(p)
p.spriteGlow = SpriteAnimation(p) p.spriteGlow = SpriteAnimation(p)
p.reassembleSprite(p.sprite, p.spriteGlow) p.reassembleSprite(p.sprite, p.spriteGlow, null)
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0) p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0)
// ingame must teleport the player to the spawn point // ingame must teleport the player to the spawn point

View File

@@ -30,7 +30,7 @@ object PlayerBuilderWerebeastTest {
p.sprite = SpriteAnimation(p) p.sprite = SpriteAnimation(p)
p.spriteGlow = SpriteAnimation(p) p.spriteGlow = SpriteAnimation(p)
p.reassembleSprite(p.sprite, p.spriteGlow) p.reassembleSprite(p.sprite, p.spriteGlow, null)
p.setHitboxDimension(22, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 30, 0) p.setHitboxDimension(22, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 30, 0)
p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE) p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE)

View File

@@ -551,7 +551,7 @@ class UIItemPlayerCells(
val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET)) val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET))
p.sprite = SpriteAnimation(p) p.sprite = SpriteAnimation(p)
p.animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET)) p.animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET))
p.reassembleSprite(skimmer, p.sprite) p.reassembleSpriteFromDisk(skimmer, p.sprite, null, null)
p.sprite!!.textureRegion.get(0,0).let { p.sprite!!.textureRegion.get(0,0).let {
thumb = it thumb = it
thumb!!.flip(false, false) thumb!!.flip(false, false)

View File

@@ -441,9 +441,9 @@ removefile:
} }
fun dispose() { // fun dispose() {
fa.close() // fa.close()
} // }
companion object { companion object {

View File

@@ -3,8 +3,10 @@ package net.torvald.terrarum.serialise
import net.torvald.spriteanimation.HasAssembledSprite import net.torvald.spriteanimation.HasAssembledSprite
import net.torvald.spriteanimation.SpriteAnimation import net.torvald.spriteanimation.SpriteAnimation
import net.torvald.spriteassembler.ADProperties import net.torvald.spriteassembler.ADProperties
import net.torvald.terrarum.ItemCodex
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
import net.torvald.terrarum.savegame.* import net.torvald.terrarum.savegame.*
@@ -140,16 +142,18 @@ object ReadActor {
actor.animDescGlow = ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET)) actor.animDescGlow = ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
} }
val heldItem = ItemCodex[actor.inventory.itemEquipped[GameItem.EquipPosition.HAND_GRIP]]
if (bodypartsFile != null) if (bodypartsFile != null)
actor.reassembleSprite(disk, actor.sprite!!, actor.spriteGlow) actor.reassembleSpriteFromDisk(disk, actor.sprite!!, actor.spriteGlow, heldItem)
else else
actor.reassembleSprite(actor.sprite!!, actor.spriteGlow) actor.reassembleSprite(actor.sprite!!, actor.spriteGlow, heldItem)
} }
else if (actor is ActorWithBody && actor is HasAssembledSprite) { else if (actor is ActorWithBody && actor is HasAssembledSprite) {
if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor) if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor)
if (actor.animDescGlow != null) actor.spriteGlow = SpriteAnimation(actor) if (actor.animDescGlow != null) actor.spriteGlow = SpriteAnimation(actor)
actor.reassembleSprite(actor.sprite, actor.spriteGlow) actor.reassembleSprite(actor.sprite, actor.spriteGlow, null)
} }

View File

@@ -163,8 +163,8 @@ object LoadSavegame {
newIngame.worldSavefileName = getWorldSavefileName(newIngame.savegameNickname, world) newIngame.worldSavefileName = getWorldSavefileName(newIngame.savegameNickname, world)
newIngame.playerSavefileName = getPlayerSavefileName(player) newIngame.playerSavefileName = getPlayerSavefileName(player)
worldDisk.dispose() // worldDisk.dispose()
playerDisk.dispose() // playerDisk.dispose()
val loadJob = { it: LoadScreenBase -> val loadJob = { it: LoadScreenBase ->
val loadscreen = it as ChunkLoadingLoadScreen val loadscreen = it as ChunkLoadingLoadScreen

View File

@@ -11,7 +11,7 @@ class SpriteAssemblerTest {
operator fun invoke() { operator fun invoke() {
val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR)) val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR))
AssembleSheetPixmap.fromAssetsDir(properties) AssembleSheetPixmap.fromAssetsDir(properties, null)
} }
} }