mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 12:21:52 +09:00
first successful sprite assembly
ALL kwd still not implemented
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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>) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user