Parallax 2d (sans wraparound) working

main
Elijah Voigt 2 months ago
parent d1ad7c04bd
commit 88cd679fa7

@ -4,8 +4,9 @@ fn main() {
App::new() App::new()
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.insert_resource(ClearColor(WHITE.into())) .insert_resource(ClearColor(WHITE.into()))
.add_event::<CameraMovement>()
.add_systems(Startup, setup_2d) .add_systems(Startup, setup_2d)
.add_systems(Update, move_camera) .add_systems(Update, (move_camera, track_camera_movement, parallax))
.run(); .run();
} }
@ -28,32 +29,64 @@ fn setup_2d(
commands.spawn(( commands.spawn((
Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))), Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))),
MeshMaterial2d(materials.add(Color::from(RED))), MeshMaterial2d(materials.add(Color::from(RED))),
Transform::from_xyz(0.0, 0.0, -1.0),
ParallaxDistance(1.0), ParallaxDistance(1.0),
children![(Text2d::new("Parallax Distance: 1"), TextColor(BLACK.into()), Transform::from_xyz(150.0, 50.0, 0.0))],
)); ));
commands.spawn(( commands.spawn((
Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))), Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))),
MeshMaterial2d(materials.add(Color::from(GREEN))), MeshMaterial2d(materials.add(Color::from(GREEN))),
Transform::from_xyz(0.0, 0.0, -5.0),
ParallaxDistance(5.0), ParallaxDistance(5.0),
children![(Text2d::new("Parallax Distance: 5"), TextColor(BLACK.into()), Transform::from_xyz(150.0, 0.0, 0.0))],
)); ));
commands.spawn(( commands.spawn((
Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))), Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))),
MeshMaterial2d(materials.add(Color::from(BLUE))), MeshMaterial2d(materials.add(Color::from(BLUE))),
Transform::from_xyz(0.0, 0.0, -10.0),
ParallaxDistance(10.0), ParallaxDistance(10.0),
children![(Text2d::new("Parallax Distance: 10"), TextColor(BLACK.into()), Transform::from_xyz(150.0, -50.0, 0.0))],
)); ));
} }
fn move_camera(keys: Res<ButtonInput<KeyCode>>, mut camera: Single<&mut Transform, With<Camera>>) { fn move_camera(keys: Res<ButtonInput<KeyCode>>, mut camera: Single<&mut Transform, With<Camera>>) {
const SPEED: f32 = 0.1; const SPEED: f32 = 5.0;
if keys.pressed(KeyCode::ArrowLeft) { if keys.pressed(KeyCode::ArrowLeft) {
camera.translation.z += SPEED; camera.translation.x += SPEED;
} else if keys.pressed(KeyCode::ArrowRight) { } else if keys.pressed(KeyCode::ArrowRight) {
camera.translation.z -= SPEED;
} else if keys.pressed(KeyCode::ArrowUp) {
camera.translation.x -= SPEED; camera.translation.x -= SPEED;
}
if keys.pressed(KeyCode::ArrowUp) {
camera.translation.y -= SPEED;
} else if keys.pressed(KeyCode::ArrowDown) { } else if keys.pressed(KeyCode::ArrowDown) {
camera.translation.x += SPEED; camera.translation.y += SPEED;
} }
info!("Position: {:?}", camera.translation); }
#[derive(Event)]
struct CameraMovement(Vec3);
fn track_camera_movement(
mut events: EventWriter<CameraMovement>,
camera: Query<&Transform, (With<Camera>, Changed<Transform>)>,
mut last: Local<Vec3>
) {
camera.iter().for_each(|Transform { translation, .. }| {
events.write(CameraMovement(*last - *translation));
*last = *translation;
});
}
fn parallax(
mut events: EventReader<CameraMovement>,
mut query: Query<(&mut Transform, &ParallaxDistance)>,
) {
events.read().for_each(|CameraMovement(v)| {
query.iter_mut().for_each(|(mut t, ParallaxDistance(d))| {
t.translation -= v / (20.0 / d);
});
});
} }

@ -17,9 +17,8 @@ fn setup_3d(
commands.spawn(( commands.spawn((
Camera::default(), Camera::default(),
Camera3d::default(), Camera3d::default(),
Transform::default().looking_at(Vec3::new(0.0, -1.0, 0.0), Vec3::Y),
AmbientLight { AmbientLight {
brightness: 160.0, brightness: 1280.0,
..default() ..default()
}, },
)); ));
@ -30,7 +29,7 @@ fn setup_3d(
base_color: RED.into(), base_color: RED.into(),
..Default::default() ..Default::default()
})), })),
Transform::from_xyz(0.0, -10.0, 0.0), Transform::from_xyz(0.0, 0.0, -10.0),
)); ));
commands.spawn(( commands.spawn((
@ -39,7 +38,7 @@ fn setup_3d(
base_color: GREEN.into(), base_color: GREEN.into(),
..Default::default() ..Default::default()
})), })),
Transform::from_xyz(0.0, -50.0, 0.0), Transform::from_xyz(0.0, 0.0, -50.0),
)); ));
commands.spawn(( commands.spawn((
@ -48,21 +47,21 @@ fn setup_3d(
base_color: BLUE.into(), base_color: BLUE.into(),
..Default::default() ..Default::default()
})), })),
Transform::from_xyz(0.0, -100.0, 0.0), Transform::from_xyz(0.0, 0.0, -100.0),
)); ));
} }
fn move_camera(keys: Res<ButtonInput<KeyCode>>, mut camera: Single<&mut Transform, With<Camera>>) { fn move_camera(keys: Res<ButtonInput<KeyCode>>, mut camera: Single<&mut Transform, With<Camera>>) {
const SPEED: f32 = 0.1; const SPEED: f32 = 0.1;
if keys.pressed(KeyCode::ArrowLeft) { if keys.pressed(KeyCode::ArrowLeft) {
camera.translation.z += SPEED; camera.translation.x += SPEED;
} else if keys.pressed(KeyCode::ArrowRight) { } else if keys.pressed(KeyCode::ArrowRight) {
camera.translation.z -= SPEED; camera.translation.x -= SPEED;
} }
if keys.pressed(KeyCode::ArrowUp) { if keys.pressed(KeyCode::ArrowUp) {
camera.translation.x -= SPEED; camera.translation.y -= SPEED;
} else if keys.pressed(KeyCode::ArrowDown) { } else if keys.pressed(KeyCode::ArrowDown) {
camera.translation.x += SPEED; camera.translation.y += SPEED;
} }
} }

Loading…
Cancel
Save