aboutsummaryrefslogtreecommitdiff
path: root/pixel-client/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pixel-client/src/game.rs')
-rw-r--r--pixel-client/src/game.rs159
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.);