Animating stars (slowly) when not moving as well.
This commit is contained in:
parent
57f33495d9
commit
0d9e0c4828
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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),
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user