play-of-the-game/frontend/src/login_screen.rs

88 lines
2.9 KiB
Rust

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<StateTransition> {
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
}
}