Crosshair aims 🎉
This commit is contained in:
parent
d05fc09e8a
commit
7bf8602796
|
@ -22,13 +22,13 @@ bevy = { version = "0.14.0", default-features = false, features = [
|
||||||
"wayland",
|
"wayland",
|
||||||
"wav", # sound files
|
"wav", # sound files
|
||||||
"sysinfo_plugin", # probably will want this for troubleshooting or just surfacing useful information to the gamer (such as FPS?)
|
"sysinfo_plugin", # probably will want this for troubleshooting or just surfacing useful information to the gamer (such as FPS?)
|
||||||
|
"bevy_gizmos", # debug geometry?
|
||||||
|
|
||||||
# TODO: would be nice to get this working while developing
|
# TODO: would be nice to get this working while developing
|
||||||
"dynamic_linking",
|
"dynamic_linking",
|
||||||
|
|
||||||
# NOTE: Features we may want at some point.
|
# NOTE: Features we may want at some point.
|
||||||
# "vorbis", # music -- maybe mp3?
|
# "vorbis", # music -- maybe mp3?
|
||||||
# "bevy_gizmos", # debug geometry?
|
|
||||||
# "track_change_detection", # for hot-reloading of assets? (scripts?)
|
# "track_change_detection", # for hot-reloading of assets? (scripts?)
|
||||||
# "file_watcher", # for hot-reloading of assets? (scripts?)
|
# "file_watcher", # for hot-reloading of assets? (scripts?)
|
||||||
# "serialize" # for saving games or game-related information?
|
# "serialize" # for saving games or game-related information?
|
||||||
|
|
36
src/input.rs
36
src/input.rs
|
@ -1,4 +1,8 @@
|
||||||
use bevy::prelude::*;
|
use bevy::{
|
||||||
|
color::palettes::css::{GREEN, RED},
|
||||||
|
prelude::*,
|
||||||
|
window::PrimaryWindow,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Resource, Default, Debug, Clone, PartialEq)]
|
#[derive(Resource, Default, Debug, Clone, PartialEq)]
|
||||||
pub struct Input {
|
pub struct Input {
|
||||||
|
@ -9,9 +13,11 @@ pub struct Input {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_input(
|
pub fn process_input(
|
||||||
|
mut gizmos: Gizmos,
|
||||||
mut input: ResMut<Input>,
|
mut input: ResMut<Input>,
|
||||||
keys: Res<ButtonInput<KeyCode>>,
|
keys: Res<ButtonInput<KeyCode>>,
|
||||||
// mouse: Res<ButtonInput<MouseButton>>,
|
// mouse: Res<ButtonInput<MouseButton>>,
|
||||||
|
window: Query<&Window, With<PrimaryWindow>>,
|
||||||
) {
|
) {
|
||||||
input.movement.x = 0.;
|
input.movement.x = 0.;
|
||||||
input.movement.y = 0.;
|
input.movement.y = 0.;
|
||||||
|
@ -33,10 +39,36 @@ pub fn process_input(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input.movement = input.movement.normalize_or_zero();
|
input.movement = input.movement.normalize_or_zero();
|
||||||
// input.target // not set using keyboard, see mouse
|
|
||||||
input.action = input.action || keys.any_pressed([KeyCode::Space, KeyCode::Enter]);
|
input.action = input.action || keys.any_pressed([KeyCode::Space, KeyCode::Enter]);
|
||||||
input.cancel = input.cancel || keys.just_pressed(KeyCode::Escape);
|
input.cancel = input.cancel || keys.just_pressed(KeyCode::Escape);
|
||||||
|
|
||||||
|
// FOR CURSOR POSITION
|
||||||
|
// origin is top-left
|
||||||
|
// x increases as mouse goes right
|
||||||
|
// y increases as mouse goes down
|
||||||
|
|
||||||
|
// FOR 2D WORLD COORDINATE
|
||||||
|
// origin is bottom-left
|
||||||
|
// x increases as thing moves right
|
||||||
|
// y increases as thing moves up
|
||||||
|
|
||||||
|
// with this in mind, to convert mouse coordinates to world coordinates for comparing against our logical window center, we take the absolute of the difference in height
|
||||||
|
|
||||||
|
gizmos.line(Vec3::ZERO, Vec3::X * 100., GREEN);
|
||||||
|
if let Ok(window) = window.get_single() {
|
||||||
|
if let Some(target) = window.cursor_position() {
|
||||||
|
let size = window.size();
|
||||||
|
let center = size / 2.;
|
||||||
|
let modified_target = target.with_y(size.y - target.y) - center;
|
||||||
|
gizmos.line(Vec2::ZERO.extend(0.), modified_target.extend(0.), RED);
|
||||||
|
input.angle = modified_target.to_angle();
|
||||||
|
info!(
|
||||||
|
"pos@{target:?} -- {center:?} -> {modified_target:?} for angle of {:?}",
|
||||||
|
input.angle
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
info!("Input: {:#?}", input);
|
info!("Input: {:#?}", input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::f32::consts::TAU;
|
||||||
|
|
||||||
use crate::camera::Watched;
|
use crate::camera::Watched;
|
||||||
use crate::movement::{Heading, Mover, Speed, Velocity, YSortable};
|
use crate::movement::{Heading, Mover, Speed, Velocity, YSortable};
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
@ -89,10 +91,18 @@ pub fn startup(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn control(input: Res<Input>, mut player: Query<&mut Heading, With<Player>>) {
|
pub fn control(
|
||||||
|
input: Res<Input>,
|
||||||
|
mut crosshair: Query<&mut Transform, With<Crosshair>>,
|
||||||
|
mut player: Query<&mut Heading, With<Player>>,
|
||||||
|
// time: Res<Time>,
|
||||||
|
) {
|
||||||
if let Ok(mut heading) = player.get_single_mut() {
|
if let Ok(mut heading) = player.get_single_mut() {
|
||||||
heading.0 = input.movement;
|
heading.0 = input.movement;
|
||||||
}
|
}
|
||||||
|
if let Ok(mut transform) = crosshair.get_single_mut() {
|
||||||
|
transform.rotation = Quat::from_rotation_z(input.angle + (TAU / 4.));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn player_debug_info(mut player: Query<(&Heading, &Transform), With<Player>>) {
|
pub fn player_debug_info(mut player: Query<(&Heading, &Transform), With<Player>>) {
|
||||||
|
|
Loading…
Reference in a new issue