screw AWT, we'll use GDX for sprite preview

This commit is contained in:
minjaesong
2019-01-07 00:35:20 +09:00
parent d366959f9a
commit 77d91ab8a5
3 changed files with 103 additions and 20 deletions

View File

@@ -261,6 +261,8 @@ 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)
fun invertY() = Vector2i(this.x, -this.y)
} }
enum class ADPropertyType { enum class ADPropertyType {

View File

@@ -13,7 +13,9 @@ import java.io.File
*/ */
object AssembleFrameAWT { object AssembleFrameAWT {
operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()) { // FIXME fuck this I'll use GDX
operator fun invoke(properties: ADProperties, frameName: String, assembleConfig: AssembleConfig = AssembleConfig()): BufferedImage {
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)
@@ -38,9 +40,25 @@ object AssembleFrameAWT {
transforms.forEach { println(it) } transforms.forEach { println(it) }
println("==========================") println("==========================")
println("Transformed skeleton:") println("Transformed skeleton:")
AssembleFrameBase.makeTransformList(skeleton, transforms).forEach { (name, transform) -> val transformList = AssembleFrameBase.makeTransformList(skeleton, transforms)
transformList.forEach { (name, transform) ->
println("$name transformedOut: $transform") println("$name transformedOut: $transform")
} }
// actually draw
val g = canvas.graphics
bodyparts.forEachIndexed { index, image ->
if (image != null) {
val drawPos = transformList[index].second.invertY() + assembleConfig.origin
g.drawImage(image, drawPos.x, drawPos.y, null)
}
}
canvas.flush()
return canvas
} }
} }
@@ -48,10 +66,9 @@ object AssembleFrameAWT {
/** /**
* @param fw Frame Width * @param fw Frame Width
* @param fh Frame Height * @param fh Frame Height
* @param ox Origin-X, leftmost point being zero * @param origin Int vector of origin point, (0,0) being TOP-LEFT
* @param oy Origin-Y, bottommost point being zero
*/ */
data class AssembleConfig(val fw: Int = 48, val fh: Int = 56, val ox: Int = 29, val oy: Int = 0) data class AssembleConfig(val fw: Int = 48, val fh: Int = 56, val origin: ADPropertyObject.Vector2i = ADPropertyObject.Vector2i(29, 58))
object AssembleFrameBase { object AssembleFrameBase {
/** /**
@@ -69,7 +86,7 @@ object AssembleFrameBase {
// process transform queue // process transform queue
transforms.forEach { transform -> transforms.forEach { transform ->
// TODO when the transform.joint.name == ADProperties.ALL_JOINT_SELECT_KEY // TODO when the transform.joint.name == ADProperties.ALL_JOINT_SELECT_KEY]]
val jointToMoveIndex = transformOutput.linearSearch { it.first == transform.joint.name }!! val jointToMoveIndex = transformOutput.linearSearch { it.first == transform.joint.name }!!
transformOutput[jointToMoveIndex] = transformOutput[jointToMoveIndex].first to transform.getTransformVector() transformOutput[jointToMoveIndex] = transformOutput[jointToMoveIndex].first to transform.getTransformVector()

View File

@@ -1,7 +1,16 @@
package net.torvald.spriteassembler package net.torvald.spriteassembler
import com.badlogic.gdx.Game
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
import com.badlogic.gdx.graphics.Color
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 java.awt.BorderLayout import java.awt.BorderLayout
import java.awt.Dimension import java.awt.Font
import java.awt.Graphics import java.awt.Graphics
import java.awt.event.MouseAdapter import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent import java.awt.event.MouseEvent
@@ -18,9 +27,8 @@ import javax.swing.tree.DefaultTreeModel
/** /**
* Created by minjaesong on 2019-01-05. * Created by minjaesong on 2019-01-05.
*/ */
class SpriteAssemblerApp : JFrame() { class SpriteAssemblerApp(val gdxWindow: SpriteAssemblerPreview) : JFrame() {
private val panelPreview = ImagePanel()
private val panelProperties = JTree() private val panelProperties = JTree()
private val panelAnimationsList = JList<String>() private val panelAnimationsList = JList<String>()
private val panelBodypartsList = JList<String>() private val panelBodypartsList = JList<String>()
@@ -88,7 +96,7 @@ class SpriteAssemblerApp : JFrame() {
} }
panelPreview.preferredSize = Dimension(512,512) panelCode.font = Font(Font.MONOSPACED, Font.PLAIN, 11)
panelAnimationsList.model = DefaultListModel() panelAnimationsList.model = DefaultListModel()
panelBodypartsList.model = DefaultListModel() panelBodypartsList.model = DefaultListModel()
@@ -104,10 +112,14 @@ class SpriteAssemblerApp : JFrame() {
panelPartsList.add("Transforms", JScrollPane(panelTransformsList)) panelPartsList.add("Transforms", JScrollPane(panelTransformsList))
val panelDataView = JSplitPane(JSplitPane.VERTICAL_SPLIT, JScrollPane(panelProperties), panelPartsList) val panelDataView = JSplitPane(JSplitPane.VERTICAL_SPLIT, JScrollPane(panelProperties), panelPartsList)
panelDataView.resizeWeight = 0.333
val panelTop = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, JScrollPane(panelPreview), panelDataView) // to disable text wrap
//val panelCodeNoWrap = JPanel(BorderLayout())
//panelCodeNoWrap.add(panelCode)
val panelMain = JSplitPane(JSplitPane.VERTICAL_SPLIT, panelTop, JScrollPane(panelCode)) val panelMain = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, JScrollPane(panelCode), panelDataView)
panelMain.resizeWeight = 0.666
val menu = JMenuBar() val menu = JMenuBar()
menu.add(JMenu("File")) menu.add(JMenu("File"))
@@ -163,7 +175,18 @@ class SpriteAssemblerApp : JFrame() {
} }
}) })
menu.add(JMenu("Run")) menu.add(JMenu("Run")).addMouseListener(object : MouseAdapter() {
override fun mousePressed(e: MouseEvent?) {
try {
val image = AssembleFrameAWT(adProperties, "ANIM_RUN_1")
}
catch (fehler: Throwable) {
displayError("ERROR_PARSE_FAIL", fehler)
fehler.printStackTrace()
}
}
})
this.layout = BorderLayout() this.layout = BorderLayout()
this.add(menu, BorderLayout.NORTH) this.add(menu, BorderLayout.NORTH)
@@ -195,13 +218,6 @@ class SpriteAssemblerApp : JFrame() {
"Cancel" "Cancel"
) )
} }
companion object {
@JvmStatic
fun main(args: Array<String>) {
SpriteAssemblerApp()
}
}
} }
internal class ImagePanel : JPanel() { internal class ImagePanel : JPanel() {
@@ -218,9 +234,57 @@ internal class ImagePanel : JPanel() {
} }
fun setImage(image: BufferedImage) {
this.image = image
}
override fun paintComponent(g: Graphics) { override fun paintComponent(g: Graphics) {
super.paintComponent(g) super.paintComponent(g)
g.drawImage(image, 0, 0, this) // see javadoc for more info on the parameters 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
set(value) {
renderTexture.dispose()
field?.dispose()
field = value
renderTexture = Texture(field)
}
override fun create() {
Gdx.graphics.setTitle("Sprite Assembler Preview")
batch = SpriteBatch()
renderTexture = Texture(1, 1, Pixmap.Format.RGBA8888)
}
val bgCol = Color(.62f,.79f,1f,1f)
override fun render() {
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)
}
}
fun main(args: Array<String>) {
val appConfig = LwjglApplicationConfiguration()
appConfig.resizable = true
appConfig.width = 512
appConfig.height = 512
appConfig.foregroundFPS = 5
appConfig.backgroundFPS = 5
val gdxWindow = SpriteAssemblerPreview()
LwjglApplication(gdxWindow, appConfig)
SpriteAssemblerApp(gdxWindow)
}