collision detection stuff
This commit is contained in:
parent
7fa8c25b54
commit
0fdf5b5952
8
README.md
Normal file
8
README.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# daggmask
|
||||||
|
|
||||||
|
Should not really be worms, project name subject to change.
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
cargo run --bin daggmask-server
|
||||||
|
cargo run --bin daggmask
|
@ -70,7 +70,7 @@ fn main() {
|
|||||||
app.add_plugins(DefaultPlugins);
|
app.add_plugins(DefaultPlugins);
|
||||||
app.add_plugin(RenetClientPlugin);
|
app.add_plugin(RenetClientPlugin);
|
||||||
app.add_plugin(TransformPlugin);
|
app.add_plugin(TransformPlugin);
|
||||||
//app.add_plugin(FrameTimeDiagnosticsPlugin::default());
|
app.add_plugin(FrameTimeDiagnosticsPlugin::default());
|
||||||
app.add_plugin(LogDiagnosticsPlugin::default());
|
app.add_plugin(LogDiagnosticsPlugin::default());
|
||||||
app.add_plugin(EguiPlugin);
|
app.add_plugin(EguiPlugin);
|
||||||
|
|
||||||
@ -139,8 +139,6 @@ fn player_input(
|
|||||||
player_input.most_recent_tick = most_recent_tick.0;
|
player_input.most_recent_tick = most_recent_tick.0;
|
||||||
|
|
||||||
if mouse_button_input.just_pressed(MouseButton::Left) {
|
if mouse_button_input.just_pressed(MouseButton::Left) {
|
||||||
info!("player fired at {}", aimer.aiming_at);
|
|
||||||
|
|
||||||
player_commands.send(PlayerCommand::BasicAttack {
|
player_commands.send(PlayerCommand::BasicAttack {
|
||||||
direction: aimer.aiming_at,
|
direction: aimer.aiming_at,
|
||||||
});
|
});
|
||||||
|
@ -53,6 +53,38 @@ struct ClientTicks(HashMap<u64, Option<u32>>);
|
|||||||
|
|
||||||
const PLAYER_MOVE_SPEED: f32 = 50.0;
|
const PLAYER_MOVE_SPEED: f32 = 50.0;
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, Clone, Copy, Component)]
|
||||||
|
enum ShooterProjectileTag {
|
||||||
|
Id(u64),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ShooterProjectileFilter;
|
||||||
|
impl<'a> PhysicsHooksWithQuery<&'a ShooterProjectileTag> for ShooterProjectileFilter {
|
||||||
|
fn filter_contact_pair(
|
||||||
|
&self,
|
||||||
|
context: PairFilterContextView,
|
||||||
|
user_data: &Query<&'a ShooterProjectileTag>,
|
||||||
|
) -> Option<SolverFlags> {
|
||||||
|
let result = match user_data.get(context.collider1()).ok() {
|
||||||
|
Some(ShooterProjectileTag::Id(id1)) => match user_data.get(context.collider2()).ok() {
|
||||||
|
Some(ShooterProjectileTag::Id(id2)) => {
|
||||||
|
// HACK: bullet hitting yourself shouldn't do damage when you shoot
|
||||||
|
// TODO: find out how to be able to have bullets damage you after some time
|
||||||
|
if id1 == id2 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(SolverFlags::COMPUTE_IMPULSES)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
},
|
||||||
|
_ => Some(SolverFlags::COMPUTE_IMPULSES),
|
||||||
|
};
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn new_renet_server() -> RenetServer {
|
fn new_renet_server() -> RenetServer {
|
||||||
let server_addr = "127.0.0.1:5000".parse().unwrap();
|
let server_addr = "127.0.0.1:5000".parse().unwrap();
|
||||||
let socket = UdpSocket::bind(server_addr).unwrap();
|
let socket = UdpSocket::bind(server_addr).unwrap();
|
||||||
@ -70,9 +102,9 @@ fn main() {
|
|||||||
app.add_plugins(DefaultPlugins);
|
app.add_plugins(DefaultPlugins);
|
||||||
|
|
||||||
app.add_plugin(RenetServerPlugin);
|
app.add_plugin(RenetServerPlugin);
|
||||||
app.add_plugin(RapierPhysicsPlugin::<NoUserData>::default());
|
app.add_plugin(RapierPhysicsPlugin::<&ShooterProjectileTag>::default());
|
||||||
app.add_plugin(RapierDebugRenderPlugin::default());
|
app.add_plugin(RapierDebugRenderPlugin::default());
|
||||||
//app.add_plugin(FrameTimeDiagnosticsPlugin::default());
|
app.add_plugin(FrameTimeDiagnosticsPlugin::default());
|
||||||
app.add_plugin(LogDiagnosticsPlugin::default());
|
app.add_plugin(LogDiagnosticsPlugin::default());
|
||||||
app.add_plugin(EguiPlugin);
|
app.add_plugin(EguiPlugin);
|
||||||
|
|
||||||
@ -92,6 +124,7 @@ fn main() {
|
|||||||
app.add_system(despawn_projectile_system);
|
app.add_system(despawn_projectile_system);
|
||||||
app.add_system_to_stage(CoreStage::PostUpdate, projectile_on_removal_system);
|
app.add_system_to_stage(CoreStage::PostUpdate, projectile_on_removal_system);
|
||||||
|
|
||||||
|
app.add_startup_system(setup_physics);
|
||||||
app.add_startup_system(setup_level);
|
app.add_startup_system(setup_level);
|
||||||
app.add_startup_system(setup_simple_camera);
|
app.add_startup_system(setup_simple_camera);
|
||||||
|
|
||||||
@ -118,7 +151,7 @@ fn server_update_system(
|
|||||||
|
|
||||||
visualizer.add_client(*id);
|
visualizer.add_client(*id);
|
||||||
|
|
||||||
// Initialize other players for this new client
|
// initialize other players for this new client
|
||||||
for (entity, player) in players.iter() {
|
for (entity, player) in players.iter() {
|
||||||
let message = bincode::serialize(&ServerMessages::PlayerCreate {
|
let message = bincode::serialize(&ServerMessages::PlayerCreate {
|
||||||
id: player.id,
|
id: player.id,
|
||||||
@ -128,7 +161,7 @@ fn server_update_system(
|
|||||||
server.send_message(*id, ServerChannel::ServerMessages.id(), message);
|
server.send_message(*id, ServerChannel::ServerMessages.id(), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spawn new player
|
// spawn new player
|
||||||
let player_entity = commands
|
let player_entity = commands
|
||||||
.spawn_bundle(SpriteBundle {
|
.spawn_bundle(SpriteBundle {
|
||||||
sprite: Sprite {
|
sprite: Sprite {
|
||||||
@ -142,10 +175,12 @@ fn server_update_system(
|
|||||||
.insert(RigidBody::Dynamic)
|
.insert(RigidBody::Dynamic)
|
||||||
.insert(LockedAxes::ROTATION_LOCKED)
|
.insert(LockedAxes::ROTATION_LOCKED)
|
||||||
.insert(Collider::cuboid(5., 5.))
|
.insert(Collider::cuboid(5., 5.))
|
||||||
|
.insert(ActiveHooks::FILTER_CONTACT_PAIRS)
|
||||||
.insert(ActiveEvents::COLLISION_EVENTS)
|
.insert(ActiveEvents::COLLISION_EVENTS)
|
||||||
.insert(PlayerInput::default())
|
.insert(PlayerInput::default())
|
||||||
.insert(Velocity::default())
|
.insert(Velocity::default())
|
||||||
.insert(Player { id: *id })
|
.insert(Player { id: *id })
|
||||||
|
.insert(ShooterProjectileTag::Id(*id))
|
||||||
.insert(Jumper {
|
.insert(Jumper {
|
||||||
jump_impulse: 80.,
|
jump_impulse: 80.,
|
||||||
is_jumping: false,
|
is_jumping: false,
|
||||||
@ -191,12 +226,8 @@ fn server_update_system(
|
|||||||
let origin =
|
let origin =
|
||||||
Vec2::new(transform.translation().x, transform.translation().y);
|
Vec2::new(transform.translation().x, transform.translation().y);
|
||||||
|
|
||||||
info!(
|
let entity =
|
||||||
"spawned attack on server at origin {} with direction {}",
|
spawn_projectile(&mut commands, player.id, origin, direction);
|
||||||
origin, direction
|
|
||||||
);
|
|
||||||
|
|
||||||
let entity = spawn_projectile(&mut commands, origin, direction);
|
|
||||||
let message = ServerMessages::SpawnProjectile { entity, origin };
|
let message = ServerMessages::SpawnProjectile { entity, origin };
|
||||||
let message = bincode::serialize(&message).unwrap();
|
let message = bincode::serialize(&message).unwrap();
|
||||||
|
|
||||||
@ -295,16 +326,13 @@ fn jump_reset(
|
|||||||
for collision_event in collision_events.iter() {
|
for collision_event in collision_events.iter() {
|
||||||
match collision_event {
|
match collision_event {
|
||||||
CollisionEvent::Started(e1, e2, _) => {
|
CollisionEvent::Started(e1, e2, _) => {
|
||||||
info!("collision started: e1: {}, e2: {}", e1.id(), e2.id());
|
|
||||||
for (entity, mut jumper) in query.iter_mut() {
|
for (entity, mut jumper) in query.iter_mut() {
|
||||||
if e1.id() == entity.id() || e2.id() == entity.id() {
|
if e1.id() == entity.id() || e2.id() == entity.id() {
|
||||||
jumper.is_jumping = false
|
jumper.is_jumping = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CollisionEvent::Stopped(e1, e2, _) => {
|
CollisionEvent::Stopped(_e1, _e2, _) => {}
|
||||||
info!("collision stopped: {}, {}", e1.id(), e2.id());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -343,7 +371,12 @@ fn projectile_on_removal_system(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spawn_projectile(commands: &mut Commands, origin: Vec2, direction: Vec2) -> Entity {
|
fn spawn_projectile(
|
||||||
|
commands: &mut Commands,
|
||||||
|
player_id: u64,
|
||||||
|
origin: Vec2,
|
||||||
|
direction: Vec2,
|
||||||
|
) -> Entity {
|
||||||
let normalized_direction = direction.normalize();
|
let normalized_direction = direction.normalize();
|
||||||
|
|
||||||
commands
|
commands
|
||||||
@ -356,7 +389,9 @@ fn spawn_projectile(commands: &mut Commands, origin: Vec2, direction: Vec2) -> E
|
|||||||
.insert(Collider::ball(0.1))
|
.insert(Collider::ball(0.1))
|
||||||
.insert(RigidBody::Dynamic)
|
.insert(RigidBody::Dynamic)
|
||||||
.insert(Velocity::linear(normalized_direction * 130.))
|
.insert(Velocity::linear(normalized_direction * 130.))
|
||||||
|
.insert(ActiveHooks::FILTER_CONTACT_PAIRS)
|
||||||
.insert(ActiveEvents::COLLISION_EVENTS)
|
.insert(ActiveEvents::COLLISION_EVENTS)
|
||||||
|
.insert(ShooterProjectileTag::Id(player_id))
|
||||||
.insert(Projectile {
|
.insert(Projectile {
|
||||||
duration: Timer::from_seconds(3.5, false),
|
duration: Timer::from_seconds(3.5, false),
|
||||||
})
|
})
|
||||||
@ -379,11 +414,17 @@ fn spawn_floor(mut commands: Commands) {
|
|||||||
.insert_bundle(TransformBundle::from(Transform::from_xyz(-50., 0., 0.)))
|
.insert_bundle(TransformBundle::from(Transform::from_xyz(-50., 0., 0.)))
|
||||||
.insert(RigidBody::Fixed)
|
.insert(RigidBody::Fixed)
|
||||||
.insert(Collider::cuboid(width / 2., height / 2.))
|
.insert(Collider::cuboid(width / 2., height / 2.))
|
||||||
|
.insert(ActiveHooks::FILTER_CONTACT_PAIRS)
|
||||||
.insert(ActiveEvents::COLLISION_EVENTS)
|
.insert(ActiveEvents::COLLISION_EVENTS)
|
||||||
.insert(Floor);
|
.insert(Floor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn setup_physics(mut commands: Commands) {
|
||||||
|
commands.insert_resource(PhysicsHooksWithQueryResource(Box::new(
|
||||||
|
ShooterProjectileFilter {},
|
||||||
|
)));
|
||||||
|
}
|
||||||
// set up the level
|
// set up the level
|
||||||
pub fn setup_level(mut _commands: Commands) {
|
fn setup_level(mut _commands: Commands) {
|
||||||
info!("bygger level...");
|
info!("bygger level...");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user