Skip to content
Snippets Groups Projects
Select Git revision
  • c847117f375224371e1439c24aedb9b6fef51dca
  • main default protected
  • battery
3 results

gridcursor.rs

Blame
  • 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;
                }
                _ => (),
            };
        }
    }