|
|
|
|
@ -4,8 +4,9 @@ fn main() {
|
|
|
|
|
App::new()
|
|
|
|
|
.add_plugins(DefaultPlugins)
|
|
|
|
|
.insert_resource(ClearColor(WHITE.into()))
|
|
|
|
|
.add_event::<CameraMovement>()
|
|
|
|
|
.add_systems(Startup, setup_2d)
|
|
|
|
|
.add_systems(Update, move_camera)
|
|
|
|
|
.add_systems(Update, (move_camera, track_camera_movement, parallax))
|
|
|
|
|
.run();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -28,32 +29,64 @@ fn setup_2d(
|
|
|
|
|
commands.spawn((
|
|
|
|
|
Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))),
|
|
|
|
|
MeshMaterial2d(materials.add(Color::from(RED))),
|
|
|
|
|
Transform::from_xyz(0.0, 0.0, -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((
|
|
|
|
|
Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))),
|
|
|
|
|
MeshMaterial2d(materials.add(Color::from(GREEN))),
|
|
|
|
|
Transform::from_xyz(0.0, 0.0, -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((
|
|
|
|
|
Mesh2d(meshes.add(Rectangle::new(100.0, 100.0))),
|
|
|
|
|
MeshMaterial2d(materials.add(Color::from(BLUE))),
|
|
|
|
|
Transform::from_xyz(0.0, 0.0, -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>>) {
|
|
|
|
|
const SPEED: f32 = 0.1;
|
|
|
|
|
const SPEED: f32 = 5.0;
|
|
|
|
|
if keys.pressed(KeyCode::ArrowLeft) {
|
|
|
|
|
camera.translation.z += SPEED;
|
|
|
|
|
camera.translation.x += SPEED;
|
|
|
|
|
} else if keys.pressed(KeyCode::ArrowRight) {
|
|
|
|
|
camera.translation.z -= SPEED;
|
|
|
|
|
} else if keys.pressed(KeyCode::ArrowUp) {
|
|
|
|
|
camera.translation.x -= SPEED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if keys.pressed(KeyCode::ArrowUp) {
|
|
|
|
|
camera.translation.y -= SPEED;
|
|
|
|
|
} 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);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|