From b2def3815dd68b032e77457b44c03f41f7423129 Mon Sep 17 00:00:00 2001 From: Nora <nora.widdecke@tu-bs.de> Date: Sun, 25 Aug 2019 14:00:18 +0200 Subject: [PATCH] control the paddle by accelerometer x direction --- rkanoid/src/main.rs | 63 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/rkanoid/src/main.rs b/rkanoid/src/main.rs index badebf3..7699253 100644 --- a/rkanoid/src/main.rs +++ b/rkanoid/src/main.rs @@ -162,6 +162,62 @@ enum GameResult { LevelFinish(u32), } +struct Input { + buttons: Buttons, + accelerometer: BHI160<Accelerometer>, + accel_data_x: f32, +} + +impl Input { + pub fn update(&mut self) { + self.buttons = Buttons::read(); + for data in &self.accelerometer.read() { + self.accel_data_x = data.x; + } + } + + pub fn left_bottom(&self) -> bool { + self.buttons.left_bottom() + || self.accel_is_left() + } + + pub fn right_bottom(&self) -> bool { + self.buttons.right_bottom() + || self.accel_is_right() + } + + pub fn left_top(&self) -> bool { + self.buttons.left_top() + } + + pub fn right_top(&self) -> bool { + self.buttons.right_top() + } + + pub fn reset(&self) -> bool { + self.buttons.reset() + } + + pub fn new() -> Self { + Input { + buttons: Buttons::read(), + accelerometer: BHI160::<Accelerometer>::start(), + accel_data_x: Default::default(), + } + } + + fn accel_is_right(&self) -> bool { + // technically, true if < 0.0 + // false if >= 0.0 + // but need static middle space + self.accel_data_x > 0.1 + } + + fn accel_is_left(&self) -> bool { + self.accel_data_x < -0.1 + } +} + fn game(level: u16, mut score: u32) -> GameResult { let start_time = Seconds::time(); let display = Display::open(); @@ -172,8 +228,9 @@ fn game(level: u16, mut score: u32) -> GameResult { let mut ball_y = Display::H - PADDLE_HEIGHT - BALL_RADIUS; let mut ball_direction = Direction::UR; let mut blocks = Blocks::generate((0x3F + 0x10 * level).min(0xff) as u8); + let mut input = Input::new(); for tick in 0.. { - let input = Buttons::read(); + input.update(); let old_paddle = paddle; if input.left_bottom() { paddle -= PADDLE_SPEED; @@ -244,7 +301,7 @@ fn game(level: u16, mut score: u32) -> GameResult { if check_finish && blocks.is_finished() { return GameResult::LevelFinish(score + 100); } - + display.clear(Color::black()); // Paddle display.rect( @@ -338,7 +395,7 @@ fn level_finish(level: u16, score: u32) -> bool { main!(main); fn main() { title_screen(); - + let mut quit = false; let mut level = 0; let mut score = 0; -- GitLab