@median locust ok i got time lol, here's a working version :D
use bevy::{input::mouse::MouseMotion, prelude::*};
fn main() -> AppExit {
let mut app: App = App::new();
app.add_plugins(DefaultPlugins);
app.add_systems(Startup, spawn_camera_and_floor);
app.add_systems(Update, handle_player_look);
app.run()
}
#[derive(Component)]
struct Player;
#[derive(Component)]
struct PlayerHead;
fn spawn_camera_and_floor(
mut commands: Commands,
mut materials: ResMut<Assets<StandardMaterial>>,
mut meshes: ResMut<Assets<Mesh>>,
) {
commands.spawn((
Transform::default().with_translation(Vec3::ONE),
Player,
children![(PlayerHead, Camera3d::default())],
));
let plane = Plane3d::new(Vec3::new(0.0, 1.0, 0.0), Vec2::new(10.0, 10.0)).mesh();
commands.spawn((
Mesh3d(meshes.add(plane)),
MeshMaterial3d(materials.add(Color::srgb(0.3, 0.5, 0.3))),
Transform::default(),
));
commands.spawn(AmbientLight {
brightness: 200.0,
..Default::default()
});
}
fn handle_player_look(
mut rdr: EventReader<MouseMotion>,
mut param_set: ParamSet<(
Single<&mut Transform, With<Player>>,
Single<&mut Transform, With<PlayerHead>>,
)>,
) {
const SENS: f32 = 0.002;
for ev in rdr.read() {
{
let player_tf: &mut Mut<Transform> = &mut *param_set.p0();
player_tf.rotate_y(-ev.delta.x * SENS);
}
{
let head_tf: &mut Mut<Transform> = &mut *param_set.p1();
head_tf.rotate_local_x(-ev.delta.y * SENS);
}
}
}