M assets/dist/spritesheet-125.json => assets/dist/spritesheet-125.json +5 -5
@@ 18,7 18,7 @@
"pivot": { "x": 32, "y": 32 },
"9slicedFrame": { "x": 0, "y": 0, "w": 64, "h": 64 }
},
- "autoplr_error.png": {
+ "autoplr_cfg.png": {
"frame": { "x": 0, "y": 320, "w": 64, "h": 64 },
"rotated": false,
"trimmed": false,
@@ 27,7 27,7 @@
"pivot": { "x": 32, "y": 32 },
"9slicedFrame": { "x": 0, "y": 0, "w": 64, "h": 64 }
},
- "hearty.png": {
+ "autoplr_error.png": {
"frame": { "x": 0, "y": 384, "w": 64, "h": 64 },
"rotated": false,
"trimmed": false,
@@ 36,7 36,7 @@
"pivot": { "x": 32, "y": 32 },
"9slicedFrame": { "x": 0, "y": 0, "w": 64, "h": 64 }
},
- "autoplr_cfg.png": {
+ "hearty.png": {
"frame": { "x": 0, "y": 448, "w": 64, "h": 64 },
"rotated": false,
"trimmed": false,
@@ 90,7 90,7 @@
"pivot": { "x": 32, "y": 32 },
"9slicedFrame": { "x": 0, "y": 0, "w": 64, "h": 64 }
},
- "hub_on.png": {
+ "autoplr_on.png": {
"frame": { "x": 0, "y": 832, "w": 64, "h": 64 },
"rotated": false,
"trimmed": false,
@@ 99,7 99,7 @@
"pivot": { "x": 32, "y": 32 },
"9slicedFrame": { "x": 0, "y": 0, "w": 64, "h": 64 }
},
- "autoplr_on.png": {
+ "hub_on.png": {
"frame": { "x": 0, "y": 896, "w": 64, "h": 64 },
"rotated": false,
"trimmed": false,
M assets/dist/spritesheet-125.png => assets/dist/spritesheet-125.png +0 -0
M assets/dist/spritesheet-375.json => assets/dist/spritesheet-375.json +5 -5
@@ 18,7 18,7 @@
"pivot": { "x": 96, "y": 96 },
"9slicedFrame": { "x": 0, "y": 0, "w": 192, "h": 192 }
},
- "autoplr_error.png": {
+ "autoplr_cfg.png": {
"frame": { "x": 0, "y": 960, "w": 192, "h": 192 },
"rotated": false,
"trimmed": false,
@@ 27,7 27,7 @@
"pivot": { "x": 96, "y": 96 },
"9slicedFrame": { "x": 0, "y": 0, "w": 192, "h": 192 }
},
- "hearty.png": {
+ "autoplr_error.png": {
"frame": { "x": 0, "y": 1152, "w": 192, "h": 192 },
"rotated": false,
"trimmed": false,
@@ 36,7 36,7 @@
"pivot": { "x": 96, "y": 96 },
"9slicedFrame": { "x": 0, "y": 0, "w": 192, "h": 192 }
},
- "autoplr_cfg.png": {
+ "hearty.png": {
"frame": { "x": 0, "y": 1344, "w": 192, "h": 192 },
"rotated": false,
"trimmed": false,
@@ 162,7 162,7 @@
"pivot": { "x": 96, "y": 96 },
"9slicedFrame": { "x": 0, "y": 0, "w": 192, "h": 192 }
},
- "hub_off.png": {
+ "powerhub_off.png": {
"frame": { "x": 768, "y": 0, "w": 192, "h": 192 },
"rotated": false,
"trimmed": false,
@@ 171,7 171,7 @@
"pivot": { "x": 96, "y": 96 },
"9slicedFrame": { "x": 0, "y": 0, "w": 192, "h": 192 }
},
- "powerhub_off.png": {
+ "hub_off.png": {
"frame": { "x": 960, "y": 0, "w": 192, "h": 192 },
"rotated": false,
"trimmed": false,
M assets/dist/spritesheet-375.png => assets/dist/spritesheet-375.png +0 -0
M assets/dist/spritesheet-full.json => assets/dist/spritesheet-full.json +7 -7
@@ 18,7 18,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "autoplr_error.png": {
+ "autoplr_cfg.png": {
"frame": { "x": 0, "y": 2560, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
@@ 27,7 27,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "hearty.png": {
+ "autoplr_error.png": {
"frame": { "x": 0, "y": 3072, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
@@ 36,7 36,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "autoplr_cfg.png": {
+ "hearty.png": {
"frame": { "x": 0, "y": 3584, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
@@ 90,7 90,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "hub_on.png": {
+ "autoplr_on.png": {
"frame": { "x": 512, "y": 2560, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
@@ 99,7 99,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "autoplr_on.png": {
+ "hub_on.png": {
"frame": { "x": 512, "y": 3072, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
@@ 162,7 162,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "hub_off.png": {
+ "powerhub_off.png": {
"frame": { "x": 1024, "y": 2560, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
@@ 171,7 171,7 @@
"pivot": { "x": 256, "y": 256 },
"9slicedFrame": { "x": 0, "y": 0, "w": 512, "h": 512 }
},
- "powerhub_off.png": {
+ "hub_off.png": {
"frame": { "x": 1024, "y": 3072, "w": 512, "h": 512 },
"rotated": false,
"trimmed": false,
M assets/dist/spritesheet-full.png => assets/dist/spritesheet-full.png +0 -0
M client/src/gateway.ts => client/src/gateway.ts +1 -1
@@ 172,4 172,4 @@ function _websocket_connect(url: string): Promise<WebSocket> {
reject(err);
}
});
-}>
\ No newline at end of file
+}
M server/src/handler.rs => server/src/handler.rs +0 -1
@@ 208,7 208,6 @@ pub async fn handle_client(mgr: ClientManager, data: Arc<RwLock<PhysicsData>>, r
me.input.down = p.down_pressed;
me.input.left = p.left_pressed;
me.input.right = p.right_pressed;
- debug!("{} {} {} {}", me.input.up, me.input.down, me.input.left, me.input.right);
}
}
}
M server/src/main.rs => server/src/main.rs +9 -1
@@ 85,8 85,16 @@ async fn _handle_request(mut conn: TcpStream, remote_addr: SocketAddr, mgr: Clie
//forward the stream to the sink to achieve echo
match handle_client(mgr.clone(), physics_data.clone(), remote_addr, rx, ws_write, ws_read).await {
Ok(_) => (),
+ Err(e) if e.is::<async_tungstenite::tungstenite::error::Error>() => {
+ let e = e.downcast::<async_tungstenite::tungstenite::error::Error>().unwrap();
+ if matches!(*e, async_tungstenite::tungstenite::Error::ConnectionClosed) {
+ info!("[{}] connection closed normally", remote_addr);
+ } else {
+ error!("[{}] error in client thread: {}", remote_addr, e);
+ }
+ },
Err(e) => {
- error!("error in client thread: {}", e);
+ error!("[{}] error in client thread: {}", remote_addr, e);
}
}
M server/src/timer.rs => server/src/timer.rs +65 -16
@@ 1,6 1,6 @@
use std::{time::Duration, sync::Arc};
use log::{error, warn};
-use nalgebra::vector;
+use nalgebra::{vector, point};
use rapier2d_f64::prelude::{PhysicsPipeline};
use async_std::sync::RwLock;
use async_std::task::sleep;
@@ 24,38 24,87 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
let mut physics_data = physics_data.write().await;
let player_handle = player.handle;
let player_body = physics_data.rigid_body_set.get_mut(player_handle).unwrap();
+ player_body.reset_forces(true);
+ player_body.reset_torques(true);
let planets = world_data.read().await;
let grav_force = planets.gravity((player_body.translation().x, player_body.translation().y), player_body.mass());
- player_body.add_force(vector![grav_force.0, grav_force.1], true);
+ player_body.apply_impulse(vector![grav_force.0, grav_force.1], true);
- let mut torque = 0.0;
+ let mut left_top_thruster: f64 = 0.0;
+ let mut right_top_thruster: f64 = 0.0;
+ let mut left_bottom_thruster: f64 = 0.0;
+ let mut right_bottom_thruster: f64 = 0.0;
if player.input.right {
- torque += ROTATIONAL_FORCE;
+ left_top_thruster -= 1.0;
+ right_bottom_thruster += 1.0;
}
if player.input.left {
- torque -= ROTATIONAL_FORCE;
+ right_top_thruster -= 1.0;
+ left_bottom_thruster += 1.0;
}
- player_body.add_torque(torque, true);
-
- let mut lateral = vector![0.0, 0.0];
-
if player.input.up {
- lateral -= vector![0.0, LATERAL_FORCE];
+ left_bottom_thruster -= 1.0;
+ right_bottom_thruster -= 1.0;
}
if player.input.down {
- lateral += vector![0.0, LATERAL_FORCE];
+ left_top_thruster += 1.0;
+ right_top_thruster += 1.0;
}
+ left_top_thruster = LATERAL_FORCE * left_top_thruster.clamp(-1.0, 1.0);
+ right_top_thruster = LATERAL_FORCE * right_top_thruster.clamp(-1.0, 1.0);
+ left_bottom_thruster = LATERAL_FORCE * left_bottom_thruster.clamp(-1.0, 1.0);
+ right_bottom_thruster = LATERAL_FORCE * right_bottom_thruster.clamp(-1.0, 1.0);
let rotation = player_body.rotation().clone().angle();
-
- let lateral_rotated = vector![
- lateral.x * rotation.cos() - lateral.y * rotation.sin(),
- lateral.x * rotation.sin() + lateral.y * rotation.cos()
+ let left_top_thruster = vector![
+ -left_top_thruster * rotation.sin(),
+ left_top_thruster * rotation.cos()
+ ];
+ let right_top_thruster = vector![
+ -right_top_thruster * rotation.sin(),
+ right_top_thruster * rotation.cos()
+ ];
+ let left_bottom_thruster = vector![
+ -left_bottom_thruster * rotation.sin(),
+ left_bottom_thruster * rotation.cos()
+ ];
+ let right_bottom_thruster = vector![
+ -right_bottom_thruster * rotation.sin(),
+ right_bottom_thruster * rotation.cos()
];
+ let scale = SCALE as f64;
+ let top_left_point = point![
+ -25. / scale * rotation.cos() +25. / scale * rotation.sin(),
+ -25. / scale * rotation.sin() -25. / scale * rotation.cos()
+ ] + player_body.translation();
+ let top_right_point = point![
+ 25. / scale * rotation.cos() +25. / scale * rotation.sin(),
+ 25. / scale * rotation.sin() -25. / scale * rotation.cos()
+ ] + player_body.translation();
+ let bottom_left_point = point![
+ -25. / scale * rotation.cos() -25. / scale * rotation.sin(),
+ -25. / scale * rotation.sin() +25. / scale * rotation.cos()
+ ] + player_body.translation();
+ let bottom_right_point = point![
+ 25. / scale * rotation.cos() -25. / scale * rotation.sin(),
+ 25. / scale * rotation.sin() +25. / scale * rotation.cos()
+ ] + player_body.translation();
+
+ player_body.add_force_at_point(
+ left_top_thruster,
+ top_left_point, true);
+ player_body.add_force_at_point(
+ right_top_thruster,
+ top_right_point, true);
+ player_body.add_force_at_point(
+ left_bottom_thruster,
+ bottom_left_point, true);
+ player_body.add_force_at_point(
+ right_bottom_thruster,
+ bottom_right_point, true);
- player_body.add_force(lateral_rotated, true);
let translation = player_body.translation();
M spacetime_py/__pycache__/ninja_syntax.cpython-310.pyc => spacetime_py/__pycache__/ninja_syntax.cpython-310.pyc +0 -0