From 7457bd6b27d14e9ce29661dc7970c141afdbac66 Mon Sep 17 00:00:00 2001 From: szymon Date: Wed, 19 Aug 2026 20:43:32 +0200 Subject: [PATCH] feat: make main_menu scalalble --- src/bin/macroquad_client.rs | 55 +++++++++-------------- src/ui/macroquad/main_menu.rs | 75 +++++++++++++++----------------- src/ui/macroquad/menu_builder.rs | 46 ++++++++++++++++++++ src/ui/macroquad/mod.rs | 1 + 4 files changed, 101 insertions(+), 76 deletions(-) diff --git a/src/bin/macroquad_client.rs b/src/bin/macroquad_client.rs index 4f85e9f..c16894f 100644 --- a/src/bin/macroquad_client.rs +++ b/src/bin/macroquad_client.rs @@ -1,11 +1,13 @@ -use checkers::ui::{macroquad::main_menu::draw_main_menu, state::GuiState}; +use checkers::ui::{ + macroquad::main_menu::{draw_main_menu, get_main_menu_style}, + state::GuiState, +}; use macroquad::{ - color::{BLACK, BLUE, RED, WHITE}, + color::{BLUE, RED, WHITE}, math::vec2, miniquad::{self, conf::LinuxBackend::WaylandWithX11Fallback}, - prelude::ImageFormat, - texture::{DrawTextureParams, Image, Texture2D, draw_texture, draw_texture_ex, load_texture}, - ui::{Skin, root_ui}, + texture::{DrawTextureParams, draw_texture_ex, load_texture}, + ui::root_ui, window::{Conf, clear_background, next_frame, screen_height, screen_width}, }; @@ -26,42 +28,25 @@ pub async fn main() { env_logger::init(); let mut state = Default::default(); - let background = load_texture("assets/background.png").await.unwrap(); - let style = root_ui() - .style_builder() - .text_color(WHITE) - .font_size(64) - .build(); - - let button_style = root_ui() - .style_builder() - .text_color(BLACK) - .font_size(32) - .build(); - - let skin = Skin { - label_style: style, - button_style: button_style, - ..root_ui().default_skin() - }; - - root_ui().push_skin(&skin); + let main_menu_style = get_main_menu_style().await; + root_ui().push_skin(&main_menu_style); loop { + draw_texture_ex( + &background, + 0.0, + 0.0, + WHITE, + DrawTextureParams { + dest_size: Some(vec2(screen_width(), screen_height())), + ..DrawTextureParams::default() + }, + ); + match state { GuiState::MainMenu => { - draw_texture_ex( - &background, - 0.0, - 0.0, - WHITE, - DrawTextureParams { - dest_size: Some(vec2(screen_width(), screen_height())), - ..DrawTextureParams::default() - }, - ); draw_main_menu(&mut state).await; } diff --git a/src/ui/macroquad/main_menu.rs b/src/ui/macroquad/main_menu.rs index 3153eda..ad88bc5 100644 --- a/src/ui/macroquad/main_menu.rs +++ b/src/ui/macroquad/main_menu.rs @@ -1,54 +1,48 @@ use macroquad::{ - color::WHITE, - math::{Rect, Vec2, vec2}, - prelude::ImageFormat, - texture::Image, - ui::{Layout, Skin, Ui, hash, root_ui, widgets::Button}, + color::{BLACK, GRAY, WHITE}, + math::vec2, + shapes::draw_rectangle, + ui::{Skin, hash, root_ui, widgets::Group}, window::{next_frame, screen_height, screen_width}, }; -use crate::ui::state::GuiState; +use crate::ui::{macroquad::menu_builder::MenuBuilder, state::GuiState}; -pub struct MenuBuilder { - center_x: f32, - current_y: f32, - button_size: Vec2, - spacing: f32, -} +pub async fn get_main_menu_style() -> Skin { + let label_style = root_ui() + .style_builder() + .text_color(WHITE) + .font_size(64) + .build(); -impl MenuBuilder { - pub fn new(window_width: f32, start_y: f32) -> Self { - let button_size = vec2(200.0, 50.0); - Self { - center_x: (window_width - button_size.x) / 2.0, - current_y: start_y, - button_size, - spacing: 15.0, - } - } + let button_style = root_ui() + .style_builder() + .text_color(BLACK) + .font_size(32) + .build(); - pub fn button(&mut self, ui: &mut Ui, label: &str) -> bool { - let clicked = Button::new(label) - .position(vec2(self.center_x, self.current_y)) - .size(self.button_size) - .ui(ui); - - self.current_y += self.button_size.y + self.spacing; - - clicked + Skin { + label_style, + button_style, + ..root_ui().default_skin() } } pub async fn draw_main_menu(state: &mut GuiState) { - let window_size = vec2(1200.0, 620.0); - let mut menu_builder = MenuBuilder::new(screen_width(), 10.0); + let menu_size = vec2(screen_width() * 0.5, screen_height() * 0.5); + let menu_pos = vec2( + screen_width() / 2.0 - menu_size.x / 2.0, + screen_height() / 2.0 - menu_size.y / 2.0, + ); - root_ui().window( - hash!(), - vec2(screen_width() / 2.0, screen_height() / 2.0), - window_size, - |ui| { - ui.label(None, "Main Menu"); + let mut menu_builder = MenuBuilder::new(menu_size.x, menu_size.y * 0.1); + + draw_rectangle(menu_pos.x, menu_pos.y, menu_size.x, menu_size.y, GRAY); + + Group::new(hash!(), menu_size) + .position(menu_pos) + .ui(&mut root_ui(), |ui| { + menu_builder.label(ui, "Main menu"); if menu_builder.button(ui, "Play") { *state = GuiState::Game; @@ -61,8 +55,7 @@ pub async fn draw_main_menu(state: &mut GuiState) { if menu_builder.button(ui, "Quit") { *state = GuiState::Exit; } - }, - ); + }); next_frame().await; } diff --git a/src/ui/macroquad/menu_builder.rs b/src/ui/macroquad/menu_builder.rs index e69de29..5f7ac05 100644 --- a/src/ui/macroquad/menu_builder.rs +++ b/src/ui/macroquad/menu_builder.rs @@ -0,0 +1,46 @@ +use macroquad::{ + math::{Vec2, vec2}, + ui::{ + Ui, root_ui, + widgets::{Button, Label}, + }, +}; + +pub struct MenuBuilder { + center_x: f32, + current_y: f32, + button_size: Vec2, + spacing: f32, +} + +impl MenuBuilder { + pub fn new(window_width: f32, start_y: f32) -> Self { + let button_size = vec2(200.0, 50.0); + Self { + center_x: (window_width - button_size.x) / 2.0, + current_y: start_y, + button_size, + spacing: 15.0, + } + } + + pub fn label(&mut self, ui: &mut Ui, label: &str) { + Label::new(label) + .position(vec2(self.center_x, self.current_y)) + .size(self.button_size) + .ui(ui); + + self.current_y += self.button_size.y + self.spacing; + } + + pub fn button(&mut self, ui: &mut Ui, label: &str) -> bool { + let clicked = Button::new(label) + .position(vec2(self.center_x, self.current_y)) + .size(self.button_size) + .ui(ui); + + self.current_y += self.button_size.y + self.spacing; + + clicked + } +} diff --git a/src/ui/macroquad/mod.rs b/src/ui/macroquad/mod.rs index 515f306..85282d5 100644 --- a/src/ui/macroquad/mod.rs +++ b/src/ui/macroquad/mod.rs @@ -1 +1,2 @@ pub mod main_menu; +mod menu_builder;