More minor cleanup, remove pitch control, embiggen sphere.
This commit is contained in:
parent
614e457aa7
commit
768bdf67ad
4 changed files with 38 additions and 48 deletions
|
@ -57,16 +57,6 @@ fn falling_cat(time: Res<Time>, mut bike_query: Query<&mut Transform, With<Cyber
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn apply_velocity(time: Res<Time>, mut bike_query: Query<(&mut Transform, &CyberBikeState)>) {
|
|
||||||
let dt = time.delta_seconds();
|
|
||||||
|
|
||||||
let (mut bike_xform, state) = bike_query.single_mut();
|
|
||||||
|
|
||||||
if state.velocity.is_finite() {
|
|
||||||
bike_xform.translation += state.velocity * dt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update_velocity(
|
fn update_velocity(
|
||||||
time: Res<Time>,
|
time: Res<Time>,
|
||||||
settings: Res<MovementSettings>,
|
settings: Res<MovementSettings>,
|
||||||
|
@ -110,6 +100,34 @@ fn update_velocity(
|
||||||
state.velocity = vel;
|
state.velocity = vel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn apply_velocity(time: Res<Time>, mut bike_query: Query<(&mut Transform, &CyberBikeState)>) {
|
||||||
|
let dt = time.delta_seconds();
|
||||||
|
|
||||||
|
let (mut bike_xform, state) = bike_query.single_mut();
|
||||||
|
|
||||||
|
if state.velocity.is_finite() {
|
||||||
|
bike_xform.translation += state.velocity * dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn steer_cyberbike(
|
||||||
|
settings: Res<MovementSettings>,
|
||||||
|
windows: Res<Windows>,
|
||||||
|
time: Res<Time>,
|
||||||
|
istate: Res<InputState>,
|
||||||
|
mut query: Query<&mut Transform, With<CyberBike>>,
|
||||||
|
) {
|
||||||
|
let window = windows.get_primary().unwrap();
|
||||||
|
let window_scale = window.height().min(window.width());
|
||||||
|
let dt = time.delta_seconds();
|
||||||
|
let mut transform = query.single_mut();
|
||||||
|
|
||||||
|
let d_yaw = (settings.sensitivity * dt * window_scale * istate.yaw).to_radians();
|
||||||
|
let rotation = Quat::from_axis_angle(transform.local_y(), d_yaw);
|
||||||
|
|
||||||
|
transform.rotate(rotation);
|
||||||
|
}
|
||||||
|
|
||||||
fn collisions(
|
fn collisions(
|
||||||
mut events: EventReader<CollisionEvent>,
|
mut events: EventReader<CollisionEvent>,
|
||||||
mut query: Query<(&Transform, &mut CyberBikeState)>,
|
mut query: Query<(&Transform, &mut CyberBikeState)>,
|
||||||
|
@ -142,6 +160,7 @@ impl Plugin for CyberPhysicsPlugin {
|
||||||
.add_system(collisions)
|
.add_system(collisions)
|
||||||
.add_system(falling_cat)
|
.add_system(falling_cat)
|
||||||
.add_system(update_velocity)
|
.add_system(update_velocity)
|
||||||
|
.add_system(steer_cyberbike)
|
||||||
.add_system(apply_velocity);
|
.add_system(apply_velocity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::geometry::{CyberBike, SPAWN_ALTITUDE};
|
||||||
action::MovementSettings,
|
|
||||||
geometry::{CyberBike, SPAWN_ALTITUDE},
|
|
||||||
input::InputState,
|
|
||||||
};
|
|
||||||
|
|
||||||
pub(crate) const CAM_DIST: f32 = 15.0;
|
pub(crate) const CAM_DIST: f32 = 15.0;
|
||||||
|
|
||||||
|
@ -21,7 +17,7 @@ fn setup_cybercam(mut commands: Commands) {
|
||||||
.insert(CyberCam);
|
.insert(CyberCam);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn follow_player(
|
fn follow_cyberbike(
|
||||||
bike_query: Query<&Transform, (Without<CyberCam>, With<CyberBike>)>,
|
bike_query: Query<&Transform, (Without<CyberCam>, With<CyberBike>)>,
|
||||||
mut cam_query: Query<&mut Transform, (With<CyberCam>, Without<CyberBike>)>,
|
mut cam_query: Query<&mut Transform, (With<CyberCam>, Without<CyberBike>)>,
|
||||||
) {
|
) {
|
||||||
|
@ -36,31 +32,10 @@ fn follow_player(
|
||||||
cam_xform.look_at(look_at, up);
|
cam_xform.look_at(look_at, up);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn player_look(
|
|
||||||
settings: Res<MovementSettings>,
|
|
||||||
windows: Res<Windows>,
|
|
||||||
time: Res<Time>,
|
|
||||||
istate: Res<InputState>,
|
|
||||||
mut query: Query<&mut Transform, With<CyberBike>>,
|
|
||||||
) {
|
|
||||||
let window = windows.get_primary().unwrap();
|
|
||||||
let window_scale = window.height().min(window.width());
|
|
||||||
let dt = time.delta_seconds();
|
|
||||||
let mut transform = query.single_mut();
|
|
||||||
|
|
||||||
let d_pitch = (settings.sensitivity * dt * window_scale * istate.pitch).to_radians();
|
|
||||||
let d_yaw = (settings.sensitivity * dt * window_scale * istate.yaw).to_radians();
|
|
||||||
let rotation = Quat::from_axis_angle(transform.local_y(), d_yaw)
|
|
||||||
* Quat::from_axis_angle(transform.local_x(), d_pitch);
|
|
||||||
|
|
||||||
transform.rotate(rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct CyberCamPlugin;
|
pub struct CyberCamPlugin;
|
||||||
impl Plugin for CyberCamPlugin {
|
impl Plugin for CyberCamPlugin {
|
||||||
fn build(&self, app: &mut bevy::prelude::App) {
|
fn build(&self, app: &mut bevy::prelude::App) {
|
||||||
app.add_startup_system(setup_cybercam)
|
app.add_startup_system(setup_cybercam)
|
||||||
.add_system(follow_player)
|
.add_system(follow_cyberbike);
|
||||||
.add_system(player_look);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use heron::prelude::{CollisionShape, RigidBody};
|
use heron::prelude::{CollisionShape, RigidBody};
|
||||||
|
|
||||||
pub const PLANET_RADIUS: f32 = 150.0;
|
pub const PLANET_RADIUS: f32 = 350.0;
|
||||||
pub(crate) const SPAWN_ALTITUDE: f32 = PLANET_RADIUS + 100.0;
|
pub(crate) const SPAWN_ALTITUDE: f32 = PLANET_RADIUS + 100.0;
|
||||||
|
|
||||||
#[derive(Component, Debug)]
|
#[derive(Component, Debug)]
|
||||||
|
@ -19,7 +19,7 @@ fn spawn_giant_sphere(
|
||||||
.spawn_bundle(PbrBundle {
|
.spawn_bundle(PbrBundle {
|
||||||
mesh: meshes.add(Mesh::from(shape::Icosphere {
|
mesh: meshes.add(Mesh::from(shape::Icosphere {
|
||||||
radius: PLANET_RADIUS,
|
radius: PLANET_RADIUS,
|
||||||
subdivisions: 6,
|
subdivisions: 8,
|
||||||
})),
|
})),
|
||||||
material: materials.add(StandardMaterial {
|
material: materials.add(StandardMaterial {
|
||||||
base_color: Color::GRAY,
|
base_color: Color::GRAY,
|
||||||
|
|
12
src/input.rs
12
src/input.rs
|
@ -1,18 +1,15 @@
|
||||||
use bevy::{
|
use bevy::{
|
||||||
app::{Events, ManualEventReader},
|
app::{Events, ManualEventReader},
|
||||||
prelude::{
|
prelude::*,
|
||||||
info, App, GamepadAxisType, GamepadButtonType, GamepadEvent, GamepadEventType, Plugin, Res,
|
|
||||||
ResMut,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub(crate) struct InputState {
|
pub(crate) struct InputState {
|
||||||
event_reader: ManualEventReader<GamepadEvent>,
|
event_reader: ManualEventReader<GamepadEvent>,
|
||||||
pub pitch: f32,
|
|
||||||
pub yaw: f32,
|
pub yaw: f32,
|
||||||
pub throttle: f32,
|
pub throttle: f32,
|
||||||
pub brake: bool,
|
pub brake: bool,
|
||||||
|
pub _pitch: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState>) {
|
fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState>) {
|
||||||
|
@ -34,9 +31,8 @@ fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState
|
||||||
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickX, val) => {
|
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickX, val) => {
|
||||||
istate.yaw = -val;
|
istate.yaw = -val;
|
||||||
}
|
}
|
||||||
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickY, val) => {
|
// ignore spurious vertical movement for now
|
||||||
istate.pitch = -val;
|
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickY, _) => {}
|
||||||
}
|
|
||||||
_ => {
|
_ => {
|
||||||
info!("unhandled gamepad event: {:?}", ev);
|
info!("unhandled gamepad event: {:?}", ev);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue