aboutsummaryrefslogtreecommitdiff
path: root/light-client
diff options
context:
space:
mode:
Diffstat (limited to 'light-client')
-rw-r--r--light-client/src/game.rs26
-rw-r--r--light-client/src/helper.rs11
-rw-r--r--light-client/src/main.rs8
-rw-r--r--light-client/src/render/mod.rs20
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(),
),
})
}