From 5d75d467807dc80da2b8512c5b7c2f8f65c94a14 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 6 Jan 2019 04:19:21 +0900 Subject: [PATCH] ADProperties now properly stores parsed mumbojumbo --- .../torvald/spriteassembler/ADProperties.kt | 71 +++++++++++++------ .../spriteassembler/AssembleFrameGdxPixmap.kt | 15 ++++ .../spriteassembler/SpriteAssemblerApp.kt | 4 +- 3 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt diff --git a/src/net/torvald/spriteassembler/ADProperties.kt b/src/net/torvald/spriteassembler/ADProperties.kt index 3c1356ebf..02f1515e7 100644 --- a/src/net/torvald/spriteassembler/ADProperties.kt +++ b/src/net/torvald/spriteassembler/ADProperties.kt @@ -3,10 +3,21 @@ package net.torvald.spriteassembler import java.io.InputStream import java.io.Reader import java.util.* -import kotlin.collections.ArrayList import kotlin.collections.HashMap import kotlin.collections.HashSet +data class Joint(val name: String, val position: ADPropertyObject.Vector2i) { + override fun toString() = "$name $position" +} + +data class Skeleton(val name: String, val joints: List) { + override fun toString() = "$name=$joints" +} + +data class Animation(val name: String, val delay: Float, val row: Int, val skeleton: Skeleton) { + override fun toString() = "$name delay: $delay, row: $row, skeleton: ${skeleton.name}" +} + class ADProperties { private val javaProp = Properties() @@ -17,9 +28,9 @@ class ADProperties { lateinit var bodyparts: List; private set lateinit var bodypartFiles: List; private set /** properties that are being used as skeletons */ - lateinit var skeletons: List; private set + lateinit var skeletons: HashMap; private set /** properties that are recognised as animations */ - lateinit var animations: List; private set + lateinit var animations: HashMap; private set private val reservedProps = listOf("SPRITESHEET", "EXTENSION") private val animMustContain = listOf("DELAY", "ROW", "SKELETON") @@ -42,7 +53,7 @@ class ADProperties { val propsStr = javaProp.getProperty(propName as String) val propsList = propsStr.split(';').map { ADPropertyObject(it) } - propTable[propName.capitalize()] = propsList + propTable[propName.toUpperCase()] = propsList } // set reserved values for the animation: filename, extension @@ -50,38 +61,46 @@ class ADProperties { extension = get("EXTENSION")!![0].variable val bodyparts = HashSet() - val skeletons = HashSet() - val animations = ArrayList() + val skeletons = HashMap() + val animations = HashMap() // populate skeletons and animations forEach { s, list -> - // linear search. If variable == "SKELETON", the 's' is likely an animation + // Map-ify. If it has variable == "SKELETON", the 's' is likely an animation // and thus, uses whatever the "input" used by the SKELETON is a skeleton + val propsHashMap = HashMap() list.forEach { - if (it.variable == "SKELETON") { - skeletons.add(it.input as String) - animations.add(s) - } + propsHashMap[it.variable.toUpperCase()] = it.input + } + + // if it is indeed anim, populate animations list + if (propsHashMap.containsKey("SKELETON")) { + val skeletonName = propsHashMap["SKELETON"] as String + val skeletonDef = get(skeletonName) ?: throw Error("Skeleton definition for $skeletonName not found") + + skeletons.put(skeletonName, Skeleton(skeletonName, skeletonDef.toJoints())) + animations.put(s, Animation( + s, + propsHashMap["DELAY"] as Float, + (propsHashMap["ROW"] as Float).toInt(), + Skeleton(skeletonName, skeletonDef.toJoints()) + )) } } // populate the bodyparts using skeletons - skeletons.forEach { skeletonName -> - val prop = get(skeletonName) - - if (prop == null) throw Error("The skeleton definition for $skeletonName does not exist") - - prop.forEach { bodypart -> - bodyparts.add(bodypart.variable) + skeletons.forEach { (_, prop: Skeleton) -> + prop.joints.forEach { + bodyparts.add(it.name) } } this.bodyparts = bodyparts.toList().sorted() - this.skeletons = skeletons.toList().sorted() - this.animations = animations.sorted() + this.skeletons = skeletons + this.animations = animations this.bodypartFiles = this.bodyparts.map { getFullFilename(it) } } - operator fun get(identifier: String) = propTable[identifier.capitalize()] + operator fun get(identifier: String) = propTable[identifier.toUpperCase()] val keys get() = propTable.keys fun containsKey(key: String) = propTable.containsKey(key) @@ -89,6 +108,16 @@ class ADProperties { fun getFullFilename(partName: String) = "${this.baseFilename}${partName.toLowerCase()}${this.extension}" + + fun getAnimByFrameName(frameName: String): Animation { + val animName = frameName.substring(0 until frameName.lastIndexOf('_')) + return animations[animName]!! + } + + private fun List.toJoints() = List(this.size) { + Joint(this[it].variable, this[it].input!! as ADPropertyObject.Vector2i) + } + } /** diff --git a/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt b/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt new file mode 100644 index 000000000..ecd4a8832 --- /dev/null +++ b/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt @@ -0,0 +1,15 @@ +package net.torvald.spriteassembler + +/** + * Assembles the single frame of the animation, outputs GDX Pixmap. + * + * Created by minjaesong on 2019-01-06. + */ +object AssembleFrameGdxPixmap { + + operator fun invoke(properties: ADProperties, frameName: String) { + val theAnim = properties.getAnimByFrameName(frameName) + val skeleton = theAnim.skeleton + } + +} \ No newline at end of file diff --git a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt index 508bb733a..01f9c468e 100644 --- a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt +++ b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt @@ -134,7 +134,7 @@ class SpriteAssemblerApp : JFrame() { // populate animations view adProperties!!.animations.forEach { - (panelAnimationsList.model as DefaultListModel).addElement(it) + (panelAnimationsList.model as DefaultListModel).addElement("${it.value}") } // populate bodyparts view adProperties!!.bodyparts.forEach { partName -> @@ -146,7 +146,7 @@ class SpriteAssemblerApp : JFrame() { } // populate skeletons view adProperties!!.skeletons.forEach { - (panelSkeletonsList.model as DefaultListModel).addElement(it) + (panelSkeletonsList.model as DefaultListModel).addElement("${it.value}") } } catch (fehler: Throwable) {