aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pixel-client/src/config.rs2
-rw-r--r--pixel-client/src/game.rs5
-rw-r--r--pixel-client/src/main.rs19
-rw-r--r--pixel-client/src/menu/main.rs6
-rw-r--r--pixel-client/src/menu/settings.rs40
5 files changed, 56 insertions, 16 deletions
diff --git a/pixel-client/src/config.rs b/pixel-client/src/config.rs
index 8f051b99..4d50ae10 100644
--- a/pixel-client/src/config.rs
+++ b/pixel-client/src/config.rs
@@ -25,7 +25,7 @@ use std::{
#[derive(Serialize, Deserialize)]
pub struct Config {
- username: String,
+ pub username: String,
}
impl Config {
diff --git a/pixel-client/src/game.rs b/pixel-client/src/game.rs
index 0a0fc22d..318b9a02 100644
--- a/pixel-client/src/game.rs
+++ b/pixel-client/src/game.rs
@@ -16,6 +16,7 @@
*/
use crate::{
+ config::Config,
helper::InterpolateExt,
render::{
misc::MiscTextures,
@@ -82,10 +83,10 @@ pub struct Item {
}
impl Game {
- pub fn new(mut network: Network, layout: &AtlasLayout) -> Self {
+ pub fn new(mut network: Network, config: &Config, layout: &AtlasLayout) -> Self {
network.queue_out.push_back(PacketS::Join {
id: None,
- name: "pixel".to_string(),
+ name: config.username.clone(),
character: 0,
});
diff --git a/pixel-client/src/main.rs b/pixel-client/src/main.rs
index 24421994..a073d0ed 100644
--- a/pixel-client/src/main.rs
+++ b/pixel-client/src/main.rs
@@ -16,7 +16,9 @@
*/
#![feature(map_many_mut, path_add_extension)]
+use anyhow::Result;
use clap::{Parser, Subcommand};
+use config::Config;
use game::Game;
use hurrycurry_client_lib::network::sync::Network;
use hurrycurry_protocol::glam::Vec2;
@@ -57,10 +59,11 @@ pub enum State {
Quit,
}
-fn main() {
+fn main() -> Result<()> {
env_logger::init_from_env("LOG");
let args = Args::parse();
+ let mut config = Config::load()?;
rustls::crypto::ring::default_provider()
.install_default()
@@ -93,6 +96,7 @@ fn main() {
Action::Menu => State::MainMenu(MainMenu::new(renderer.atlas_layout())),
Action::Join { server_address } => State::Ingame(Box::new(Game::new(
Network::connect(&server_address).unwrap(),
+ &config,
renderer.atlas_layout(),
))),
};
@@ -108,24 +112,25 @@ fn main() {
let keyboard = KeyboardState::new(&events);
let mouse = MouseState::new(&events);
- let dt = last_tick.elapsed().min(Duration::from_secs_f32(1. / 30.));
+ let actual_dt = last_tick.elapsed();
+ last_tick += actual_dt;
+ let dt = actual_dt.min(Duration::from_secs_f32(1. / 30.));
+
let next = match &mut state {
State::Ingame(x) => x.tick(dt.as_secs_f32(), &keyboard, renderer.atlas_layout()),
State::MainMenu(x) => {
x.tick(dt.as_secs_f32(), &keyboard, &mouse, renderer.atlas_layout())
}
- State::Quit => break,
+ State::Quit => break Ok(()),
};
if let Some(next) = next {
state = *next;
}
- last_tick += dt;
-
renderer.set_ui_view(4.);
match &mut state {
State::Ingame(x) => x.draw(&mut renderer),
- State::MainMenu(x) => x.draw(&mut renderer),
+ State::MainMenu(x) => x.draw(&mut renderer, &mut config),
State::Quit => (),
}
@@ -137,7 +142,7 @@ fn main() {
for event in events.poll_iter() {
match event {
- Event::Quit { .. } => break 'mainloop,
+ Event::Quit { .. } => break 'mainloop Ok(()),
Event::KeyUp {
keycode: Some(keycode),
..
diff --git a/pixel-client/src/menu/main.rs b/pixel-client/src/menu/main.rs
index 54b0fe9c..7045931e 100644
--- a/pixel-client/src/menu/main.rs
+++ b/pixel-client/src/menu/main.rs
@@ -17,6 +17,7 @@
*/
use super::{background::MenuBackground, credits::CreditsMenu, settings::SettingsMenu};
use crate::{
+ config::Config,
game::Game,
render::{sprite::SpriteDraw, AtlasLayout, Renderer},
ui::UiState,
@@ -66,12 +67,12 @@ impl MainMenu {
pub fn keyboard_event(&mut self, keycode: Keycode, down: bool) {
self.ui_state.keyboard_event(keycode, down);
}
- pub fn draw(&mut self, ctx: &mut Renderer) {
+ pub fn draw(&mut self, ctx: &mut Renderer, config: &mut Config) {
self.background.draw(ctx);
self.ui_state.draw(ctx, |ui| {
if let Some(settings) = &mut self.settings {
- if settings.draw(ui) {
+ if settings.draw(ui, config) {
self.settings = None;
}
return;
@@ -85,6 +86,7 @@ impl MainMenu {
if ui.button(80., "Join") {
self.next_state = Some(Box::new(State::Ingame(Box::new(Game::new(
Network::connect(&self.server_address).unwrap(),
+ &config,
ui.renderer.atlas_layout(),
)))))
}
diff --git a/pixel-client/src/menu/settings.rs b/pixel-client/src/menu/settings.rs
index 90668039..aef56f2f 100644
--- a/pixel-client/src/menu/settings.rs
+++ b/pixel-client/src/menu/settings.rs
@@ -15,7 +15,9 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-use crate::ui::Ui;
+use crate::{config::Config, render::sprite::SpriteDraw, ui::Ui};
+use hurrycurry_protocol::glam::Vec2;
+use log::warn;
pub struct Settings {
pub username: String,
@@ -25,9 +27,39 @@ pub struct Settings {
pub struct SettingsMenu {}
impl SettingsMenu {
- pub fn draw(&mut self, ui: &mut Ui) -> bool {
- ui.text("Settings placeholder");
+ pub fn draw(&mut self, ui: &mut Ui, config: &mut Config) -> bool {
+ ui.renderer.draw_ui(SpriteDraw::overlay(
+ ui.renderer.misc_textures.solid,
+ Vec2::ZERO,
+ ui.renderer.ui_size,
+ Some([0, 0, 0, 150]),
+ ));
- return ui.button(80., "Back");
+ let mut back = false;
+
+ ui.horizontal(|ui| {
+ ui.advance(Vec2::splat(20.));
+ ui.vertical(|ui| {
+ ui.advance(Vec2::splat(10.));
+ ui.text("Settings");
+
+ ui.horizontal(|ui| {
+ ui.text("Username: ");
+ ui.textedit(100., &mut config.username);
+ });
+
+ ui.advance(ui.get_remaining() - Vec2::Y * 30.);
+
+ if ui.button(80., "Back") {
+ if let Err(e) = config.save() {
+ warn!("cannot save config: {e}");
+ } else {
+ back = true
+ }
+ }
+ });
+ });
+
+ return back;
}
}