71 lines
1.9 KiB
Odin
71 lines
1.9 KiB
Odin
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)
|
|
}
|