use astrelis::prelude::*;
struct DemoApp {
frames: u64,
}
impl astrelis_winit::app::App for DemoApp {
fn on_start(&mut self, _ctx: &mut astrelis_winit::app::AppCtx) {
println!("\n=== ApplicationBuilder Demo ===");
println!("✓ GraphicsContext created automatically");
println!("✓ WindowManager initialized automatically");
println!("✓ Main window created automatically");
println!("✓ All plugins registered automatically");
println!("✓ Engine built and ready");
println!("\nThis entire setup required just 4 builder calls!");
println!("Traditional approach would have required 60+ lines of boilerplate.\n");
println!("Press ESC or close window to exit\n");
}
fn update(&mut self, _ctx: &mut astrelis_winit::app::AppCtx, time: &astrelis_winit::FrameTime) {
self.frames = time.frame_count;
if self.frames.is_multiple_of(120) {
println!(
"Running smoothly... Frame {}, {:.1} FPS",
self.frames,
1.0 / time.delta.as_secs_f32()
);
}
}
fn render(
&mut self,
_ctx: &mut astrelis_winit::app::AppCtx,
_window_id: astrelis_winit::WindowId,
_events: &mut astrelis_winit::event::EventBatch,
) {
}
fn on_exit(&mut self, _ctx: &mut astrelis_winit::app::AppCtx) {
println!("\n=== Shutdown ===");
println!("Ran for {} frames", self.frames);
println!("✓ Automatic cleanup via Engine::shutdown()");
println!("✓ Plugin cleanup in reverse dependency order");
println!("✓ All resources freed");
}
}
fn main() {
astrelis_core::logging::init();
println!("\nApplicationBuilder Demo");
println!("=======================\n");
println!("This example demonstrates the boilerplate reduction");
println!("achieved by using ApplicationBuilder instead of manual setup.\n");
ApplicationBuilder::new()
.with_title("ApplicationBuilder Demo - 85% Less Boilerplate!")
.with_size(800, 600)
.add_plugins(DefaultPlugins)
.run(|_ctx, _engine| DemoApp { frames: 0 });
}