From 01251d735abda4fd8f0a4377c7c180463ba6533f Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Wed, 24 Jul 2024 17:03:22 -0500 Subject: [PATCH] Someday --- src/camera.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/main.rs | 2 +- src/player.rs | 2 +- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/camera.rs b/src/camera.rs index 965a7bf..cec1154 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,15 +1,21 @@ -use bevy::prelude::*; +use bevy::{ + prelude::*, + sprite::{MaterialMesh2dBundle, Mesh2dHandle}, + window::PrimaryWindow, +}; use crate::player::Player; use bevy::render::camera::Camera as BevyCamera; -pub struct Camera; +pub struct CameraPlugin; -impl Plugin for Camera { +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(Update, y_sort) + .add_systems(Startup, spawn_crosshair) + .add_systems(Update, rotate_crosshair); } } @@ -19,6 +25,42 @@ fn spawn(mut commands: Commands) { commands.spawn(bundle); } +#[derive(Component, Debug)] +pub struct Crosshair; + +fn spawn_crosshair( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + 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)>, @@ -32,3 +74,21 @@ 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(); + } +} diff --git a/src/main.rs b/src/main.rs index 0559e75..49cf346 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,7 +30,7 @@ fn main() { ) .add_plugins(( statue::Statue, - camera::Camera, + camera::CameraPlugin, assets::AssetPlugin, player::Player, main_menu::MainMenu, diff --git a/src/player.rs b/src/player.rs index 495e650..418c139 100644 --- a/src/player.rs +++ b/src/player.rs @@ -29,7 +29,7 @@ fn spawn_player(mut commands: Commands, assets: Res, asset_server: texture, atlas: assets.images.player.clone().into(), sprite: Sprite::default(), - ..Default::default() + ..default() }, Mover { velocity: Velocity(Vec2::ZERO),