Animating stars (slowly) when not moving as well.

This commit is contained in:
Sander Schobers 2023-06-04 17:49:04 +02:00
parent 57f33495d9
commit 0d9e0c4828
3 changed files with 17 additions and 6 deletions

View File

@ -28,6 +28,15 @@ pub const Animation = struct {
return self.sprite.frames[self.current]; return self.sprite.frames[self.current];
} }
pub fn currentFrameOffset(self: *Animation, offset: usize) allegro.Bitmap {
return self.sprite.frames[self.currentOffset(offset)];
}
pub fn currentOffset(self: Animation, offset: usize) usize {
const n = self.end - self.begin;
return self.begin + (self.current + offset - self.begin) % n;
}
pub fn reset(self: *Animation) void { pub fn reset(self: *Animation) void {
self.current = self.begin; self.current = self.begin;
} }
@ -38,9 +47,6 @@ pub const Animation = struct {
const skip = @floatToInt(usize, @divFloor(delta, self.interval)); const skip = @floatToInt(usize, @divFloor(delta, self.interval));
self.lastUpdate = t - @rem(delta, self.interval); self.lastUpdate = t - @rem(delta, self.interval);
self.current = (self.current + skip); self.current = self.currentOffset(skip);
while (self.current >= self.end) {
self.current = self.begin;
}
} }
}; };

View File

@ -12,12 +12,15 @@ pub const Game = struct {
level: Level, level: Level,
health: i64 = 4, health: i64 = 4,
playerPosition: engine.PointF, playerPosition: engine.PointF,
playerIdleAnimation: Animation, playerIdleAnimation: Animation,
playerWalkingAnimation: Animation, playerWalkingAnimation: Animation,
playerDirection: Direction, playerDirection: Direction,
isPlayerWalking: bool, isPlayerWalking: bool,
starAnimation: Animation,
renderer: *Renderer, renderer: *Renderer,
// current viewport translated to tiles. // current viewport translated to tiles.
boundsInTiles: engine.RectangleF, boundsInTiles: engine.RectangleF,
@ -31,6 +34,7 @@ pub const Game = struct {
.playerWalkingAnimation = Animation.initPartialLoop(renderer.sprites.get("character_lion_48").?, 0.125, 4, 8), .playerWalkingAnimation = Animation.initPartialLoop(renderer.sprites.get("character_lion_48").?, 0.125, 4, 8),
.playerDirection = Direction.Right, .playerDirection = Direction.Right,
.isPlayerWalking = false, .isPlayerWalking = false,
.starAnimation = Animation.init(renderer.sprites.get("item_star_32").?, 0.15),
.renderer = renderer, .renderer = renderer,
.boundsInTiles = Game.calculateBoundsInTiles(playerPosition), .boundsInTiles = Game.calculateBoundsInTiles(playerPosition),
}; };

View File

@ -26,7 +26,7 @@ pub const GameScene = struct {
} }
pub fn tick(self: *GameScene, ctx: *Context, t: f32, dt: f32) void { pub fn tick(self: *GameScene, ctx: *Context, t: f32, dt: f32) void {
const speed: f32 = 5; // tiles/s const speed: f32 = 6; // tiles/s
if (ctx.keys.isKeyPressed(allegro.c.ALLEGRO_KEY_LEFT)) { if (ctx.keys.isKeyPressed(allegro.c.ALLEGRO_KEY_LEFT)) {
self.game.moveCharacter(-speed * dt); self.game.moveCharacter(-speed * dt);
@ -41,6 +41,7 @@ pub const GameScene = struct {
self.game.isPlayerWalking = false; self.game.isPlayerWalking = false;
self.game.playerIdleAnimation.tick(t); self.game.playerIdleAnimation.tick(t);
} }
self.game.starAnimation.tick(t);
} }
pub fn render(self: *GameScene, ctx: *Context) void { pub fn render(self: *GameScene, ctx: *Context) void {
@ -90,7 +91,7 @@ pub const GameScene = struct {
switch (collectable) { switch (collectable) {
game.Level.Collectable.Star => { game.Level.Collectable.Star => {
const distanceToPlayer = engine.Point.init(x, y).float().distance(self.game.playerPosition); const distanceToPlayer = engine.Point.init(x, y).float().distance(self.game.playerPosition);
self.game.drawSpriteFrame("item_star_32", @floatToInt(usize, @mod(distanceToPlayer * 0.54, 1) * 16), x, y); self.game.drawSpriteFrame("item_star_32", self.game.starAnimation.currentOffset(@floatToInt(usize, @mod(distanceToPlayer * 0.54, 1) * 16)), x, y);
}, },
} }
} }