first successful sprite assembly

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

View File

@@ -261,6 +261,7 @@ class ADPropertyObject(propertyRaw: String) {
override fun toString() = "($x, $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)
}

View File

@@ -1,9 +1,8 @@
package net.torvald.spriteassembler
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Pixmap
import net.torvald.terrarum.linearSearch
import java.awt.Image
import java.awt.Toolkit
import java.awt.image.BufferedImage
import java.io.File
/**
@@ -11,29 +10,28 @@ import java.io.File
*
* Created by minjaesong on 2019-01-06.
*/
object AssembleFrameAWT {
object AssembleFramePixmap {
// 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 skeleton = theAnim.skeleton.joints.reversed()
val transforms = properties.getTransform(frameName)
val bodyparts = Array<Image?>(skeleton.size) {
val bodyparts = Array<Pixmap?>(skeleton.size) {
// if file does not exist, null it
val file = File("assets/" + properties.toFilename(skeleton[it].name))
//printdbg(this, "Loading file ${file.absolutePath}, exists: ${file.exists()}")
val toolkit = Toolkit.getDefaultToolkit()
/*return*/if (file.exists()) {
toolkit.getImage(file.absolutePath)
Pixmap(Gdx.files.internal(file.path))
}
else {
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")
@@ -47,17 +45,19 @@ object AssembleFrameAWT {
// actually draw
val g = canvas.graphics
canvas.blending = Pixmap.Blending.SourceOver
bodyparts.forEachIndexed { index, image ->
if (image != null) {
val drawPos = transformList[index].second.invertY() + assembleConfig.origin
g.drawImage(image, drawPos.x, drawPos.y, null)
val imgCentre = AssembleFrameBase.getCentreOf(image)
val drawPos = transformList[index].second.invertY() + assembleConfig.origin - imgCentre
canvas.drawPixmap(image, drawPos.x, drawPos.y)
image.dispose()
}
}
canvas.flush()
return canvas
}
@@ -68,7 +68,7 @@ object AssembleFrameAWT {
* @param fh Frame Height
* @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 {
/**
@@ -94,4 +94,6 @@ object AssembleFrameBase {
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.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.inUse
import java.awt.BorderLayout
import java.awt.Font
import java.awt.Graphics
import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent
import java.awt.image.BufferedImage
import java.io.File
import java.io.IOException
import java.io.StringReader
import java.util.*
import javax.imageio.ImageIO
import javax.swing.*
import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.DefaultTreeModel
@@ -84,7 +80,8 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
"STAT_LOAD_SUCCESSFUL=File loaded successfully.\n" +
"ERROR_INTERNAL=Something went wrong.\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 {
// setup application properties //
@@ -145,7 +142,9 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
// clean the data views
panelAnimationsList.model = DefaultListModel()
panelBodypartsList.model = DefaultListModel()
panelImageFilesList.model = DefaultListModel()
panelSkeletonsList.model = DefaultListModel()
panelTransformsList.model = DefaultListModel()
// populate animations view
adProperties.animations.forEach {
@@ -178,8 +177,8 @@ class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
menu.add(JMenu("Run")).addMouseListener(object : MouseAdapter() {
override fun mousePressed(e: MouseEvent?) {
try {
val image = AssembleFrameAWT(adProperties, "ANIM_RUN_1")
gdxWindow.requestAssemblyTest(adProperties, "ANIM_IDLE_2")
statBar.text = lang.getProperty("SPRITE_ASSEMBLE_SUCCESSFUL")
}
catch (fehler: Throwable) {
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() {
private lateinit var batch: SpriteBatch
private lateinit var renderTexture: Texture
var image: Pixmap? = null
private var image: Pixmap? = null
set(value) {
renderTexture.dispose()
field?.dispose()
@@ -264,15 +238,43 @@ class SpriteAssemblerPreview: Game() {
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() {
if (doAssemble) {
// assembly requires GL context
doAssemble = false
assembleImageTest(assembleProp, assembleFrameName)
}
Gdx.gl.glClearColor(.62f,.79f,1f,1f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D)
Gdx.gl.glEnable(GL20.GL_BLEND)
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>) {

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;\
HAIR 0,32;HEAD 0,32;\
UPPER_TORSO 0,23;LOWER_TORSO 0,15;\
FOOT_RIGHT -2,2;LEG_RIGHT -2,7;\
FOOT_LEFT 2,2;LEG_LEFT 2,7;\
FOOT_RIGHT -2,2;LEG_REST_RIGHT -2,7;\
FOOT_LEFT 2,2;LEG_REST_LEFT 2,7;\
ARM_REST_LEFT 5,24;HAND_REST_LEFT 6,12
# skeleton_stand is used for testing purpose
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_2=ALL 0,1;LEG_RIGHT 0,-1;FOOT_RIGHT 0,-1;LEG_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_4=ALL 0,1;LEG_RIGHT 0,1;LEG_LEFT 0,-1
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_REST_RIGHT 0,-1;FOOT_RIGHT 0,-1;LEG_REST_LEFT 0,1;FOOT_LEFT 0,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_REST_RIGHT 0,1;LEG_REST_LEFT 0,-1
ANIM_IDLE=DELAY 2;ROW 1;SKELETON SKELETON_STAND
ANIM_IDLE_1=
! 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
import net.torvald.spriteassembler.ADProperties
import net.torvald.spriteassembler.AssembleFrameAWT
import net.torvald.spriteassembler.AssembleFramePixmap
import java.io.StringReader
/**
@@ -11,7 +11,7 @@ class SpriteAssemblerTest {
operator fun invoke() {
val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR))
AssembleFrameAWT.invoke(properties, "ANIM_RUN_1")
AssembleFramePixmap.invoke(properties, "ANIM_RUN_1")
}
}