first successful sprite assembly

ALL kwd still not implemented
This commit is contained in:
minjaesong
2019-01-07 04:13:38 +09:00
parent 5b31b4768f
commit 655eccbe19
6 changed files with 66 additions and 61 deletions

View File

@@ -261,6 +261,7 @@ class ADPropertyObject(propertyRaw: String) {
override fun toString() = "($x, $y)" override fun toString() = "($x, $y)"
operator fun plus(other: Vector2i) = Vector2i(this.x + other.x, this.y + other.y) operator fun plus(other: Vector2i) = Vector2i(this.x + other.x, this.y + other.y)
operator fun minus(other: Vector2i) = Vector2i(this.x - other.x, this.y - other.y)
fun invertY() = Vector2i(this.x, -this.y) fun invertY() = Vector2i(this.x, -this.y)
} }

View File

@@ -1,9 +1,8 @@
package net.torvald.spriteassembler package net.torvald.spriteassembler
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Pixmap
import net.torvald.terrarum.linearSearch import net.torvald.terrarum.linearSearch
import java.awt.Image
import java.awt.Toolkit
import java.awt.image.BufferedImage
import java.io.File import java.io.File
/** /**
@@ -11,29 +10,28 @@ import java.io.File
* *
* Created by minjaesong on 2019-01-06. * Created by minjaesong on 2019-01-06.
*/ */
object AssembleFrameAWT { object AssembleFramePixmap {
// FIXME fuck this I'll use GDX // FIXME fuck this I'll use GDX
operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()): BufferedImage { operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()): Pixmap {
val theAnim = properties.getAnimByFrameName(frameName) val theAnim = properties.getAnimByFrameName(frameName)
val skeleton = theAnim.skeleton.joints.reversed() val skeleton = theAnim.skeleton.joints.reversed()
val transforms = properties.getTransform(frameName) val transforms = properties.getTransform(frameName)
val bodyparts = Array<Image?>(skeleton.size) { val bodyparts = Array<Pixmap?>(skeleton.size) {
// if file does not exist, null it // if file does not exist, null it
val file = File("assets/" + properties.toFilename(skeleton[it].name)) val file = File("assets/" + properties.toFilename(skeleton[it].name))
//printdbg(this, "Loading file ${file.absolutePath}, exists: ${file.exists()}") //printdbg(this, "Loading file ${file.absolutePath}, exists: ${file.exists()}")
val toolkit = Toolkit.getDefaultToolkit()
/*return*/if (file.exists()) { /*return*/if (file.exists()) {
toolkit.getImage(file.absolutePath) Pixmap(Gdx.files.internal(file.path))
} }
else { else {
null null
} }
} }
val canvas = BufferedImage(assembleConfig.fw, assembleConfig.fh, BufferedImage.TYPE_4BYTE_ABGR) val canvas = Pixmap(assembleConfig.fw, assembleConfig.fh, Pixmap.Format.RGBA8888)
println("Frame name: $frameName") println("Frame name: $frameName")
@@ -47,17 +45,19 @@ object AssembleFrameAWT {
// actually draw // actually draw
val g = canvas.graphics canvas.blending = Pixmap.Blending.SourceOver
bodyparts.forEachIndexed { index, image -> bodyparts.forEachIndexed { index, image ->
if (image != null) { if (image != null) {
val drawPos = transformList[index].second.invertY() + assembleConfig.origin val imgCentre = AssembleFrameBase.getCentreOf(image)
g.drawImage(image, drawPos.x, drawPos.y, null) val drawPos = transformList[index].second.invertY() + assembleConfig.origin - imgCentre
canvas.drawPixmap(image, drawPos.x, drawPos.y)
image.dispose()
} }
} }
canvas.flush()
return canvas return canvas
} }
@@ -68,7 +68,7 @@ object AssembleFrameAWT {
* @param fh Frame Height * @param fh Frame Height
* @param origin Int vector of origin point, (0,0) being TOP-LEFT * @param origin Int vector of origin point, (0,0) being TOP-LEFT
*/ */
data class AssembleConfig(val fw: Int = 48, val fh: Int = 56, val origin: ADPropertyObject.Vector2i = ADPropertyObject.Vector2i(29, 58)) data class AssembleConfig(val fw: Int = 48, val fh: Int = 56, val origin: ADPropertyObject.Vector2i = ADPropertyObject.Vector2i(29, fh - 1))
object AssembleFrameBase { object AssembleFrameBase {
/** /**
@@ -94,4 +94,6 @@ object AssembleFrameBase {
return transformOutput.toList() return transformOutput.toList()
} }
fun getCentreOf(pixmap: Pixmap) = ADPropertyObject.Vector2i(pixmap.width / 2, pixmap.height / 2)
} }

View File

@@ -9,17 +9,13 @@ import com.badlogic.gdx.graphics.GL20
import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Pixmap
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.inUse
import java.awt.BorderLayout import java.awt.BorderLayout
import java.awt.Font import java.awt.Font
import java.awt.Graphics
import java.awt.event.MouseAdapter import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent import java.awt.event.MouseEvent
import java.awt.image.BufferedImage
import java.io.File
import java.io.IOException
import java.io.StringReader import java.io.StringReader
import java.util.* import java.util.*
import javax.imageio.ImageIO
import javax.swing.* import javax.swing.*
import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.DefaultTreeModel import javax.swing.tree.DefaultTreeModel
@@ -84,7 +80,8 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
"STAT_LOAD_SUCCESSFUL=File loaded successfully.\n" + "STAT_LOAD_SUCCESSFUL=File loaded successfully.\n" +
"ERROR_INTERNAL=Something went wrong.\n" + "ERROR_INTERNAL=Something went wrong.\n" +
"ERROR_PARSE_FAIL=Parsing failed\n" + "ERROR_PARSE_FAIL=Parsing failed\n" +
"SPRITE_DEF_LOAD_SUCCESSFUL=Sprite definition loaded." "SPRITE_DEF_LOAD_SUCCESSFUL=Sprite definition loaded.\n" +
"SPRITE_ASSEMBLE_SUCCESSFUL=Sprite assembled."
init { init {
// setup application properties // // setup application properties //
@@ -145,7 +142,9 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
// clean the data views // clean the data views
panelAnimationsList.model = DefaultListModel() panelAnimationsList.model = DefaultListModel()
panelBodypartsList.model = DefaultListModel() panelBodypartsList.model = DefaultListModel()
panelImageFilesList.model = DefaultListModel()
panelSkeletonsList.model = DefaultListModel() panelSkeletonsList.model = DefaultListModel()
panelTransformsList.model = DefaultListModel()
// populate animations view // populate animations view
adProperties.animations.forEach { adProperties.animations.forEach {
@@ -178,8 +177,8 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
menu.add(JMenu("Run")).addMouseListener(object : MouseAdapter() { menu.add(JMenu("Run")).addMouseListener(object : MouseAdapter() {
override fun mousePressed(e: MouseEvent?) { override fun mousePressed(e: MouseEvent?) {
try { try {
val image = AssembleFrameAWT(adProperties, "ANIM_RUN_1") gdxWindow.requestAssemblyTest(adProperties, "ANIM_IDLE_2")
statBar.text = lang.getProperty("SPRITE_ASSEMBLE_SUCCESSFUL")
} }
catch (fehler: Throwable) { catch (fehler: Throwable) {
displayError("ERROR_PARSE_FAIL", fehler) displayError("ERROR_PARSE_FAIL", fehler)
@@ -220,36 +219,11 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
} }
} }
internal class ImagePanel : JPanel() {
private var image: BufferedImage? = null
init {
try {
image = ImageIO.read(File("image name and path"))
}
catch (ex: IOException) {
// handle exception...
}
}
fun setImage(image: BufferedImage) {
this.image = image
}
override fun paintComponent(g: Graphics) {
super.paintComponent(g)
g.drawImage(image, 0, 0, this) // see javadoc for more info on the parameters
}
}
class SpriteAssemblerPreview: Game() { class SpriteAssemblerPreview: Game() {
private lateinit var batch: SpriteBatch private lateinit var batch: SpriteBatch
private lateinit var renderTexture: Texture private lateinit var renderTexture: Texture
var image: Pixmap? = null private var image: Pixmap? = null
set(value) { set(value) {
renderTexture.dispose() renderTexture.dispose()
field?.dispose() field?.dispose()
@@ -264,15 +238,43 @@ class SpriteAssemblerPreview: Game() {
renderTexture = Texture(1, 1, Pixmap.Format.RGBA8888) renderTexture = Texture(1, 1, Pixmap.Format.RGBA8888)
} }
val bgCol = Color(.62f,.79f,1f,1f) private val bgCol = Color(.62f,.79f,1f,1f)
private var doAssemble = false
private lateinit var assembleProp: ADProperties
private lateinit var assembleFrameName: String
override fun render() { override fun render() {
if (doAssemble) {
// assembly requires GL context
doAssemble = false
assembleImageTest(assembleProp, assembleFrameName)
}
Gdx.gl.glClearColor(.62f,.79f,1f,1f) Gdx.gl.glClearColor(.62f,.79f,1f,1f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D) Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND) Gdx.gl.glEnable(GL20.GL_BLEND)
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA) Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
batch.inUse {
batch.color = Color.WHITE
batch.draw(renderTexture, 0f, 0f)
}
} }
private fun assembleImageTest(prop: ADProperties, frameName: String) {
image = AssembleFramePixmap(prop, frameName)
}
fun requestAssemblyTest(prop: ADProperties, frameName: String) {
doAssemble = true
assembleProp = prop
assembleFrameName = frameName
}
} }
fun main(args: Array<String>) { fun main(args: Array<String>) {

View File

@@ -15,18 +15,18 @@ SKELETON_STAND=HEADGEAR 0,32;HAIR_FORE 0,32;\
ARM_REST_RIGHT -7,23;HAND_REST_RIGHT -6,11;HELD_ITEM -6,11;\ ARM_REST_RIGHT -7,23;HAND_REST_RIGHT -6,11;HELD_ITEM -6,11;\
HAIR 0,32;HEAD 0,32;\ HAIR 0,32;HEAD 0,32;\
UPPER_TORSO 0,23;LOWER_TORSO 0,15;\ UPPER_TORSO 0,23;LOWER_TORSO 0,15;\
FOOT_RIGHT -2,2;LEG_RIGHT -2,7;\ FOOT_RIGHT -2,2;LEG_REST_RIGHT -2,7;\
FOOT_LEFT 2,2;LEG_LEFT 2,7;\ FOOT_LEFT 2,2;LEG_REST_LEFT 2,7;\
ARM_REST_LEFT 5,24;HAND_REST_LEFT 6,12 ARM_REST_LEFT 5,24;HAND_REST_LEFT 6,12
# skeleton_stand is used for testing purpose # skeleton_stand is used for testing purpose
ANIM_RUN=DELAY 0.15;ROW 2;SKELETON SKELETON_STAND ANIM_RUN=DELAY 0.15;ROW 2;SKELETON SKELETON_STAND
ANIM_RUN_1=LEG_RIGHT 1,1;FOOT_RIGHT 1,1;LEG_LEFT -1,0;FOOT_LEFT -1,0 ANIM_RUN_1=LEG_REST_RIGHT 1,1;FOOT_RIGHT 1,1;LEG_REST_LEFT -1,0;FOOT_LEFT -1,0
ANIM_RUN_2=ALL 0,1;LEG_RIGHT 0,-1;FOOT_RIGHT 0,-1;LEG_LEFT 0,1;FOOT_LEFT 0,1 ANIM_RUN_2=ALL 0,1;LEG_REST_RIGHT 0,-1;FOOT_RIGHT 0,-1;LEG_REST_LEFT 0,1;FOOT_LEFT 0,1
ANIM_RUN_3=LEG_RIGHT -1,0;FOOT_RIGHT -1,0;LEG_LEFT 1,1;FOOT_LEFT 1,1 ANIM_RUN_3=LEG_REST_RIGHT -1,0;FOOT_RIGHT -1,0;LEG_REST_LEFT 1,1;FOOT_LEFT 1,1
ANIM_RUN_4=ALL 0,1;LEG_RIGHT 0,1;LEG_LEFT 0,-1 ANIM_RUN_4=ALL 0,1;LEG_REST_RIGHT 0,1;LEG_REST_LEFT 0,-1
ANIM_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND ANIM_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND
ANIM_IDLE_1= ANIM_IDLE_1=
! ANIM_IDLE_1 will not make any transformation ! ANIM_IDLE_1 will not make any transformation
ANIM_IDLE_2=UPPER_TORSO 0,-1;HEAD 0,-1;ARM_REST_LEFT 0,-1;HAND_REST_LEFT 0,-1;ARM_REST_RIGHT 0,-1;HAND_REST_RIGHT 0,-1 ANIM_IDLE_2=UPPER_TORSO 0,-1;HEAD 0,-1;HAIR 0,-1;HELD_ITEM 0,-1;ARM_REST_LEFT 0,-1;HAND_REST_LEFT 0,-1;ARM_REST_RIGHT 0,-1;HAND_REST_RIGHT 0,-1;HAIR_FORE 0,-1;HEADGEAR 0,-1

View File

@@ -1,7 +1,7 @@
package net.torvald.terrarum.tests package net.torvald.terrarum.tests
import net.torvald.spriteassembler.ADProperties import net.torvald.spriteassembler.ADProperties
import net.torvald.spriteassembler.AssembleFrameAWT import net.torvald.spriteassembler.AssembleFramePixmap
import java.io.StringReader import java.io.StringReader
/** /**
@@ -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))
AssembleFrameAWT.invoke(properties, "ANIM_RUN_1") AssembleFramePixmap.invoke(properties, "ANIM_RUN_1")
} }
} }