summaryrefslogtreecommitdiff
path: root/2026/games/asrael_io/source/src/anim.rs
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-08-18 00:08:28 -0400
committerLLLL Colonq <llll@colonq>2026-08-18 00:08:28 -0400
commit32a62cfcb925225359a5c90761b795f2f737ebd2 (patch)
tree95c2261964803b19f2d39cb35d8d514ed6e5a6f4 /2026/games/asrael_io/source/src/anim.rs
parentde99c5f7636a952025ea13de02bafd25bcb6bdec (diff)
Re-populate games
Diffstat (limited to '2026/games/asrael_io/source/src/anim.rs')
-rw-r--r--2026/games/asrael_io/source/src/anim.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/2026/games/asrael_io/source/src/anim.rs b/2026/games/asrael_io/source/src/anim.rs
new file mode 100644
index 0000000..427e22e
--- /dev/null
+++ b/2026/games/asrael_io/source/src/anim.rs
@@ -0,0 +1,42 @@
+use crate::color::Palette;
+use crate::sprite::Sprite;
+
+use std::rc::Rc;
+
+use glam::Vec2;
+
+const FRAME_TICKS: u32 = 6;
+
+pub struct Anim {
+ center: Vec2,
+ frames: Rc<Vec<Sprite>>,
+ tick: u32,
+}
+
+impl Anim {
+ pub fn new(frames: Rc<Vec<Sprite>>, center: Vec2) -> Self {
+ Self {
+ center,
+ frames,
+ tick: 0,
+ }
+ }
+
+ pub fn done(&self) -> bool {
+ self.tick >= FRAME_TICKS * self.frames.len() as u32
+ }
+
+ pub fn update(&mut self) {
+ self.tick += 1;
+ }
+
+ pub fn draw(&self, frame: &mut [u32], palette: &Palette) {
+ let i = (self.tick / FRAME_TICKS) as usize;
+ let Some(sprite) = self.frames.get(i) else {
+ return;
+ };
+
+ let pos = self.center - sprite.size.as_vec2() / 2.0;
+ sprite.draw_at(frame, palette, pos.round().as_ivec2());
+ }
+}