From 23fb33fde6e564b0f0791a1598a27da5f0892ecd Mon Sep 17 00:00:00 2001 From: Yuvraj Dewan Date: Wed, 15 Apr 2026 21:32:34 -0400 Subject: [PATCH 1/5] add [karl2d](https://github.com/karl-zylinski/karl2d) support --- anima/anima_karl2d/karl2d.odin | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 anima/anima_karl2d/karl2d.odin diff --git a/anima/anima_karl2d/karl2d.odin b/anima/anima_karl2d/karl2d.odin new file mode 100644 index 0000000..0150dd1 --- /dev/null +++ b/anima/anima_karl2d/karl2d.odin @@ -0,0 +1,41 @@ +package anima_raylib + +import ".." +import k2 "../../../karl2d" +import "../anima_fsm" + +draw :: proc( + self: ^anima.Animation, + texture: k2.Texture, + x: f32, + y: f32, + rotation: f32 = 0.0, + color: k2.Color = k2.WHITE, +) { + frame := anima.current_frame(self) + + flip_x: f32 = self.flip_v ? -1.0 : 1.0 + flip_y: f32 = self.flip_h ? -1.0 : 1.0 + + k2.draw_texture_ex( + texture, + {f32(frame.x), f32(frame.y), flip_x * f32(frame.width), flip_y * f32(frame.height)}, + {x, y, f32(frame.width), f32(frame.height)}, + {0, 0}, + rotation, + color, + ) +} + +fsm_draw :: proc( + self: ^anima_fsm.FSM($Ident), + texture: k2.Texture, + x: f32, + y: f32, + rotation: f32 = 0.0, + color: k2.Color = rl.WHITE, +) { + animation := anima_fsm.current_animation(self) + draw(animation, texture, x, y, rotation, color) +} + From ff457a7888d3a726bef61f2e11b819b8d0054771 Mon Sep 17 00:00:00 2001 From: Yuvraj Dewan Date: Wed, 15 Apr 2026 22:14:31 -0400 Subject: [PATCH 2/5] fix incorrect library reference --- anima/anima_karl2d/karl2d.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anima/anima_karl2d/karl2d.odin b/anima/anima_karl2d/karl2d.odin index 0150dd1..051b46e 100644 --- a/anima/anima_karl2d/karl2d.odin +++ b/anima/anima_karl2d/karl2d.odin @@ -33,7 +33,7 @@ fsm_draw :: proc( x: f32, y: f32, rotation: f32 = 0.0, - color: k2.Color = rl.WHITE, + color: k2.Color = k2.WHITE, ) { animation := anima_fsm.current_animation(self) draw(animation, texture, x, y, rotation, color) From 960e49d0752e2b8e36932a3eee8962269418d6d4 Mon Sep 17 00:00:00 2001 From: Yuvraj Dewan Date: Wed, 15 Apr 2026 22:14:54 -0400 Subject: [PATCH 3/5] add karl2d example --- .../assets/cat_fighter.png | Bin 0 -> 26121 bytes examples/cat_fighter_fsm_karl2d/main.odin | 110 ++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 examples/cat_fighter_fsm_karl2d/assets/cat_fighter.png create mode 100644 examples/cat_fighter_fsm_karl2d/main.odin diff --git a/examples/cat_fighter_fsm_karl2d/assets/cat_fighter.png b/examples/cat_fighter_fsm_karl2d/assets/cat_fighter.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c4ea20aa48d51ccc48a175724ff698ae198715 GIT binary patch literal 26121 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 0 { + fmt.eprintf("=== %v allocations not freed: ===\n", len(track.allocation_map)) + for _, entry in track.allocation_map { + fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) + } + } + if len(track.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees: ===\n", len(track.bad_free_array)) + for entry in track.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) + } + } + mem.tracking_allocator_destroy(&track) + } + } + + k2.init(800, 600, "anima - example - cat fighter fsm") + defer k2.shutdown() + + texture := k2.load_texture_from_file("assets/cat_fighter.png") + defer k2.destroy_texture(texture) + + camera := k2.Camera{0, 0, 0, 2.0} + + g := anima.new_grid(50, 50, uint(texture.width), uint(texture.height)) + + cat := anima_fsm.create(CatAnim) + defer anima_fsm.destroy(cat) + + anima_fsm.add( + cat, + CatAnim.PunchRight, + anima.new_animation(anima.grid_frames(&g, "6-9", 3), anim_speed), + ) + anima_fsm.add( + cat, + CatAnim.PunchLeft, + anima.new_animation(anima.grid_frames(&g, "6-9", 3), anim_speed, flip_v = true), + ) + anima_fsm.add( + cat, + CatAnim.KickLeft, + anima.new_animation(anima.grid_frames(&g, "0-9", 4, "8-1", 4), anim_speed), + ) + anima_fsm.add( + cat, + CatAnim.KickRight, + anima.new_animation(anima.grid_frames(&g, "0-9", 4, "8-1", 4), anim_speed, flip_v = true), + ) + + anima_fsm.play(cat, CatAnim.PunchRight) + + for k2.update() { + dt := k2.get_frame_time() + + if k2.key_went_down(.Q) { + anima_fsm.play(cat, CatAnim.PunchLeft) + } + + if k2.key_went_down(.W) { + anima_fsm.play(cat, CatAnim.PunchRight) + } + + if k2.key_went_down(.A) { + anima_fsm.play(cat, CatAnim.KickRight) + } + + if k2.key_went_down(.S) { + anima_fsm.play(cat, CatAnim.KickLeft) + } + + anima_fsm.update(cat, dt) + + k2.clear(k2.BLACK) + + k2.set_camera(camera) + + anima_karl2d.fsm_draw(cat, texture, 100, 100) + + k2.draw_text("Q/W to punch left/right, A/S to kick left/right", {10, 10}, 10, k2.GREEN) + + k2.present() + } +} + From e6dc2ccdd1ab8ba2c29ddb307b0c8f67c131d172 Mon Sep 17 00:00:00 2001 From: Yuvraj Dewan Date: Thu, 16 Apr 2026 21:07:06 -0400 Subject: [PATCH 4/5] fixed package name --- anima/anima_karl2d/karl2d.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anima/anima_karl2d/karl2d.odin b/anima/anima_karl2d/karl2d.odin index 051b46e..63322ba 100644 --- a/anima/anima_karl2d/karl2d.odin +++ b/anima/anima_karl2d/karl2d.odin @@ -1,4 +1,4 @@ -package anima_raylib +package anima_karl2d import ".." import k2 "../../../karl2d" From 8e0dfb85bc6c8727742debf33eda88c021b7d473 Mon Sep 17 00:00:00 2001 From: Yuvraj Dewan Date: Thu, 16 Apr 2026 21:07:55 -0400 Subject: [PATCH 5/5] moved draw_text outside of the game camera to workaround a karl2d bug --- examples/cat_fighter_fsm_karl2d/main.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/cat_fighter_fsm_karl2d/main.odin b/examples/cat_fighter_fsm_karl2d/main.odin index 719ce52..081c5da 100644 --- a/examples/cat_fighter_fsm_karl2d/main.odin +++ b/examples/cat_fighter_fsm_karl2d/main.odin @@ -102,7 +102,9 @@ main :: proc() { anima_karl2d.fsm_draw(cat, texture, 100, 100) - k2.draw_text("Q/W to punch left/right, A/S to kick left/right", {10, 10}, 10, k2.GREEN) + k2.set_camera(nil) + + k2.draw_text("Q/W to punch left/right, A/S to kick left/right", {10, 10}, 20, k2.GREEN) k2.present() }