Basic animator and assetmanager using it.
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
package game
|
||||||
|
|
||||||
|
import rl "vendor:raylib"
|
||||||
|
|
||||||
|
AnimationClip :: struct {
|
||||||
|
texture: rl.Texture2D,
|
||||||
|
frame_count: int,
|
||||||
|
frame_width: i32,
|
||||||
|
frame_height: i32,
|
||||||
|
frame_time: f32,
|
||||||
|
looping: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimationState :: struct {
|
||||||
|
clip: ^AnimationClip,
|
||||||
|
current_frame: int,
|
||||||
|
timer: f32,
|
||||||
|
finished: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
animation_play :: proc(state: ^AnimationState, clip: ^AnimationClip) {
|
||||||
|
// already playing, do not reset
|
||||||
|
if state.clip == clip do return
|
||||||
|
state.clip = clip
|
||||||
|
state.current_frame = 0
|
||||||
|
state.timer = 0
|
||||||
|
state.finished = false
|
||||||
|
}
|
||||||
|
|
||||||
|
animation_update :: proc(state: ^AnimationState, dt: f32) {
|
||||||
|
clip := state.clip
|
||||||
|
if clip == nil || state.finished do return
|
||||||
|
|
||||||
|
state.timer += dt
|
||||||
|
if state.timer >= clip.frame_time {
|
||||||
|
state.timer -= clip.frame_time
|
||||||
|
state.current_frame += 1
|
||||||
|
if state.current_frame >= clip.frame_count {
|
||||||
|
if clip.looping {
|
||||||
|
state.current_frame = 0
|
||||||
|
} else {
|
||||||
|
state.current_frame = clip.frame_count - 1
|
||||||
|
state.finished = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
animation_frame_rect :: proc(state: ^AnimationState) -> rl.Rectangle {
|
||||||
|
clip := state.clip
|
||||||
|
|
||||||
|
return rl.Rectangle {
|
||||||
|
x = f32(state.current_frame) * f32(clip.frame_width),
|
||||||
|
y = 0,
|
||||||
|
width = f32(clip.frame_width),
|
||||||
|
height = f32(clip.frame_height),
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
-6
@@ -6,22 +6,34 @@
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
package game
|
package game
|
||||||
|
|
||||||
// import rl "vendor:raylib"
|
import rl "vendor:raylib"
|
||||||
|
|
||||||
|
Player_Assets :: struct {
|
||||||
|
clips: [Player_State]AnimationClip,
|
||||||
|
}
|
||||||
|
|
||||||
Asset_Manager :: struct {
|
Asset_Manager :: struct {
|
||||||
// Empty for now.
|
player: Player_Assets,
|
||||||
//player: rl.Texture2D,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
asset_manager_init :: proc() -> Asset_Manager {
|
asset_manager_init :: proc() -> Asset_Manager {
|
||||||
assets := Asset_Manager{}
|
assets := Asset_Manager{}
|
||||||
|
|
||||||
// assets.player = rl.LoadTexture("assets/sprites/player.png")
|
idle_tex := rl.LoadTexture("assets/textures/player/player_idle.png")
|
||||||
|
walk_tex := rl.LoadTexture("assets/textures/player/player_walk.png")
|
||||||
|
|
||||||
|
assets.player.clips[.IDLE] = AnimationClip {
|
||||||
|
texture = idle_tex, frame_count = 6, frame_width = 32, frame_height = 32, frame_time = 0.14, looping = true,
|
||||||
|
}
|
||||||
|
assets.player.clips[.WALK] = AnimationClip {
|
||||||
|
texture = walk_tex, frame_count = 8, frame_width = 32, frame_height = 32, frame_time = 0.14, looping = true,
|
||||||
|
}
|
||||||
|
|
||||||
return assets
|
return assets
|
||||||
}
|
}
|
||||||
|
|
||||||
asset_manager_destroy :: proc(assets: ^Asset_Manager) {
|
asset_manager_destroy :: proc(assets: ^Asset_Manager) {
|
||||||
// unload textures here later.
|
for clip in assets.player.clips {
|
||||||
//rl.UnloadTexture(assets.player)
|
rl.UnloadTexture(clip.texture)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user