package topdown import rl "vendor:raylib" import "core:fmt" SpriteAnimation :: struct { speed: f32, width: u16, height: u16, total_width: u16, row: u16, loop: bool, total_frames: u8, } SpriteAnimationPlayer :: struct { curr_anim: ^SpriteAnimation, time_elapsed: f32, curr_frame: u8, skip_frame: bool } anim_player_start :: proc(player: ^SpriteAnimationPlayer, anim: ^SpriteAnimation) { player.curr_anim = anim player.time_elapsed = 0 player.curr_frame = 0 player.skip_frame = true } get_sprite_rect :: proc(player: ^SpriteAnimationPlayer) -> Rect { return Rect{ f32(u16(player.curr_frame) * player.curr_anim.width), f32(player.curr_anim.row), f32(player.curr_anim.width), f32(player.curr_anim.height) } } anim_player_tick :: proc(player: ^SpriteAnimationPlayer) { // fmt.println(player.curr_anim) finished := !player.curr_anim.loop && player.curr_frame == player.curr_anim.total_frames if finished || player.skip_frame { player.skip_frame = false return } player.time_elapsed += rl.GetFrameTime() // TODO: We want to subtract to advance a frame in case we dropped frames if player.time_elapsed >= player.curr_anim.speed { player.time_elapsed = 0 player.curr_frame += 1 if player.curr_frame >= player.curr_anim.total_frames { if player.curr_anim.loop { player.curr_frame = 0 } } } } draw_sprite :: proc(texture: Tex, player: ^SpriteAnimationPlayer, pos: Vec2, scale: f32, flip: bool) { src := get_sprite_rect(player) if flip { src.width *= -1 } w := f32(player.curr_anim.width) * scale h := f32(player.curr_anim.height) * scale dst := Rect{pos.x, pos.y, w, h} // fmt.println(src) // fmt.println(dst) rl.DrawTexturePro(texture, src, dst, {0,0}, 0, rl.WHITE) }