Skip to content

Commit b482bc9

Browse files
committed
feat: animation system
1 parent 0b9b958 commit b482bc9

6 files changed

Lines changed: 114 additions & 12 deletions

File tree

core/src/main/kotlin/dev/mariorez/GameBoot.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class GameBoot : KtxGame<KtxScreen>() {
4848

4949
assets.apply {
5050
setLoader<TiledMap> { TmxMapLoader(fileResolver) }
51-
loadSync<Texture>("npc-1.png").setFilter(Linear, Linear)
51+
loadSync<Texture>("hero.png").setFilter(Linear, Linear)
5252
loadSync<TiledMap>("map.tmx")
5353
}
5454

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.mariorez.component
2+
3+
import com.badlogic.gdx.graphics.g2d.TextureRegion
4+
import com.github.quillraven.fleks.Component
5+
import com.github.quillraven.fleks.ComponentType
6+
import ktx.collections.GdxArray
7+
8+
data class Animate(
9+
var animations: MutableMap<String, GdxArray<TextureRegion>> = mutableMapOf(),
10+
var current: String = "",
11+
var loop: Boolean = false,
12+
var frameDuration: Float = 0.1f,
13+
var stateTime: Float = 0f
14+
) : Component<Animate> {
15+
override fun type() = Animate
16+
17+
companion object : ComponentType<Animate>()
18+
}

core/src/main/kotlin/dev/mariorez/screen/FirstScreen.kt

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package dev.mariorez.screen
22

33
import com.badlogic.gdx.Input.Keys
44
import com.badlogic.gdx.graphics.Texture
5-
import com.badlogic.gdx.graphics.g2d.Sprite
5+
import com.badlogic.gdx.graphics.g2d.TextureRegion
66
import com.badlogic.gdx.maps.tiled.TiledMap
77
import com.badlogic.gdx.maps.tiled.renderers.OrthoCachedTiledMapRenderer
88
import com.github.quillraven.fleks.Entity
@@ -14,16 +14,19 @@ import dev.mariorez.Action.RIGHT
1414
import dev.mariorez.Action.UP
1515
import dev.mariorez.BaseScreen
1616
import dev.mariorez.Sizes
17+
import dev.mariorez.component.Animate
1718
import dev.mariorez.component.Player
1819
import dev.mariorez.component.Render
1920
import dev.mariorez.component.Transform
21+
import dev.mariorez.system.AnimationSystem
2022
import dev.mariorez.system.BoundToWorldSystem
2123
import dev.mariorez.system.CameraSystem
2224
import dev.mariorez.system.InputSystem
2325
import dev.mariorez.system.MovementSystem
2426
import dev.mariorez.system.RenderSystem
2527
import ktx.assets.async.AssetStorage
2628
import ktx.assets.disposeSafely
29+
import ktx.collections.gdxArrayOf
2730
import ktx.tiled.forEachMapObject
2831
import ktx.tiled.totalHeight
2932
import ktx.tiled.totalWidth
@@ -55,6 +58,7 @@ class FirstScreen(
5558
add(MovementSystem())
5659
add(BoundToWorldSystem())
5760
add(CameraSystem())
61+
add(AnimationSystem())
5862
add(RenderSystem())
5963
}
6064
}
@@ -91,14 +95,40 @@ class FirstScreen(
9195
tiledMap.forEachMapObject("objects") { obj ->
9296
when (obj.type) {
9397
"player" -> {
94-
val hero = assets.get<Texture>("npc-1.png")
98+
val cols = 4
99+
val rows = 4
100+
val hero = assets.get<Texture>("hero.png")
101+
val regions = TextureRegion(hero).split(hero.width / cols, hero.height / rows)
102+
val animate = Animate().apply {
103+
animations.also {
104+
(0 until cols).forEach { col ->
105+
it.getOrPut("south") { gdxArrayOf() }.apply {
106+
add(TextureRegion(regions[0][col]))
107+
}
108+
it.getOrPut("west") { gdxArrayOf() }.apply {
109+
add(TextureRegion(regions[1][col]))
110+
}
111+
it.getOrPut("east") { gdxArrayOf() }.apply {
112+
add(TextureRegion(regions[2][col]))
113+
}
114+
it.getOrPut("north") { gdxArrayOf() }.apply {
115+
add(TextureRegion(regions[3][col]))
116+
}
117+
}
118+
}
119+
}
120+
95121
player = world.entity {
96122
it += Player()
97-
it += Render(Sprite(hero, hero.width, hero.height))
123+
it += Render()
124+
it += animate.apply {
125+
current = "south"
126+
frameDuration = 0.2f
127+
}
98128
it += Transform().apply {
99129
position.set(obj.x, obj.y)
100-
acceleration = 400f
101-
deceleration = 250f
130+
acceleration = 600f
131+
deceleration = 600f
102132
maxSpeed = 150f
103133
}
104134
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package dev.mariorez.system
2+
3+
import com.badlogic.gdx.graphics.g2d.Animation
4+
import com.badlogic.gdx.graphics.g2d.TextureRegion
5+
import com.github.quillraven.fleks.Entity
6+
import com.github.quillraven.fleks.IteratingSystem
7+
import com.github.quillraven.fleks.World.Companion.family
8+
import dev.mariorez.component.Animate
9+
import dev.mariorez.component.Render
10+
11+
class AnimationSystem : IteratingSystem(
12+
family { all(Animate, Render) }
13+
) {
14+
15+
private val animationCache = mutableMapOf<String, Animation<TextureRegion>>()
16+
override fun onTickEntity(entity: Entity) {
17+
entity[Animate].stateTime += deltaTime
18+
19+
val animation = animationCache.getOrPut(entity[Animate].current) {
20+
Animation(
21+
entity[Animate].frameDuration,
22+
entity[Animate].animations[entity[Animate].current]
23+
)
24+
}
25+
26+
val textureRegion = animation.getKeyFrame(
27+
entity[Animate].stateTime,
28+
entity[Animate].loop
29+
)
30+
31+
entity[Render].sprite.apply {
32+
setRegion(textureRegion)
33+
setSize(textureRegion.regionWidth.toFloat(), textureRegion.regionHeight.toFloat())
34+
}
35+
}
36+
}

core/src/main/kotlin/dev/mariorez/system/InputSystem.kt

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.badlogic.gdx.math.Vector2
44
import com.github.quillraven.fleks.Entity
55
import com.github.quillraven.fleks.IteratingSystem
66
import com.github.quillraven.fleks.World.Companion.family
7+
import dev.mariorez.component.Animate
78
import dev.mariorez.component.Player
89
import dev.mariorez.component.Transform
910

@@ -14,15 +15,32 @@ class InputSystem : IteratingSystem(
1415
private val speedUp = Vector2()
1516

1617
override fun onTickEntity(entity: Entity) {
17-
if (entity[Player].isStopped) return
18+
if (entity[Player].isStopped) {
19+
entity[Animate].loop = false
20+
return
21+
}
1822

1923
entity[Transform].apply {
2024
speedUp.set(acceleration, 0f).also { speed ->
21-
if (entity[Player].right) accelerator.add(speed.setAngleDeg(0f))
22-
if (entity[Player].up) accelerator.add(speed.setAngleDeg(90f))
23-
if (entity[Player].left) accelerator.add(speed.setAngleDeg(180f))
24-
if (entity[Player].down) accelerator.add(speed.setAngleDeg(270f))
25+
if (entity[Player].right) {
26+
accelerator.add(speed.setAngleDeg(0f))
27+
entity[Animate].current = "east"
28+
}
29+
if (entity[Player].up) {
30+
accelerator.add(speed.setAngleDeg(90f))
31+
entity[Animate].current = "north"
32+
}
33+
if (entity[Player].left) {
34+
accelerator.add(speed.setAngleDeg(180f))
35+
entity[Animate].current = "west"
36+
}
37+
if (entity[Player].down) {
38+
accelerator.add(speed.setAngleDeg(270f))
39+
entity[Animate].current = "south"
40+
}
2541
}
2642
}
43+
44+
entity[Animate].loop = true
2745
}
2846
}

core/src/main/kotlin/dev/mariorez/system/RenderSystem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ class RenderSystem(
4141
draw(batch)
4242
}
4343
}
44-
}
44+
}

0 commit comments

Comments
 (0)