diff options
Diffstat (limited to 'pixel-client/src/game.rs')
-rw-r--r-- | pixel-client/src/game.rs | 159 |
1 files changed, 89 insertions, 70 deletions
diff --git a/pixel-client/src/game.rs b/pixel-client/src/game.rs index 170e6a6e..cbc9954c 100644 --- a/pixel-client/src/game.rs +++ b/pixel-client/src/game.rs @@ -17,6 +17,7 @@ */ use crate::{ helper::InterpolateExt, + network::Network, render::{ misc::MiscTextures, sprite::{Sprite, SpriteDraw}, @@ -34,9 +35,11 @@ use sdl2::{ keyboard::{KeyboardState, Scancode}, rect::Rect, }; -use std::collections::{HashMap, HashSet, VecDeque}; +use std::collections::{HashMap, HashSet}; pub struct Game { + network: Network, + data: ClientGamedata, tiles: HashMap<IVec2, Tile>, tilemap: Tilemap, @@ -82,8 +85,16 @@ pub struct Item { } impl Game { - pub fn new(layout: &AtlasLayout) -> Self { + pub fn new(mut network: Network, layout: &AtlasLayout) -> Self { + network + .queue_out + .push_back(hurrycurry_protocol::PacketS::Join { + name: "light".to_string(), + character: 0, + }); + Self { + network, tiles: HashMap::new(), players: HashMap::new(), tilemap: Tilemap::default(), @@ -100,18 +111,90 @@ impl Game { } } - pub fn packet_in(&mut self, packet: PacketC, renderer: &mut SpriteRenderer) { + pub fn tick(&mut self, dt: f32, keyboard: &KeyboardState, layout: &AtlasLayout) { + self.network.poll(); + + // TODO perf + for packet in self.network.queue_in.drain(..).collect::<Vec<_>>() { + self.packet_in(packet, layout); + } + + let mut direction = IVec2::new( + keyboard.is_scancode_pressed(Scancode::D) as i32 + - keyboard.is_scancode_pressed(Scancode::A) as i32, + keyboard.is_scancode_pressed(Scancode::S) as i32 + - keyboard.is_scancode_pressed(Scancode::W) as i32, + ) + .as_vec2(); + let boost = keyboard.is_scancode_pressed(Scancode::K); + let interact = keyboard.is_scancode_pressed(Scancode::Space) + | keyboard.is_scancode_pressed(Scancode::J); + + if interact { + direction *= 0.; + } + + self.movement_send_cooldown -= dt; + let send_movement = self.movement_send_cooldown < 0.; + if send_movement { + self.movement_send_cooldown += 0.04 + } + + self.score.time_remaining -= dt; + self.score.time_remaining -= self.score.time_remaining.max(0.); + + if interact != self.interacting { + if interact { + self.network.queue_out.push_back(PacketS::Interact { + pos: Some(self.players[&self.my_id].movement.get_interact_target()), + }); + } else { + self.network + .queue_out + .push_back(PacketS::Interact { pos: None }); + } + self.interacting = interact; + } + + if let Some(player) = self.players.get_mut(&self.my_id) { + let movement_packet = player + .movement + .update(&self.collision_map, direction, boost, dt); + if send_movement { + self.network.queue_out.push_back(movement_packet); + } + + self.camera_center.exp_to(player.movement.position, dt * 5.); + } + + for (_pid, player) in &mut self.players { + if let Some(item) = &mut player.item { + item.parent_position = player.movement.position; + item.tick(1., dt); + } + } + for (_pos, tile) in &mut self.tiles { + if let Some(item) = &mut tile.item { + item.tick(1., dt) + } + } + self.items_removed.retain_mut(|i| { + i.tick(0., dt); + i.alive > 0.01 + }) + } + + pub fn packet_in(&mut self, packet: PacketC, layout: &AtlasLayout) { match packet { PacketC::Init { id } => self.my_id = id, PacketC::Data { data } => { - self.tilemap.init(&data.tile_names, renderer.atlas_layout()); + self.tilemap.init(&data.tile_names, layout); self.item_sprites = data .item_names .iter() .map(|name| { Sprite::new( - renderer - .atlas_layout() + layout .get(&format!("{name}+a")) .copied() .unwrap_or_else(|| { @@ -264,70 +347,6 @@ impl Game { } } - pub fn tick(&mut self, dt: f32, keyboard: &KeyboardState, packet_out: &mut VecDeque<PacketS>) { - let mut direction = IVec2::new( - keyboard.is_scancode_pressed(Scancode::D) as i32 - - keyboard.is_scancode_pressed(Scancode::A) as i32, - keyboard.is_scancode_pressed(Scancode::S) as i32 - - keyboard.is_scancode_pressed(Scancode::W) as i32, - ) - .as_vec2(); - let boost = keyboard.is_scancode_pressed(Scancode::K); - let interact = keyboard.is_scancode_pressed(Scancode::Space) - | keyboard.is_scancode_pressed(Scancode::J); - - if interact { - direction *= 0.; - } - - self.movement_send_cooldown -= dt; - let send_movement = self.movement_send_cooldown < 0.; - if send_movement { - self.movement_send_cooldown += 0.04 - } - - self.score.time_remaining -= dt; - self.score.time_remaining -= self.score.time_remaining.max(0.); - - if interact != self.interacting { - if interact { - packet_out.push_back(PacketS::Interact { - pos: Some(self.players[&self.my_id].movement.get_interact_target()), - }); - } else { - packet_out.push_back(PacketS::Interact { pos: None }); - } - self.interacting = interact; - } - - if let Some(player) = self.players.get_mut(&self.my_id) { - let movement_packet = player - .movement - .update(&self.collision_map, direction, boost, dt); - if send_movement { - packet_out.push_back(movement_packet); - } - - self.camera_center.exp_to(player.movement.position, dt * 5.); - } - - for (_pid, player) in &mut self.players { - if let Some(item) = &mut player.item { - item.parent_position = player.movement.position; - item.tick(1., dt); - } - } - for (_pos, tile) in &mut self.tiles { - if let Some(item) = &mut tile.item { - item.tick(1., dt) - } - } - self.items_removed.retain_mut(|i| { - i.tick(0., dt); - i.alive > 0.01 - }) - } - pub fn draw(&self, ctx: &mut SpriteRenderer) { ctx.set_view(-self.camera_center + (ctx.size / ctx.get_scale() / 2.), 1.); |