use crate::{game::ZLayer, State}; use comfy::{ draw_rect, draw_rect_outline, egui, screen_height, screen_to_world, screen_width, vec2, Color, EngineContext, Vec2, BLACK, BLUE, PURPLE, RED, WHITE }; use egui::widget_text::RichText; // seperate fill state into smaller section for better readability const BATTERY_SECTION_COUNT: u8 = 5; const BATTERY_SECTION_WIDTH: f32 = 1.0; const BATTERY_SECTION_HEIGHT: f32 = 0.5; fn draw_battery(mut start_position: Vec2, charge: f32, max_charge: f32, color: Color) { // section size in world codinates let section_size = vec2(BATTERY_SECTION_WIDTH, BATTERY_SECTION_HEIGHT); start_position.x -= 0.5 * section_size.x + 0.5 * section_size.y; start_position.y += 0.5 * section_size.y + 0.5 * section_size.y; // draw fill level { let percent = charge / max_charge; let mut size = section_size; size.y = section_size.y * BATTERY_SECTION_COUNT as f32; let mut position = start_position; position.y += 0.5 * -section_size.y + 0.5 * size.y; draw_rect(position, size, BLACK, ZLayer::UI.into()); size.y *= percent; let mut position = start_position; position.y += 0.5 * -section_size.y + 0.5 * size.y; draw_rect(position, size, BLUE, ZLayer::UI + 1); } // draw sections for i in 0 .. BATTERY_SECTION_COUNT { let mut position = start_position; position.y += i as f32 * section_size.y; draw_rect_outline(position, section_size, 0.1, color, ZLayer::UI + 2); } } pub fn draw_ghost_battery(state: &State) { let start_position = screen_to_world(Vec2::new(screen_width(), screen_height())); draw_battery( start_position, state.ghost.charge, state.ghost.max_charge, RED ); } pub fn draw_house_battery(state: &State) { let Some(house) = state.house() else { return; }; let mut start_position = screen_to_world(Vec2::new(screen_width(), screen_height())); start_position.x -= 2.0 * BATTERY_SECTION_WIDTH; draw_battery(start_position, house.charge, house.max_charge, PURPLE) } pub fn draw_highscore(state: &State) { egui::Area::new("score") .anchor(egui::Align2::RIGHT_TOP, egui::vec2(0.0, 0.0)) .show(egui(), |ui| { ui.label( RichText::new(format!("{:.0} ", state.score)) .color(WHITE) .monospace() .size(16.0) .strong() ); }); } pub fn draw(state: &State, _ctx: &EngineContext<'_>) { draw_ghost_battery(state); draw_house_battery(state); draw_highscore(state); }