Parallax3d with on-screen buttons

main
Elijah Voigt 1 month ago
parent a17ae88a9f
commit 3edb3687cb

@ -3,6 +3,14 @@ name = "games"
version = "0.1.0"
edition = "2024"
[[example]]
name = "demo_parallax2d"
path = "examples/demos/parallax2d.rs"
[[example]]
name = "demo_parallax3d"
path = "examples/demos/parallax3d.rs"
[features]
hide_debug = []

@ -31,7 +31,11 @@ fn setup_2d(
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))],
children![(
Text2d::new("Parallax Distance: 1"),
TextColor(BLACK.into()),
Transform::from_xyz(150.0, 50.0, 0.0)
)],
));
commands.spawn((
@ -39,7 +43,11 @@ fn setup_2d(
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))],
children![(
Text2d::new("Parallax Distance: 5"),
TextColor(BLACK.into()),
Transform::from_xyz(150.0, 0.0, 0.0)
)],
));
commands.spawn((
@ -47,7 +55,11 @@ fn setup_2d(
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))],
children![(
Text2d::new("Parallax Distance: 10"),
TextColor(BLACK.into()),
Transform::from_xyz(150.0, -50.0, 0.0)
)],
));
}
@ -72,7 +84,7 @@ struct CameraMovement(Vec3);
fn track_camera_movement(
mut events: EventWriter<CameraMovement>,
camera: Query<&Transform, (With<Camera>, Changed<Transform>)>,
mut last: Local<Vec3>
mut last: Local<Vec3>,
) {
camera.iter().for_each(|Transform { translation, .. }| {
events.write(CameraMovement(*last - *translation));

@ -0,0 +1,138 @@
use bevy::{color::palettes::css::*, prelude::*};
fn main() {
App::new()
.add_plugins(DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
resolution: (640.0, 480.0).into(),
..default()
}),
..default()
}))
.insert_resource(ClearColor(WHITE.into()))
.add_systems(Startup, setup_3d)
.add_systems(Update, (move_camera_buttons, button_color))
.run();
}
fn setup_3d(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn((
Camera::default(),
Camera3d::default(),
AmbientLight {
brightness: 1280.0,
..default()
},
));
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: RED.into(),
..Default::default()
})),
Transform::from_xyz(0.0, 0.0, -5.0),
));
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: GREEN.into(),
..Default::default()
})),
Transform::from_xyz(0.0, 0.0, -10.0),
));
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: BLUE.into(),
..Default::default()
})),
Transform::from_xyz(0.0, 0.0, -20.0),
));
commands
.spawn(Node {
align_self: AlignSelf::End,
justify_self: JustifySelf::Center,
..default()
})
.with_children(|parent| {
parent.spawn((
Node {
padding: UiRect::all(Val::Px(20.0)),
margin: UiRect::all(Val::Px(10.0)),
..default()
},
Button,
children![
Text::new("<-"),
Node {
align_self: AlignSelf::Center,
justify_self: JustifySelf::Center,
..default()
},
],
Movement(0.1),
BackgroundColor(ORANGE.into()),
));
parent.spawn((
Node {
align_self: AlignSelf::Center,
justify_self: JustifySelf::Center,
..default()
},
Text::new("movement"),
TextColor(BLACK.into()),
));
parent.spawn((
Node {
padding: UiRect::all(Val::Px(20.0)),
margin: UiRect::all(Val::Px(10.0)),
..default()
},
Button,
children![
Text::new("->"),
Node {
align_self: AlignSelf::Center,
justify_self: JustifySelf::Center,
..default()
},
],
Movement(-0.1),
BackgroundColor(ORANGE.into()),
));
});
}
fn button_color(
mut query: Query<(&Interaction, &mut BackgroundColor), (Changed<Interaction>, With<Button>)>,
) {
query.iter_mut().for_each(|(i, mut bg)| {
bg.0 = match i {
Interaction::None => ORANGE.into(),
Interaction::Hovered => ORANGE_RED.into(),
Interaction::Pressed => RED.into(),
};
});
}
#[derive(Component)]
struct Movement(f32);
fn move_camera_buttons(
query: Query<(&Interaction, &Movement), With<Button>>,
mut camera: Single<&mut Transform, With<Camera>>,
) {
query.iter().for_each(|(i, m)| {
if let (Interaction::Pressed, Movement(speed)) = (i, m) {
camera.translation.x += speed;
}
});
}

@ -1,67 +0,0 @@
use bevy::{color::palettes::css::*, prelude::*};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(ClearColor(WHITE.into()))
.add_systems(Startup, setup_3d)
.add_systems(Update, move_camera)
.run();
}
fn setup_3d(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn((
Camera::default(),
Camera3d::default(),
AmbientLight {
brightness: 1280.0,
..default()
},
));
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: RED.into(),
..Default::default()
})),
Transform::from_xyz(0.0, 0.0, -10.0),
));
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: GREEN.into(),
..Default::default()
})),
Transform::from_xyz(0.0, 0.0, -50.0),
));
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
MeshMaterial3d(materials.add(StandardMaterial {
base_color: BLUE.into(),
..Default::default()
})),
Transform::from_xyz(0.0, 0.0, -100.0),
));
}
fn move_camera(keys: Res<ButtonInput<KeyCode>>, mut camera: Single<&mut Transform, With<Camera>>) {
const SPEED: f32 = 0.1;
if keys.pressed(KeyCode::ArrowLeft) {
camera.translation.x += SPEED;
} else if keys.pressed(KeyCode::ArrowRight) {
camera.translation.x -= SPEED;
}
if keys.pressed(KeyCode::ArrowUp) {
camera.translation.y -= SPEED;
} else if keys.pressed(KeyCode::ArrowDown) {
camera.translation.y += SPEED;
}
}

@ -1,7 +1,7 @@
use avian3d::math::Vector;
// TEMP
use bevy::{color::palettes::css::*, prelude::*};
use avian2d::prelude::*;
use bevy::{color::palettes::css::*, prelude::*};
fn main() {
App::new()
@ -12,7 +12,10 @@ fn main() {
.add_systems(Update, move_player)
.add_systems(Update, follow_player)
.add_systems(Update, draw_gizmos)
.add_systems(Update, event_detection.run_if(on_event::<CollisionStarted>.or(on_event::<CollisionEnded>)))
.add_systems(
Update,
event_detection.run_if(on_event::<CollisionStarted>.or(on_event::<CollisionEnded>)),
)
.add_observer(set_tree_position)
.run();
}
@ -49,7 +52,7 @@ fn setup(
.for_each(|(label, pos)| {
commands.spawn((
RigidBody::Static,
Collider::rectangle(100.0, 250.0),
Collider::rectangle(100.0, 250.0),
Mesh2d(meshes.add(Rectangle::new(100.0, 250.0))),
MeshMaterial2d(materials.add(Color::from(GREEN))),
TreePos(*pos),

Loading…
Cancel
Save