on-the-fly sprite assembly WIP

This commit is contained in:
minjaesong
2019-01-19 04:34:50 +09:00
parent 4c89c1d4c5
commit 971f7d4a40
18 changed files with 341 additions and 62 deletions

View File

@@ -86,7 +86,7 @@ object Terrarum : Screen {
*/
val TARGET_INTERNAL_FPS: Double = 60.0
internal val UPDATE_CATCHUP_MAX_TRIES = 2 // this feature does more harm than good...
internal val UPDATE_CATCHUP_MAX_TRIES = 1 // this feature does more harm than good...
@@ -98,9 +98,9 @@ object Terrarum : Screen {
var ingame: IngameInstance? = null
private val javaHeapCircularArray = CircularArray<Int>(128)
private val nativeHeapCircularArray = CircularArray<Int>(128)
private val updateRateCircularArray = CircularArray<Double>(128)
private val javaHeapCircularArray = CircularArray<Int>(64)
private val nativeHeapCircularArray = CircularArray<Int>(64)
private val updateRateCircularArray = CircularArray<Double>(16)
val memJavaHeap: Int
get() {

View File

@@ -3,6 +3,7 @@ package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Color
import com.jme3.math.FastMath
import net.torvald.spriteanimation.HasAssembledSprite
import net.torvald.terrarum.*
import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameactors.faction.Faction
@@ -21,6 +22,11 @@ import java.util.*
* Humanoid actor class to provide same controlling function (such as work, jump)
* Also applies unreal air friction for movement control
*
* For some actors that "HasAssembledSprite", sprite rows must be in this specific order:
* 1. Idle
* 2. Walk
* ...
*
* Created by minjaesong on 2016-10-24.
*/
open class ActorHumanoid(
@@ -610,8 +616,11 @@ open class ActorHumanoid(
// set anim frame delay
// 4f of the divider is a magic number, empirically decided
sprite?.delays?.set(SPRITE_ROW_WALK, scale.sqrt().toFloat() / (4f * (controllerMoveDelta?.x ?: 0.0001).abs().toFloat())) // FIXME empirical value
spriteGlow?.delays?.set(SPRITE_ROW_WALK, scale.sqrt().toFloat() / (4f * (controllerMoveDelta?.x ?: 0.0001).abs().toFloat())) // FIXME empirical value
if (this is HasAssembledSprite) {
sprite?.delays?.set(SPRITE_ROW_WALK, scale.sqrt().toFloat() / (4f * (controllerMoveDelta?.x ?: 0.0001).abs().toFloat())) // FIXME empirical value
spriteGlow?.delays?.set(SPRITE_ROW_WALK, scale.sqrt().toFloat() / (4f * (controllerMoveDelta?.x ?: 0.0001).abs().toFloat())) // FIXME empirical value
}
// flipping the sprite
if (walkHeading == LEFT) {

View File

@@ -1,7 +1,8 @@
package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.files.FileHandle
import net.torvald.spriteanimation.HasAssembledSprite
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension
import net.torvald.terrarum.modulebasegame.gameworld.time_t
@@ -11,7 +12,7 @@ import net.torvald.terrarum.modulebasegame.gameworld.time_t
* Created by minjaesong on 2015-12-31.
*/
class IngamePlayer(born: time_t) : ActorHumanoid(born) {
class IngamePlayer(override var animDesc: FileHandle, born: time_t) : ActorHumanoid(born), HasAssembledSprite {
/**
* Creates new Player instance with empty elements (sprites, actorvalue, etc.).

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.gameactors.Actor
@@ -13,7 +14,7 @@ object PlayerBuilder {
operator fun invoke(): Actor {
val world = (Terrarum.ingame!! as Ingame).gameworld
val p: Actor = IngamePlayer(world.time.TIME_T)
val p: Actor = IngamePlayer(Gdx.files.internal("lol"), world.time.TIME_T)
InjectCreatureRaw(p.actorValue, "basegame", "CreatureHuman.json")
// attach sprite

View File

@@ -1,5 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.blockproperties.Block
import net.torvald.terrarum.gameactors.AVKey
@@ -14,7 +15,7 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
object PlayerBuilderSigrid {
operator fun invoke(): IngamePlayer {
val p = IngamePlayer(-9223372036854775807L) // XD
val p = IngamePlayer(Gdx.files.internal("lol"), - 9223372036854775807L) // XD
p.referenceID = 0x51621D // the only constant of this procedural universe

View File

@@ -1,16 +1,16 @@
package net.torvald.terrarum.modulebasegame.gameactors
import net.torvald.spriteanimation.SpriteAnimation
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/**
* Created by minjaesong on 2017-02-10.
*/
object PlayerBuilderTestSubject1 {
operator fun invoke(): IngamePlayer {
val p: IngamePlayer = IngamePlayer(-589141658L) // random value thrown
val p: IngamePlayer = IngamePlayer(ModMgr.getGdxFile("basegame", "sprites/test_sprite.properties"), -589141658L) // random value thrown
InjectCreatureRaw(p.actorValue, "basegame", "CreatureHuman.json")
@@ -20,10 +20,12 @@ object PlayerBuilderTestSubject1 {
p.actorValue[AVKey.NAME] = "Test Subject 1"
p.makeNewSprite(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/npc_template_anim_prototype.tga"), 48, 52))
/*p.makeNewSprite(TextureRegionPack(ModMgr.getGdxFile("basegame", "sprites/npc_template_anim_prototype.tga"), 48, 52))
p.sprite!!.delays = floatArrayOf(2f, 1f/12f) // second value does nothing -- overridden by ActorHumanoid.updateSprite(float)
p.sprite!!.setRowsAndFrames(2, 4)
p.sprite!!.setRowsAndFrames(2, 4)*/
p.sprite = SpriteAnimation(p)
p.reassembleSprite(p.sprite!!)
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0)
p.setPosition(3.0 * FeaturesDrawer.TILE_SIZE, 3.0 * FeaturesDrawer.TILE_SIZE)

View File

@@ -4,10 +4,10 @@ import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.*
import net.torvald.terrarum.modulebasegame.gameactors.ActorInventory
import net.torvald.terrarum.gameactors.ActorWBMovable
import net.torvald.terrarum.itemproperties.GameItem
import net.torvald.terrarum.itemproperties.ItemCodex
import net.torvald.terrarum.modulebasegame.gameactors.ActorInventory
import net.torvald.terrarum.ui.UIItem
/**
@@ -39,8 +39,7 @@ class UIItemInventoryEquippedView(
val spriteViewBackCol: Color; get() = Color(0x404040_88.toInt())//Color(0xd4d4d4_ff.toInt())
private val itemGrid = Array<UIItemInventoryCellBase>(
2 * 5, {
private val itemGrid = Array<UIItemInventoryCellBase>(2 * 5) {
UIItemInventoryElemSimple(
parentUI = parentUI,
posX = this.posX + (UIItemInventoryElemSimple.height + listGap) * ((it + 4) % 2),
@@ -55,7 +54,6 @@ class UIItemInventoryEquippedView(
drawBackOnNull = true
)
}
)
override fun update(delta: Float) {

View File

@@ -0,0 +1,145 @@
import com.badlogic.gdx.*
import com.badlogic.gdx.Input.Keys.*
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.gdxClearAndSetBlend
import net.torvald.terrarum.inUse
/**
* Not meant to implement IME, just to be used with Options > Config
* where it shows a "summary" diagram of a keyboard and icon for functions on its keycap
*
* If unknown key was chosen (e.g. caret used on french AZERTY), config will simply won't display it
* on the "summary".
*/
object MakeKeylayoutFile {
fun invoke() {
val qwerty = arrayOf( // QWERTY
intArrayOf(TAB,Q,W,E,R,T,Y,U,I,O,P,LEFT_BRACKET,RIGHT_BRACKET,BACKSLASH),
intArrayOf(UNKNOWN,A,S,D,F,G,H,J,K,L,SEMICOLON,APOSTROPHE),
intArrayOf(SHIFT_LEFT,Z,X,C,V,B,N,M,COMMA,PERIOD,SLASH,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val qwerty_hhk = arrayOf( // QWERTY HHK
intArrayOf(TAB,Q,W,E,R,T,Y,U,I,O,P,LEFT_BRACKET,RIGHT_BRACKET,BACKSLASH),
intArrayOf(CONTROL_LEFT,A,S,D,F,G,H,J,K,L,SEMICOLON,APOSTROPHE),
intArrayOf(SHIFT_LEFT,Z,X,C,V,B,N,M,COMMA,PERIOD,SLASH,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val qwertz = arrayOf( // QWERTZ English
intArrayOf(TAB,Q,W,E,R,T,Z,U,I,O,P,LEFT_BRACKET,RIGHT_BRACKET,BACKSLASH),
intArrayOf(UNKNOWN,A,S,D,F,G,H,J,K,L,SEMICOLON,APOSTROPHE),
intArrayOf(SHIFT_LEFT,Y,X,C,V,B,N,M,COMMA,PERIOD,SLASH,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val azerty = arrayOf( // AZERTY Windows
intArrayOf(TAB,A,Z,E,R,T,Y,U,I,O,P,72,74,BACKSLASH),
intArrayOf(UNKNOWN,Q,S,D,F,G,H,J,K,L,M,68),
intArrayOf(SHIFT_LEFT,W,X,C,V,B,N,COMMA,PERIOD,SLASH,UNKNOWN,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val colemak = arrayOf( // Colemak
intArrayOf(TAB,Q,W,F,P,G,J,L,U,Y,SEMICOLON,LEFT_BRACKET,RIGHT_BRACKET,BACKSLASH),
intArrayOf(BACKSPACE,A,R,S,T,D,H,N,E,I,O,APOSTROPHE),
intArrayOf(SHIFT_LEFT,Z,X,C,V,B,K,M,COMMA,PERIOD,SLASH,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val dvorak = arrayOf( // Dvorak
intArrayOf(TAB,APOSTROPHE,COMMA,PERIOD,P,Y,F,G,C,R,L,SLASH,EQUALS,BACKSLASH),
intArrayOf(UNKNOWN,A,O,E,U,I,D,H,T,N,S,MINUS),
intArrayOf(SHIFT_LEFT,SEMICOLON,Q,J,K,X,B,M,W,V,Z,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val dvorak_lh = arrayOf( // Dvorak Left handed
intArrayOf(TAB,SEMICOLON,Q,B,Y,U,R,S,O,PERIOD,UNKNOWN,UNKNOWN,EQUALS,BACKSLASH),
intArrayOf(UNKNOWN,MINUS,K,C,D,T,H,E,A,Z,UNKNOWN,UNKNOWN),
intArrayOf(SHIFT_LEFT,APOSTROPHE,X,G,V,W,N,I,COMMA,UNKNOWN,UNKNOWN,SHIFT_RIGHT),
intArrayOf(SPACE)
)
val keys = listOf(
qwerty, qwerty_hhk, qwertz, azerty, colemak, dvorak, dvorak_lh
)
keys.forEach { println(it.toConfigStr()) }
}
private fun Array<IntArray>.toConfigStr() =
this.map { it.joinToString(",") }.joinToString(";")
}
class GetKeycode : Game() {
private lateinit var font: BitmapFont
private lateinit var batch: SpriteBatch
private var keyHit = "(keycode will be displayed here)"
override fun create() {
font = BitmapFont()
batch = SpriteBatch()
Gdx.input.inputProcessor = Con(this)
}
override fun getScreen(): Screen {
return super.getScreen()
}
override fun setScreen(screen: Screen?) {
super.setScreen(screen)
}
override fun render() {
Gdx.graphics.setTitle("Get Keycode — F: ${Gdx.graphics.framesPerSecond}")
gdxClearAndSetBlend(.1f,.1f,.1f,1f)
batch.inUse {
font.draw(batch, "Hit a key", 10f, 20f)
font.draw(batch, keyHit, 10f, 42f)
}
}
override fun pause() {
super.pause()
}
override fun resume() {
super.resume()
}
override fun resize(width: Int, height: Int) {
super.resize(width, height)
}
override fun dispose() {
super.dispose()
}
class Con(val host: GetKeycode): InputAdapter() {
override fun keyDown(keycode: Int): Boolean {
host.keyHit = "Key down: $keycode (${Input.Keys.toString(keycode)})"
return true
}
}
}
fun main() {val appConfig = LwjglApplicationConfiguration()
appConfig.resizable = false
appConfig.width = 256
appConfig.height = 64
appConfig.foregroundFPS = 60
appConfig.backgroundFPS = 60
val gdxWindow = GetKeycode()
LwjglApplication(gdxWindow, appConfig)
MakeKeylayoutFile.invoke()
}