top-down-shooter/sprites.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)
}