raylib-zig/examples/shapes/easings_ball_anim.zig
2025-08-09 18:51:00 +02:00

87 lines
3.3 KiB
Zig

const rl = @import("raylib");
const reasings = @import("reasings.zig");
//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
pub fn main() anyerror!void {
// Initialization
//--------------------------------------------------------------------------------------
const screenWidth = 800;
const screenHeight = 450;
rl.initWindow(screenWidth, screenHeight, "raylib [shapes] example - easings ball anim");
defer rl.closeWindow(); // Defer closing window and OpenGL context
// Ball variable value to be animated with easings
var ballPositionX: i32 = -100;
var ballRadius: f32 = 20;
var ballAlpha: f32 = 0;
var state: i32 = 0;
var framesCounter: i32 = 0;
rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
// Main game loop
while (!rl.windowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
switch (state) {
0 => { // Move ball position X with easing
framesCounter += 1;
ballPositionX = @intFromFloat(reasings.elasticOut(@floatFromInt(framesCounter), -100, @as(f32, @floatFromInt(screenWidth)) / 2 + 100, 120));
if (framesCounter >= 120) {
framesCounter = 0;
state = 1;
}
},
1 => { // Increase ball radius with easing
framesCounter += 1;
ballRadius = reasings.elasticIn(@floatFromInt(framesCounter), 20, 500, 200);
if (framesCounter >= 200) {
framesCounter = 0;
state = 2;
}
},
2 => { // Change ball alpha with easing (background color blending)
framesCounter += 1;
ballAlpha = reasings.cubicOut(@floatFromInt(framesCounter), 0.0, 1.0, 200);
if (framesCounter >= 200) {
framesCounter = 0;
state = 3;
}
},
3 => { // Reset state to play again
if (rl.isKeyPressed(.enter)) {
ballPositionX = -100;
ballRadius = 20;
ballAlpha = 0.0;
state = 0;
}
},
else => unreachable,
}
if (rl.isKeyPressed(.r)) framesCounter = 0;
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
rl.beginDrawing();
defer rl.endDrawing();
rl.clearBackground(.ray_white);
if (state >= 2) rl.drawRectangle(0, 0, screenWidth, screenHeight, .green);
rl.drawCircle(ballPositionX, 200, ballRadius, .fade(.red, 1.0 - ballAlpha));
if (state == 3) rl.drawText("PRESS [ENTER] TO PLAY AGAIN!", 240, 200, 20, .black);
//----------------------------------------------------------------------------------
}
}