diff --git a/readme.md b/readme.md index 6c0bc2b..e6f8498 100644 --- a/readme.md +++ b/readme.md @@ -10,6 +10,14 @@ I've been trying for years to even get close, but I always choke on pathfinding. I'm hoping I can leverage a good navmesh and pathfinding crate combination to do the heavy-lifting for me _plus_ it's a fun excuse to write more Rust. +## Running + +On some AMD wayland systems, you may need to force the `RADV` driver using the ICD loader: + +```shell_session +AMD_VULKAN_ICD=RADV cargo run +``` + # To Do - [ ] Basics (the stuff I can do just about anywhere) diff --git a/src/camera.rs b/src/camera.rs index cec1154..b19e849 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,94 +1,29 @@ -use bevy::{ - prelude::*, - sprite::{MaterialMesh2dBundle, Mesh2dHandle}, - window::PrimaryWindow, -}; - -use crate::player::Player; +use bevy::prelude::*; use bevy::render::camera::Camera as BevyCamera; pub struct CameraPlugin; +#[derive(Component, Debug)] +pub struct CameraTarget; + impl Plugin for CameraPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, spawn) - .add_systems(PostUpdate, focus) - .add_systems(Update, y_sort) - .add_systems(Startup, spawn_crosshair) - .add_systems(Update, rotate_crosshair); + .add_systems(PostUpdate, follow); } } fn spawn(mut commands: Commands) { - let mut bundle = Camera2dBundle::default(); - bundle.projection.scale = 1. / 2.; + let mut bundle = (Camera2dBundle::default(), IsDefaultUiCamera); + bundle.0.projection.scale = 0.5; commands.spawn(bundle); } -#[derive(Component, Debug)] -pub struct Crosshair; - -fn spawn_crosshair( - mut commands: Commands, - mut meshes: ResMut>, - mut materials: ResMut>, +fn follow( + player: Query<&Transform, With>, + mut camera: Query<&mut Transform, (With, Without)>, ) { - let mesh = Mesh2dHandle(meshes.add(Capsule2d::new(3.0, 25.0))); - let material = materials.add(Color::hsl(360. * 1 as f32 / 3 as f32, 0.95, 0.7)); - // let global_transform = GlobalTransform::from_xyz( - // 0.0, 20.0, - // // TODO: need some way to ensure this draws above everything else? - // // a UI layer or something? - // 1000., - // ); - - let transform = Transform::from_xyz( - 0.0, 0.0, - // TODO: need some way to ensure this draws above everything else? - // a UI layer or something? - 1000., - ); - - commands.spawn(( - Crosshair, - MaterialMesh2dBundle { - // global_transform, - mesh, - material, - transform, - ..default() - }, - )); -} - -fn focus( - player: Query<&Transform, With>, - mut camera: Query<&mut Transform, (With, Without)>, -) { - let newpos = player.single().translation; - // println!("Cam pos: {newpos}"); - camera.single_mut().translation = newpos -} - -fn y_sort(mut q: Query<&mut Transform>) { - q.iter_mut() - .for_each(|mut tf| tf.translation.z = -tf.translation.y) -} - -fn rotate_crosshair( - mut q: Query<&mut Transform, With>, - win: Query<&Window, With>, - q_cam: Query<(&Camera, &GlobalTransform), With>, -) { - let (camera, camera_transform) = q_cam.single(); - if let Some(world_position) = win - .single() - .cursor_position() - .and_then(|cursor| camera.viewport_to_world(&GlobalTransform::from_xyz(0., 0., 0.), cursor)) - .map(|ray| ray.origin.truncate()) - { - let mut t = q.single_mut(); - t.look_at(Vec3::ZERO, world_position.extend(0.)); - t.translation = camera_transform.translation(); + if let Ok(player) = player.get_single() { + camera.single_mut().translation = player.translation } } diff --git a/src/main.rs b/src/main.rs index 49cf346..8587e79 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,10 +16,11 @@ fn main() { .set(WindowPlugin { primary_window: Some(Window { title: "Kodo Tag".into(), - resolution: (640. * 2., 360. * 2.).into(), - ..Default::default() + mode: bevy::window::WindowMode::BorderlessFullscreen, + // resolution: (640. * 2., 360. * 2.).into(), + ..default() }), - ..Default::default() + ..default() }) .set(AudioPlugin { default_spatial_scale: SpatialScale::new_2d(1.), @@ -36,7 +37,8 @@ fn main() { main_menu::MainMenu, movement::Movement, )) - .insert_resource(ClearColor(Color::rgb(0.3, 0., 0.5))) + .add_systems(Update, exit_on_escape) + .insert_resource(ClearColor(Color::rgb(0.1, 0., 0.3))) .insert_resource(AmbientLight { color: Color::rgb(1., 1., 1.), brightness: 1., @@ -44,3 +46,12 @@ fn main() { app.run() } + +fn exit_on_escape( + keyboard_input: Res>, + mut app_exit_events: ResMut>, +) { + if keyboard_input.pressed(KeyCode::Escape) { + app_exit_events.send(bevy::app::AppExit); + } +} diff --git a/src/movement.rs b/src/movement.rs index 11ca09c..db75d3c 100644 --- a/src/movement.rs +++ b/src/movement.rs @@ -16,8 +16,14 @@ fn update_position(mut query: Query<(&Velocity, &mut Transform)>, time: Res