use crate::StateTransition; use crate::context::Context; use crate::model::register::Register; use crate::model::{ClientMessage, GameResponse}; use crate::screen::Screen; use macroquad::hash; use macroquad::{prelude::*, ui::root_ui}; #[derive(Default)] pub struct LoginScreen { new_username: String, new_room_code: String, sent_join: bool, retry_count: usize, error_msg: bool, } impl Screen for LoginScreen { fn handle_frame(&mut self, ctx: &mut Context) -> Option { clear_background(WHITE); let group_size = Vec2::new(screen_width() * 0.25, screen_height() * 0.05); let window_size = Vec2::new(screen_width() * 0.25, screen_height() * 0.25); let mut pressed_join = false; root_ui().window( hash!("Window"), Vec2::new( screen_width() * 0.5 - window_size.x * 0.5, screen_height() * 0.5 - window_size.x * 0.5, ), Vec2::new(screen_width() * 0.25, screen_height() * 0.25), |ui| { ui.group(hash!("User Group"), group_size, |ui| { ui.input_text(hash!("Username In"), "Username", &mut self.new_username); }); ui.group(hash!("Room Group"), group_size, |ui| { ui.input_text(hash!("Room Code In"), "Room Code", &mut self.new_room_code); }); ui.group(hash!("Join Group"), group_size, |ui| { if ui.button(Vec2::new(group_size.x * 0.45, 0.0), "Join") { info!( "User pressed joined with name={} room_code={}", self.new_username, self.new_room_code ); pressed_join = true; } }); if self.error_msg { ui.group(hash!("Error Group"), group_size, |ui| { ui.label(Vec2::new(0.0, 0.0), "Failed to join game, try again..."); }); } }, ); if pressed_join { ctx.send_msg(&ClientMessage::Register(Register { game_code: self.new_room_code.clone(), username: self.new_username.clone(), })); self.sent_join = true; } if self.sent_join { let msg = ctx.recv_msg(); if let Some(GameResponse::JoinResponse { username, token }) = msg { return Some(StateTransition::JoinAsPlayer { username, token }); } self.retry_count += 1; if self.retry_count > get_fps() as usize * 5 { warn!("Join failed, try again..."); self.retry_count = 0; self.sent_join = false; self.error_msg = true; } } None } }