diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-17 20:32:06 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-17 20:32:06 +0200 |
commit | 356e6976f10973ec5e1678534c9d8d9742033bee (patch) | |
tree | 455e671ff0c24b876f3156ee56e61e43d608decb /pixel-client/src/main.rs | |
parent | 4e2f42cc87e33752c76e866009786d4f827d9cb2 (diff) | |
download | hurrycurry-356e6976f10973ec5e1678534c9d8d9742033bee.tar hurrycurry-356e6976f10973ec5e1678534c9d8d9742033bee.tar.bz2 hurrycurry-356e6976f10973ec5e1678534c9d8d9742033bee.tar.zst |
a
Diffstat (limited to 'pixel-client/src/main.rs')
-rw-r--r-- | pixel-client/src/main.rs | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/pixel-client/src/main.rs b/pixel-client/src/main.rs index 76735c35..db2585af 100644 --- a/pixel-client/src/main.rs +++ b/pixel-client/src/main.rs @@ -1,5 +1,3 @@ -use anyhow::anyhow; -use clap::Parser; /* Hurry Curry! - a game about cooking Copyright 2024 metamuffin @@ -17,8 +15,11 @@ use clap::Parser; along with this program. If not, see <https://www.gnu.org/licenses/>. */ +use anyhow::anyhow; +use clap::{Parser, Subcommand}; use game::Game; use hurrycurry_protocol::glam::{UVec2, Vec2}; +use menu::Menu; use network::Network; use render::SpriteRenderer; use sdl2::{ @@ -33,17 +34,28 @@ use std::{ pub mod game; pub mod helper; +pub mod menu; pub mod network; pub mod render; pub mod tilemap; #[derive(Debug, Parser)] pub struct Args { - #[arg(default_value = "ws://127.0.0.1/")] - server_address: String, - #[arg(short = 'r', long, default_value = "320x240")] logical_resolution: Resolution, + + #[clap(subcommand)] + action: Option<Action>, +} + +#[derive(Debug, Subcommand, Default)] +pub enum Action { + #[default] + Menu, + Join { + #[arg(default_value = "ws://127.0.0.1/")] + server_address: String, + }, } #[derive(Debug, Clone)] @@ -56,6 +68,11 @@ impl FromStr for Resolution { } } +enum State { + Ingame(Game), + Menu(Menu), +} + fn main() { env_logger::init_from_env("LOG"); @@ -66,6 +83,7 @@ fn main() { .unwrap(); let sdl_context = sdl2::init().unwrap(); + let ttf_context = sdl2::ttf::init().unwrap(); let video_subsystem = sdl_context.video().unwrap(); let window = video_subsystem @@ -82,16 +100,24 @@ fn main() { .build() .map_err(|e| e.to_string()) .unwrap(); + let texture_creator = canvas.texture_creator(); - let mut net = Network::connect(&args.server_address).unwrap(); let mut renderer = SpriteRenderer::init(&texture_creator); - let mut game = Game::new(&renderer.atlas_layout()); - net.queue_out.push_back(hurrycurry_protocol::PacketS::Join { - name: "light".to_string(), - character: 0, - }); + let mut state = match args.action.unwrap_or_default() { + Action::Menu => State::Menu(Menu::new()), + Action::Join { server_address } => State::Ingame(Game::new( + Network::connect(&server_address).unwrap(), + &renderer.atlas_layout(), + )), + }; + + // let font = ttf_context + // .load_font("/usr/share/fonts/noto/NotoSansMono-Regular.ttf", 24) + // .unwrap(); + // let text = font.render("Hello world").blended(Color::WHITE).unwrap(); + // texture_creator.create_texture_from_surface(text).unwrap(); let mut events = sdl_context.event_pump().unwrap(); @@ -102,21 +128,22 @@ fn main() { .unwrap(); 'mainloop: loop { - net.poll(); - let (width, height) = canvas.logical_size(); renderer.size = Vec2::new(width as f32, height as f32); - for packet in net.queue_in.drain(..) { - game.packet_in(packet, &mut renderer); - } - let keyboard = KeyboardState::new(&events); let dt = last_tick.elapsed().min(Duration::from_secs_f32(1. / 30.)); - game.tick(dt.as_secs_f32(), &keyboard, &mut net.queue_out); + match &mut state { + State::Ingame(x) => x.tick(dt.as_secs_f32(), &keyboard, renderer.atlas_layout()), + State::Menu(x) => x.tick(dt.as_secs_f32(), &keyboard, renderer.atlas_layout()), + } + last_tick += dt; - game.draw(&mut renderer); + match &mut state { + State::Ingame(x) => x.draw(&mut renderer), + State::Menu(x) => x.draw(&mut renderer), + } canvas.set_draw_color(Color::BLACK); canvas.clear(); |