generated from tipragot/rust
Add the ownership system #96
|
@ -46,7 +46,11 @@ impl Plugin for CameraPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.add_systems(Startup, init_camera)
|
app.add_systems(Startup, init_camera)
|
||||||
.add_systems(Startup, init_resources_for_camera)
|
.add_systems(Startup, init_resources_for_camera)
|
||||||
.add_systems(Update, movement_system.run_if(in_state(CurrentScene::Game)))
|
.add_systems(
|
||||||
|
Update,
|
||||||
|
(keyboard_movement_system, mouse_movement_system)
|
||||||
|
.run_if(in_state(CurrentScene::Game)),
|
||||||
|
)
|
||||||
.add_systems(Update, scale_system.run_if(in_state(CurrentScene::Game)));
|
.add_systems(Update, scale_system.run_if(in_state(CurrentScene::Game)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,7 +82,7 @@ fn init_resources_for_camera(mut commands: Commands) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Moves the camera with keyboard input.
|
/// Moves the camera with keyboard input.
|
||||||
fn movement_system(
|
fn keyboard_movement_system(
|
||||||
mut query: Query<&mut Transform, With<Camera>>,
|
mut query: Query<&mut Transform, With<Camera>>,
|
||||||
keys: Res<Input<KeyCode>>,
|
keys: Res<Input<KeyCode>>,
|
||||||
keys_settings: Res<KeysMovementSettings>,
|
keys_settings: Res<KeysMovementSettings>,
|
||||||
|
@ -100,6 +104,35 @@ fn movement_system(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Moves the camera with mouse input.
|
||||||
|
fn mouse_movement_system(
|
||||||
|
mouse_button_input: Res<Input<MouseButton>>,
|
||||||
|
mut query: Query<&mut Transform, With<Camera>>,
|
||||||
|
windows: Query<&Window>,
|
||||||
|
mut last_position: Local<Option<Vec2>>,
|
||||||
|
) {
|
||||||
|
let window = windows.get_single().expect("Main window not found");
|
||||||
|
let Some(position) = window.cursor_position() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
if mouse_button_input.just_pressed(MouseButton::Right) {
|
||||||
|
*last_position = Some(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
if mouse_button_input.just_released(MouseButton::Right) {
|
||||||
|
*last_position = None;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(old_position) = *last_position {
|
||||||
|
for mut transform in query.iter_mut() {
|
||||||
|
let offset = (old_position - position).extend(0.0) * Vec3::new(1., -1., 1.);
|
||||||
|
transform.translation += offset;
|
||||||
|
}
|
||||||
|
*last_position = Some(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Scales the view with mouse input.
|
/// Scales the view with mouse input.
|
||||||
fn scale_system(
|
fn scale_system(
|
||||||
mut scroll_event: EventReader<MouseWheel>,
|
mut scroll_event: EventReader<MouseWheel>,
|
||||||
|
|
|
@ -8,8 +8,8 @@ use serde::{Deserialize, Serialize};
|
||||||
pub mod camera;
|
pub mod camera;
|
||||||
pub mod map;
|
pub mod map;
|
||||||
pub mod networking;
|
pub mod networking;
|
||||||
pub mod responsive_scale;
|
|
||||||
pub mod scenes;
|
pub mod scenes;
|
||||||
|
pub mod ui;
|
||||||
|
|
||||||
/// The current scene of the game.
|
/// The current scene of the game.
|
||||||
#[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash, States)]
|
#[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash, States)]
|
||||||
|
|
|
@ -7,6 +7,7 @@ use border_wars::map::renderer::RendererPlugin;
|
||||||
use border_wars::map::selected_tile::SelectTilePlugin;
|
use border_wars::map::selected_tile::SelectTilePlugin;
|
||||||
use border_wars::networking::NetworkingPlugin;
|
use border_wars::networking::NetworkingPlugin;
|
||||||
use border_wars::scenes::ScenesPlugin;
|
use border_wars::scenes::ScenesPlugin;
|
||||||
|
use border_wars::ui::UiPlugin;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
|
@ -17,5 +18,6 @@ fn main() {
|
||||||
.add_plugins(SelectTilePlugin)
|
.add_plugins(SelectTilePlugin)
|
||||||
.add_plugins(NetworkingPlugin)
|
.add_plugins(NetworkingPlugin)
|
||||||
.add_plugins(MapGenerationPlugin)
|
.add_plugins(MapGenerationPlugin)
|
||||||
|
.add_plugins(UiPlugin)
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_egui::EguiPlugin;
|
use bevy_egui::EguiPlugin;
|
||||||
|
|
||||||
use crate::{responsive_scale, CurrentScene};
|
use crate::CurrentScene;
|
||||||
|
|
||||||
pub mod lobby;
|
pub mod lobby;
|
||||||
pub mod menu;
|
pub mod menu;
|
||||||
|
@ -16,7 +16,6 @@ impl Plugin for ScenesPlugin {
|
||||||
app.add_plugins(EguiPlugin)
|
app.add_plugins(EguiPlugin)
|
||||||
.add_state::<CurrentScene>()
|
.add_state::<CurrentScene>()
|
||||||
.add_plugins(menu::MenuPlugin)
|
.add_plugins(menu::MenuPlugin)
|
||||||
.add_plugins(lobby::LobbyPlugin)
|
.add_plugins(lobby::LobbyPlugin);
|
||||||
.add_plugins(responsive_scale::ResponsiveScalingPlugin);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
38
crates/border-wars/src/ui/hover.rs
Normal file
38
crates/border-wars/src/ui/hover.rs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
//! The file that contains the hover logic.
|
||||||
|
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
/// The plugin for the hover system.
|
||||||
|
pub struct HoverPlugin;
|
||||||
|
|
||||||
|
impl Plugin for HoverPlugin {
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
app.add_systems(Update, hovering);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A component that stores the hover texture and the original texture.
|
||||||
|
#[derive(Component, Clone)]
|
||||||
|
struct HoveredTexture {
|
||||||
|
/// The original texture.
|
||||||
|
texture: Handle<Image>,
|
||||||
|
|
||||||
|
/// The hovered texture.
|
||||||
|
hovered_texture: Handle<Image>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The system that applies the hover logic by changing the texture.
|
||||||
|
fn hovering(
|
||||||
|
mut interaction_query: Query<
|
||||||
|
(&Interaction, &HoveredTexture, &mut UiImage),
|
||||||
|
Changed<Interaction>,
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
for (interaction, textures, mut image) in interaction_query.iter_mut() {
|
||||||
|
match *interaction {
|
||||||
|
Interaction::Hovered => image.texture = textures.hovered_texture.clone(),
|
||||||
|
Interaction::None => image.texture = textures.texture.clone(),
|
||||||
|
Interaction::Pressed => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
crates/border-wars/src/ui/mod.rs
Normal file
19
crates/border-wars/src/ui/mod.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
//! The file that contains the UI logic.
|
||||||
|
|
||||||
|
pub mod hover;
|
||||||
|
pub mod responsive_scale;
|
||||||
|
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use self::hover::HoverPlugin;
|
||||||
|
use self::responsive_scale::ResponsiveScalingPlugin;
|
||||||
|
|
||||||
|
/// The plugin for the UI.
|
||||||
|
pub struct UiPlugin;
|
||||||
|
|
||||||
|
impl Plugin for UiPlugin {
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
app.add_plugins(HoverPlugin)
|
||||||
|
.add_plugins(ResponsiveScalingPlugin);
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,6 +29,9 @@ pub fn change_scaling(
|
||||||
size: Res<UILayoutSize>,
|
size: Res<UILayoutSize>,
|
||||||
) {
|
) {
|
||||||
let window = windows.get_single().expect("Main window not found");
|
let window = windows.get_single().expect("Main window not found");
|
||||||
|
if window.resolution.physical_height() == 0 {
|
||||||
|
return;
|
||||||
|
};
|
||||||
let (a, b) = (
|
let (a, b) = (
|
||||||
window.resolution.width() / size.0.x,
|
window.resolution.width() / size.0.x,
|
||||||
window.resolution.height() / size.0.y,
|
window.resolution.height() / size.0.y,
|
Loading…
Reference in a new issue