Select Git revision
gridcursor.rs
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
gridcursor.rs 2.69 KiB
use crate::{
assets::GRIDCURSOR_TEXTURE,
components::{GridCursor, GridPos},
machine::{Machine, MACHINE_SIZE},
RENDER_ORDER,
};
use bevy::prelude::*;
pub struct GridCursorPlugin;
pub struct GridCursorTexture {
pub handle: Handle<Image>,
}
/// TEMPORARY
/// simple index to decide on type of machine to be placed
struct SelectedMachine(pub Machine);
impl Plugin for GridCursorPlugin {
fn build(&self, app: &mut App) {
app.add_startup_system_to_stage(StartupStage::PostStartup, gridcursor_setup_system)
.add_system(gridcursor_follow_mouse_system)
.add_system(cursor_handle_click_system)
.insert_resource(SelectedMachine(Machine::Wall))
.add_system(key_input_system);
}
}
fn gridcursor_setup_system(mut commands: Commands, texture: Res<GridCursorTexture>) {
commands
.spawn_bundle(SpriteBundle {
texture: texture.handle.clone(),
transform: Transform {
scale: (MACHINE_SIZE / GRIDCURSOR_TEXTURE.size).extend(1.0),
..default()
},
..default()
})
.insert(GridPos::new(3, 3, 0))
.insert(GridCursor);
}
fn gridcursor_follow_mouse_system(
mut cursor_moved: EventReader<CursorMoved>,
mut query: Query<(&mut Transform, &mut GridPos), With<GridCursor>>,
camera_query: Query<(&Camera, &GlobalTransform)>,
windows: Res<Windows>,
) {
let window = windows.get_primary().unwrap();
for event in cursor_moved.iter() {
if let Ok((mut transform, mut grid_pos)) = query.get_single_mut() {
let new_grid_pos =
GridPos::from_screen_pos(event.position, window, camera_query.single(), 0);
*grid_pos = new_grid_pos;
transform.translation = new_grid_pos.to_world_pos().extend(RENDER_ORDER.gridcursor)
}
}
}
fn cursor_handle_click_system(
mut commands: Commands,
slected_machine: Res<SelectedMachine>,
mouse_button: Res<Input<MouseButton>>,
cursor_query: Query<&GridPos, With<GridCursor>>,
) {
if let Ok(pos) = cursor_query.get_single() {
if mouse_button.just_pressed(MouseButton::Left) {
commands.spawn_bundle((*pos, slected_machine.0));
}
}
}
fn key_input_system(mut slected_machine: ResMut<SelectedMachine>, kb: Res<Input<KeyCode>>) {
for key in kb.get_just_pressed() {
match key {
KeyCode::Key1 => {
slected_machine.0 = Machine::Wall;
}
KeyCode::Key2 => {
slected_machine.0 = Machine::Turbine;
}
KeyCode::Key3 => {
slected_machine.0 = Machine::Cable;
}
_ => (),
};
}
}