Add dialog scrolling, docstrings on systems

main
Elijah Voigt 4 months ago
parent 04777a4e33
commit f4ad2cd955

@ -47,6 +47,8 @@
# Rustup # Rustup
rustup rustup
wayland # To use the wayland feature wayland # To use the wayland feature
# Bug tracking
git-bug
]; ];
LD_LIBRARY_PATH = lib.makeLibraryPath [ LD_LIBRARY_PATH = lib.makeLibraryPath [
alsa-lib alsa-lib

@ -12,14 +12,22 @@ fn main() {
) )
.add_systems( .add_systems(
Update, Update,
(
dialog_engine.run_if(input_just_pressed(KeyCode::KeyN)), dialog_engine.run_if(input_just_pressed(KeyCode::KeyN)),
mouse_wheel_scroll.run_if(on_event::<MouseWheel>),
auto_scroll.run_if(any_component_added::<DialogOption>)
),
) )
.run(); .run();
} }
/// Tree marker component
#[derive(Component)] #[derive(Component)]
struct Tree; struct Tree;
/// Initialize the trees, currently placeholders
/// Trees are 2d cards in a 3d world for flexibility
/// Might move fully 2d if the art style allows it
fn init_trees( fn init_trees(
mut commands: Commands, mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>, mut meshes: ResMut<Assets<Mesh>>,
@ -88,9 +96,11 @@ fn init_trees(
} }
} }
/// Dialog box marker component
#[derive(Component)] #[derive(Component)]
struct DialogBox; struct DialogBox;
/// Initialize the UI which consists soley of a dialog box (for now?)
fn init_ui(mut commands: Commands) { fn init_ui(mut commands: Commands) {
commands.spawn(( commands.spawn((
DialogBox, DialogBox,
@ -104,11 +114,15 @@ fn init_ui(mut commands: Commands) {
margin: UiRect::all(Val::Percent(1.0)), margin: UiRect::all(Val::Percent(1.0)),
padding: UiRect::all(Val::Percent(1.0)), padding: UiRect::all(Val::Percent(1.0)),
flex_direction: FlexDirection::Column, flex_direction: FlexDirection::Column,
// Scroll on the Y axis
overflow: Overflow::scroll_y(),
..default() ..default()
}, },
)); ));
} }
/// On startup move the camera to a suitable position
/// This should be mostly static for the entire game
fn position_camera(mut query: Query<&mut Transform, (With<Camera>, With<Camera3d>)>) { fn position_camera(mut query: Query<&mut Transform, (With<Camera>, With<Camera3d>)>) {
use std::f32::consts::PI; use std::f32::consts::PI;
@ -118,12 +132,15 @@ fn position_camera(mut query: Query<&mut Transform, (With<Camera>, With<Camera3d
}) })
} }
/// A possible line of dialog the user can choose
#[derive(Component)] #[derive(Component)]
struct DialogOption; struct DialogOption;
/// A line of dialog which has been chosen, so is permanent
#[derive(Component)] #[derive(Component)]
struct DialogLine; struct DialogLine;
/// System which puts DialogOptions into the DialogBox
fn dialog_engine( fn dialog_engine(
mut commands: Commands, mut commands: Commands,
dialog_box: Single<Entity, With<DialogBox>>, dialog_box: Single<Entity, With<DialogBox>>,
@ -152,6 +169,10 @@ fn dialog_engine(
*idx += 1; *idx += 1;
} }
/// When a dialog option is chosen (clicked on) we do the following:
/// 1. Remove the Button and DialogOption components from that entity
/// 2. Insert the DialogLine component to that entity
/// 3. Remove all other DialogOptions from the DialogBox
fn choose_dialog(trigger: Trigger<Pointer<Click>>, mut commands: Commands) { fn choose_dialog(trigger: Trigger<Pointer<Click>>, mut commands: Commands) {
info!("Choosing dialog {:?}", trigger.target()); info!("Choosing dialog {:?}", trigger.target());
commands commands
@ -160,3 +181,31 @@ fn choose_dialog(trigger: Trigger<Pointer<Click>>, mut commands: Commands) {
.remove::<DialogOption>() .remove::<DialogOption>()
.insert(DialogLine); .insert(DialogLine);
} }
/// Allows user to scroll (with mouse whell) through old dialog
fn mouse_wheel_scroll(
mut events: EventReader<MouseWheel>,
mut scroll_position: Query<&mut ScrollPosition>,
) {
events.read().for_each(|MouseWheel { unit, y, .. }| {
let offset_y = match unit {
MouseScrollUnit::Line => 10.0 * y,
MouseScrollUnit::Pixel => 1.0 * y,
};
scroll_position
.iter_mut()
.for_each(|mut pos| pos.offset_y += offset_y);
});
}
/// Automatically scrolls dialog when a new batch of options are added
fn auto_scroll(
added: Query<Entity, Added<DialogOption>>,
mut scroll_positions: Query<&mut ScrollPosition>,
) {
debug_assert!(!added.is_empty(), "Should only scroll when dialog options are added");
scroll_positions.iter_mut().for_each(|mut sp| {
sp.offset_y = f32::MAX;
});
}

@ -12,8 +12,13 @@ pub use std::fmt::Display;
pub use bevy::{ pub use bevy::{
asset::LoadState, asset::LoadState,
color::palettes::css::{BLACK, BLUE, GREEN, RED, WHITE}, color::palettes::css::{BLACK, BLUE, GREEN, RED, WHITE},
input::common_conditions::{input_just_pressed, input_pressed}, input::{
input::{ButtonState, keyboard::KeyboardInput, mouse::MouseMotion}, ButtonState,
common_conditions::{input_just_pressed, input_pressed},
keyboard::KeyboardInput,
mouse::MouseMotion,
mouse::{MouseScrollUnit, MouseWheel},
},
prelude::*, prelude::*,
}; };
pub use bevy_rapier3d::prelude::*; pub use bevy_rapier3d::prelude::*;

Loading…
Cancel
Save