diff --git a/client/src/main.rs b/client/src/main.rs index ce57a29..54e4b77 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -83,6 +83,7 @@ fn main() { app.add_system(update_visulizer_system); app.add_startup_system(setup_level); + app.add_startup_system(setup_camera); app.add_system(panic_on_error_system); app.run(); @@ -159,8 +160,10 @@ fn client_sync_players( mut most_recent_tick: ResMut, ) { let client_id = client.client_id(); + while let Some(message) = client.receive_message(ServerChannel::ServerMessages.id()) { let server_message = bincode::deserialize(&message).unwrap(); + match server_message { ServerMessages::PlayerCreate { id, @@ -168,10 +171,13 @@ fn client_sync_players( entity, } => { println!("Player {} connected.", id); - let mut client_entity = commands.spawn_bundle(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Capsule::default())), - material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), - transform: Transform::from_xyz(translation[0], translation[1], translation[2]), + + let mut client_entity = commands.spawn_bundle(SpriteBundle { + sprite: Sprite { + color: Color::rgb(0., 0.47, 1.), + custom_size: Some(Vec2::new(1., 1.)), + ..Default::default() + }, ..Default::default() }); @@ -183,11 +189,14 @@ fn client_sync_players( server_entity: entity, client_entity: client_entity.id(), }; + lobby.players.insert(id, player_info); + network_mapping.0.insert(entity, client_entity.id()); } ServerMessages::PlayerRemove { id } => { println!("Player {} disconnected.", id); + if let Some(PlayerInfo { server_entity, client_entity, @@ -223,6 +232,7 @@ fn client_sync_players( while let Some(message) = client.receive_message(ServerChannel::NetworkFrame.id()) { let frame: NetworkFrame = bincode::deserialize(&message).unwrap(); + match most_recent_tick.0 { None => most_recent_tick.0 = Some(frame.tick), Some(tick) if tick < frame.tick => most_recent_tick.0 = Some(frame.tick), @@ -236,11 +246,16 @@ fn client_sync_players( translation, ..Default::default() }; + commands.entity(*entity).insert(transform); } } } } +fn setup_camera(mut commands: Commands) { + commands.spawn_bundle(Camera2dBundle::default()); +} + #[derive(Component)] struct Target; diff --git a/server/src/main.rs b/server/src/main.rs index 923008b..2ae414c 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -92,6 +92,7 @@ fn server_update_system( match event { ServerEvent::ClientConnected(id, _) => { println!("Player {} connected.", id); + visualizer.add_client(*id); // Initialize other players for this new client @@ -109,10 +110,12 @@ fn server_update_system( // Spawn new player let transform = Transform::from_xyz(0., 0.51, 0.); let player_entity = commands - .spawn_bundle(PbrBundle { - mesh: meshes.add(Mesh::from(shape::Capsule::default())), - material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()), - transform, + .spawn_bundle(SpriteBundle { + sprite: Sprite { + color: Color::rgb(0., 0.47, 1.), + custom_size: Some(Vec2::new(1., 1.)), + ..Default::default() + }, ..Default::default() }) .insert(RigidBody::Dynamic) @@ -140,14 +143,17 @@ fn server_update_system( } ServerEvent::ClientDisconnected(id) => { println!("Player {} disconnected.", id); + visualizer.remove_client(*id); client_ticks.0.remove(id); + if let Some(player_entity) = lobby.players.remove(id) { commands.entity(player_entity).despawn(); } let message = bincode::serialize(&ServerMessages::PlayerRemove { id: *id }).unwrap(); + server.broadcast_message(ServerChannel::ServerMessages.id(), message); } } @@ -156,6 +162,7 @@ fn server_update_system( for client_id in server.clients_id().into_iter() { while let Some(message) = server.receive_message(client_id, ClientChannel::Command.id()) { let command: PlayerCommand = bincode::deserialize(&message).unwrap(); + match command { PlayerCommand::BasicAttack { mut cast_at } => { println!( @@ -177,6 +184,7 @@ fn server_update_system( }; let message = bincode::serialize(&message).unwrap(); + server.broadcast_message(ServerChannel::ServerMessages.id(), message); } } @@ -186,6 +194,7 @@ fn server_update_system( while let Some(message) = server.receive_message(client_id, ClientChannel::Input.id()) { let input: PlayerInput = bincode::deserialize(&message).unwrap(); + client_ticks.0.insert(client_id, input.most_recent_tick); if let Some(player_entity) = lobby.players.get(&client_id) { @@ -247,17 +256,14 @@ fn move_players_system(mut query: Query<(&mut Velocity, &PlayerInput)>) { let x = (input.right as i8 - input.left as i8) as f32; let y = (input.down as i8 - input.up as i8) as f32; let direction = Vec2::new(x, y).normalize_or_zero(); + velocity.linvel.x = direction.x * PLAYER_MOVE_SPEED; velocity.linvel.y = direction.y * PLAYER_MOVE_SPEED; } } pub fn setup_simple_camera(mut commands: Commands) { - // camera - commands.spawn_bundle(Camera3dBundle { - transform: Transform::from_xyz(-5.5, 5.0, 5.5).looking_at(Vec3::ZERO, Vec3::Y), - ..Default::default() - }); + commands.spawn_bundle(Camera2dBundle::default()); } fn despawn_projectile_system(