88 lines
2.9 KiB
Rust
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
|
|
}
|
|
}
|