diff options
Diffstat (limited to 'light-client')
-rw-r--r-- | light-client/src/game.rs | 26 | ||||
-rw-r--r-- | light-client/src/helper.rs | 11 | ||||
-rw-r--r-- | light-client/src/main.rs | 8 | ||||
-rw-r--r-- | light-client/src/render/mod.rs | 20 |
4 files changed, 50 insertions, 15 deletions
diff --git a/light-client/src/game.rs b/light-client/src/game.rs index 13e50a2e..7d8e466a 100644 --- a/light-client/src/game.rs +++ b/light-client/src/game.rs @@ -16,6 +16,7 @@ */ use crate::{ + helper::Vec2InterpolateExt, render::{ misc::MiscTextures, sprite::{Sprite, SpriteDraw}, @@ -43,6 +44,7 @@ pub struct Game { players: HashMap<PlayerID, Player>, my_id: PlayerID, + camera_center: Vec2, misc_textures: MiscTextures, item_sprites: Vec<Sprite>, movement_send_cooldown: f32, @@ -90,6 +92,7 @@ impl Game { item_sprites: Vec::new(), interacting: false, score: Score::default(), + camera_center: Vec2::ZERO, } } @@ -273,17 +276,18 @@ impl Game { self.interacting = interact; } - for (pid, player) in &mut self.players { - if *pid == self.my_id { - let movement_packet = - player - .movement - .update(&self.collision_map, direction, boost, dt); - - if send_movement { - packet_out.push_back(movement_packet); - } + 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.position = player.movement.position } @@ -296,6 +300,8 @@ impl Game { } pub fn draw(&self, ctx: &mut SpriteRenderer) { + ctx.set_view(-self.camera_center + (ctx.size / ctx.get_scale() / 2.), 1.); + self.tilemap.draw(ctx); for p in self.players.values() { diff --git a/light-client/src/helper.rs b/light-client/src/helper.rs new file mode 100644 index 00000000..9654f519 --- /dev/null +++ b/light-client/src/helper.rs @@ -0,0 +1,11 @@ +use hurrycurry_protocol::glam::Vec2; + +pub trait Vec2InterpolateExt { + fn exp_to(&mut self, target: Vec2, dt: f32); +} +impl Vec2InterpolateExt for Vec2 { + fn exp_to(&mut self, target: Vec2, dt: f32) { + self.x = target.x + (self.x - target.x) * (-dt).exp(); + self.y = target.y + (self.y - target.y) * (-dt).exp(); + } +} diff --git a/light-client/src/main.rs b/light-client/src/main.rs index 7526b394..e3aaa5cc 100644 --- a/light-client/src/main.rs +++ b/light-client/src/main.rs @@ -16,6 +16,7 @@ */ use game::Game; +use hurrycurry_protocol::glam::Vec2; use network::Network; use render::SpriteRenderer; use sdl2::{ @@ -26,6 +27,7 @@ use sdl2::{ use std::time::{Duration, Instant}; pub mod game; +pub mod helper; pub mod network; pub mod render; pub mod tilemap; @@ -34,6 +36,7 @@ fn main() { env_logger::init_from_env("LOG"); let sdl_context = sdl2::init().unwrap(); + let video_subsystem = sdl_context.video().unwrap(); let window = video_subsystem .window("Hurry Curry! Light Client", 1280, 720) @@ -64,9 +67,14 @@ fn main() { let mut last_tick = Instant::now(); + canvas.set_logical_size(320, 240).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); } diff --git a/light-client/src/render/mod.rs b/light-client/src/render/mod.rs index a410da6f..a2aea365 100644 --- a/light-client/src/render/mod.rs +++ b/light-client/src/render/mod.rs @@ -31,6 +31,7 @@ use std::collections::HashMap; pub struct SpriteRenderer<'a> { metadata: AtlasLayout, + pub size: Vec2, texture: Texture<'a>, view_scale: Vec2, @@ -103,13 +104,22 @@ impl<'a> SpriteRenderer<'a> { Self { texture, + size: Vec2::ONE, metadata, sprites: vec![], view_offset: Vec2::ZERO, - view_scale: Vec2::splat(3.), + view_scale: Vec2::ZERO, } } + pub fn set_view(&mut self, offset: Vec2, scale: f32) { + self.view_offset = offset; + self.view_scale = Vec2::new(32., 24.) * scale; + } + pub fn get_scale(&self) -> Vec2 { + self.view_scale + } + #[inline] pub fn atlas_layout(&self) -> &HashMap<String, Rect> { &self.metadata @@ -129,10 +139,10 @@ impl<'a> SpriteRenderer<'a> { z_order: sprite.z_order, src: sprite.src, dst: FRect::new( - ((sprite.dst.x + self.view_offset.x) * 32.).round() * self.view_scale.x, - ((sprite.dst.y + self.view_offset.y) * 24.).round() * self.view_scale.y, - (sprite.dst.w * 32.).round() * self.view_scale.x, - (sprite.dst.h * 24.).round() * self.view_scale.y, + ((sprite.dst.x + self.view_offset.x) * self.view_scale.x).round(), + ((sprite.dst.y + self.view_offset.y) * self.view_scale.y).round(), + (sprite.dst.w * self.view_scale.x).round(), + (sprite.dst.h * self.view_scale.y).round(), ), }) } |