bevy-game

A bevy game
git clone git://archive.git.mtrnord.blog/MTRNord/bevy-game.git
Log | Files | Refs | README | LICENSE

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 }