123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- use bevy::prelude::*;
- #[derive(Component)]
- struct Mover;
- fn main() {
- App::new()
- .insert_resource(Movement { dx: 0.0, dy: 0.0 })
- .add_plugins(DefaultPlugins)
- .add_systems(Startup, setup)
- .add_systems(Update, (input, decay, movement))
- .run();
- }
- fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
- commands.spawn((
- Camera3dBundle {
- transform: Transform::from_xyz(0.0, 12.0, 18.0).looking_at(Vec3::ZERO, Vec3::Y),
- ..default()
- },
- Mover,
- ));
- commands.spawn(PointLightBundle {
- point_light: PointLight {
- shadows_enabled: true,
- ..default()
- },
- transform: Transform::from_xyz(4.0, 8.0, 4.0),
- ..default()
- });
- for x in 0..24 {
- for y in 0..24 {
- let x = x - 12;
- let y = y - 12;
- let z = if x == -12 || x == 11 || y == -12 || y == 11 || rand::random::<f32>() < 0.25 {
- 0.0
- } else {
- -2.0
- };
- let rotation = match rand::random::<u8>() % 4 {
- 0 => 0.0,
- 1 => 0.5,
- 2 => 1.0,
- _ => 1.5,
- } * std::f32::consts::PI;
- commands.spawn(SceneBundle {
- scene: asset_server.load("test-cube.glb#Scene0"),
- transform: Transform::from_xyz((x * 2) as f32, z, (y * 2) as f32)
- .with_rotation(Quat::from_rotation_y(rotation)),
- ..default()
- });
- }
- }
- }
- #[derive(Debug, Resource)]
- struct Movement {
- dx: f32,
- dy: f32,
- }
- impl Default for Movement {
- fn default() -> Movement {
- Movement { dx: 0.0, dy: 0.0 }
- }
- }
- const ACCEL: f32 = 0.002;
- fn input(keyboard: Res<ButtonInput<KeyCode>>, mut mvmt: ResMut<Movement>) {
- if keyboard.pressed(KeyCode::ArrowUp) {
- mvmt.dy = (mvmt.dy - ACCEL).clamp(-0.5, 0.5);
- }
- if keyboard.pressed(KeyCode::ArrowDown) {
- mvmt.dy = (mvmt.dy + ACCEL).clamp(-0.5, 0.5);
- }
- if keyboard.pressed(KeyCode::ArrowLeft) {
- mvmt.dx = (mvmt.dx - ACCEL).clamp(-0.5, 0.5);
- }
- if keyboard.pressed(KeyCode::ArrowRight) {
- mvmt.dx = (mvmt.dx + ACCEL).clamp(-0.5, 0.5);
- }
- }
- fn decay(mut mvmt: ResMut<Movement>) {
- if mvmt.dx.abs() < 0.001 {
- mvmt.dx = 0.0;
- } else {
- mvmt.dx *= 0.90;
- }
- if mvmt.dy.abs() < 0.001 {
- mvmt.dy = 0.0;
- } else {
- mvmt.dy *= 0.90;
- }
- }
- fn movement(mut query: Query<&mut Transform, With<Mover>>, mvmt: Res<Movement>, time: Res<Time>) {
- if time.delta_seconds() == 0.0 {
- return;
- }
- for mut transform in &mut query {
- transform.translation += Vec3::new(
- mvmt.dx / time.delta_seconds(),
- 0.0,
- mvmt.dy / time.delta_seconds(),
- );
- }
- }
|