A fully native Odin package to load Aseprite files (.aseprite / .ase) and use them directly with vendor:raylib (Odin builtin binding).
This project is an Odin port of the raylib-aseprite API, without binding to the original C implementation.
- Load Aseprite sprites from file or memory
- Build a texture atlas for frame-by-frame rendering
- Handle Aseprite tags (forwards, backwards, ping-pong)
- Handle Aseprite slices
- Rendering helpers equivalent to the C library (
DrawAseprite*,DrawAsepriteTag*) - Unit tests + runnable examples
Clone this repository, then import the package either with a relative import or an Odin collection.
import ase "../path/to/raylib-aseprite-odin"odin run . -collection:raylib_aseprite=/path/to/raylib-aseprite-odinThen in your code:
import ase "raylib_aseprite"package main
import ase "../.."
import rl "vendor:raylib"
main :: proc() {
rl.InitWindow(800, 450, "Aseprite + raylib + Odin")
defer rl.CloseWindow()
rl.SetTargetFPS(60)
sprite := ase.LoadAseprite("examples/resources/george.aseprite")
defer ase.UnloadAseprite(sprite)
anim := ase.LoadAsepriteTag(sprite, "Walk-Down")
for !rl.WindowShouldClose() {
ase.UpdateAsepriteTag(&anim)
rl.BeginDrawing()
rl.ClearBackground(rl.RAYWHITE)
ase.DrawAsepriteTagEx(anim, rl.Vector2{200, 120}, 0, 4, rl.WHITE)
rl.EndDrawing()
}
}Detailed method-by-method documentation: DOCUMENTATION.md
LoadAsepriteLoadAsepriteFromMemoryIsAsepriteValidUnloadAsepriteTraceAsepriteGetAsepriteTextureGetAsepriteWidthGetAsepriteHeightDrawAseprite,DrawAsepriteFlipped,DrawAsepriteV,DrawAsepriteVFlippedDrawAsepriteEx,DrawAsepriteExFlipped,DrawAsepritePro,DrawAsepriteProFlipped
LoadAsepriteTagLoadAsepriteTagFromIndexGetAsepriteTagCountIsAsepriteTagValidUpdateAsepriteTagSetAsepriteTagFrameGetAsepriteTagFrameDrawAsepriteTag*
LoadAsepriteSliceLoadAsepriteSliceFromIndexGetAsepriteSliceCountIsAsepriteSliceValidGenAsepriteSliceDefault
Two examples are included:
examples/basic/main.odinexamples/numbers/main.odin
Run:
odin run examples/basic
odin run examples/numbersodin test .The main test file is raylib_aseprite_test.odin.
raylib_aseprite.odin: main implementation (parser + rendering + API)raylib_aseprite_test.odin: unit testsexamples/: raylib demosresources/: assets used by tests
- The parser supports the main chunks used by the original library (layers, cels, tags, palette, slices).
- Animation playback uses
rl.GetFrameTime()inUpdateAsepriteTag. - The package requires an initialized raylib window before loading (
InitWindow). - Important: always register
defer rl.CloseWindow()inmain. - Important: register
defer rl.CloseWindow()before anydefer ase.UnloadAseprite(...). Odin executesdeferin reverse order, so this guaranteesUnloadAsepriteruns while the raylib context is still valid.
Correct defer order:
// Wrong: can crash on exit (CloseWindow runs before UnloadAseprite)
sprite := ase.LoadAseprite("assets/player.aseprite")
defer ase.UnloadAseprite(sprite)
defer rl.CloseWindow()
// Correct: UnloadAseprite runs first, then CloseWindow
defer rl.CloseWindow()
defer ase.UnloadAseprite(sprite)- Original API:
raylib-asepriteby Rob Loach - Reference format/parser:
cute_asepriteby Randy Gaul - Odin port: this repository
This project is licensed under the same zlib/libpng license used by the original
raylib-aseprite project.
- Original project:
raylib-asepriteby Rob Loach - This repository is an altered source version (a 100% Odin port)
- Full license text:
LICENSE
Built with curiosity, Python and a lot of AI.