actions.rs (5188B)
1 use crate::GameState; 2 use bevy::prelude::*; 3 4 pub struct ActionsPlugin; 5 6 // This plugin listens for keyboard input and converts the input into Actions 7 // Actions can then be used as a resource in other systems to act on the player input. 8 impl Plugin for ActionsPlugin { 9 fn build(&self, app: &mut App) { 10 app.init_resource::<Actions>().add_system_set( 11 SystemSet::on_update(GameState::Playing).with_system(set_movement_actions.system()), 12 ); 13 } 14 } 15 16 #[derive(Default)] 17 pub struct Actions { 18 pub player_movement: Option<Vec2>, 19 } 20 21 fn set_movement_actions(mut actions: ResMut<Actions>, keyboard_input: Res<Input<KeyCode>>) { 22 if GameControl::Up.just_released(&keyboard_input) 23 || GameControl::Up.pressed(&keyboard_input) 24 || GameControl::Left.just_released(&keyboard_input) 25 || GameControl::Left.pressed(&keyboard_input) 26 || GameControl::Down.just_released(&keyboard_input) 27 || GameControl::Down.pressed(&keyboard_input) 28 || GameControl::Right.just_released(&keyboard_input) 29 || GameControl::Right.pressed(&keyboard_input) 30 { 31 let mut player_movement = Vec2::ZERO; 32 33 if GameControl::Up.just_released(&keyboard_input) 34 || GameControl::Down.just_released(&keyboard_input) 35 { 36 if GameControl::Up.pressed(&keyboard_input) { 37 player_movement.y = 1.; 38 } else if GameControl::Down.pressed(&keyboard_input) { 39 player_movement.y = -1.; 40 } else { 41 player_movement.y = 0.; 42 } 43 } else if GameControl::Up.just_pressed(&keyboard_input) { 44 player_movement.y = 1.; 45 } else if GameControl::Down.just_pressed(&keyboard_input) { 46 player_movement.y = -1.; 47 } else { 48 player_movement.y = actions.player_movement.unwrap_or(Vec2::ZERO).y; 49 } 50 51 if GameControl::Right.just_released(&keyboard_input) 52 || GameControl::Left.just_released(&keyboard_input) 53 { 54 if GameControl::Right.pressed(&keyboard_input) { 55 player_movement.x = 1.; 56 } else if GameControl::Left.pressed(&keyboard_input) { 57 player_movement.x = -1.; 58 } else { 59 player_movement.x = 0.; 60 } 61 } else if GameControl::Right.just_pressed(&keyboard_input) { 62 player_movement.x = 1.; 63 } else if GameControl::Left.just_pressed(&keyboard_input) { 64 player_movement.x = -1.; 65 } else { 66 player_movement.x = actions.player_movement.unwrap_or(Vec2::ZERO).x; 67 } 68 69 if player_movement != Vec2::ZERO { 70 player_movement = player_movement.normalize(); 71 actions.player_movement = Some(player_movement); 72 } 73 } else { 74 actions.player_movement = None; 75 } 76 } 77 78 enum GameControl { 79 Up, 80 Down, 81 Left, 82 Right, 83 } 84 85 impl GameControl { 86 fn just_released(&self, keyboard_input: &Res<Input<KeyCode>>) -> bool { 87 match self { 88 GameControl::Up => { 89 keyboard_input.just_released(KeyCode::W) 90 || keyboard_input.just_released(KeyCode::Up) 91 } 92 GameControl::Down => { 93 keyboard_input.just_released(KeyCode::S) 94 || keyboard_input.just_released(KeyCode::Down) 95 } 96 GameControl::Left => { 97 keyboard_input.just_released(KeyCode::A) 98 || keyboard_input.just_released(KeyCode::Left) 99 } 100 GameControl::Right => { 101 keyboard_input.just_released(KeyCode::D) 102 || keyboard_input.just_released(KeyCode::Right) 103 } 104 } 105 } 106 107 fn pressed(&self, keyboard_input: &Res<Input<KeyCode>>) -> bool { 108 match self { 109 GameControl::Up => { 110 keyboard_input.pressed(KeyCode::W) || keyboard_input.pressed(KeyCode::Up) 111 } 112 GameControl::Down => { 113 keyboard_input.pressed(KeyCode::S) || keyboard_input.pressed(KeyCode::Down) 114 } 115 GameControl::Left => { 116 keyboard_input.pressed(KeyCode::A) || keyboard_input.pressed(KeyCode::Left) 117 } 118 GameControl::Right => { 119 keyboard_input.pressed(KeyCode::D) || keyboard_input.pressed(KeyCode::Right) 120 } 121 } 122 } 123 124 fn just_pressed(&self, keyboard_input: &Res<Input<KeyCode>>) -> bool { 125 match self { 126 GameControl::Up => { 127 keyboard_input.just_pressed(KeyCode::W) || keyboard_input.just_pressed(KeyCode::Up) 128 } 129 GameControl::Down => { 130 keyboard_input.just_pressed(KeyCode::S) 131 || keyboard_input.just_pressed(KeyCode::Down) 132 } 133 GameControl::Left => { 134 keyboard_input.just_pressed(KeyCode::A) 135 || keyboard_input.just_pressed(KeyCode::Left) 136 } 137 GameControl::Right => { 138 keyboard_input.just_pressed(KeyCode::D) 139 || keyboard_input.just_pressed(KeyCode::Right) 140 } 141 } 142 } 143 }