|
| 1 | +use amethyst::{ |
| 2 | + core::Transform, |
| 3 | + derive::SystemDesc, |
| 4 | + ecs::{Join, Read, ReadStorage, System, SystemData, WriteStorage}, |
| 5 | + input::{InputHandler, StringBindings}, |
| 6 | +}; |
| 7 | + |
| 8 | +// You'll have to mark PADDLE_HEIGHT as public in pong.rs |
| 9 | +use crate::pong::{Paddle, Side, ARENA_HEIGHT}; |
| 10 | + |
| 11 | +#[derive(SystemDesc)] |
| 12 | +pub struct PaddleSystem; |
| 13 | + |
| 14 | +impl<'s> System<'s> for PaddleSystem { |
| 15 | + type SystemData = ( |
| 16 | + WriteStorage<'s, Transform>, |
| 17 | + ReadStorage<'s, Paddle>, |
| 18 | + Read<'s, InputHandler<StringBindings>>, |
| 19 | + ); |
| 20 | + |
| 21 | + fn run(&mut self, (mut transforms, paddles, input): Self::SystemData) { |
| 22 | + for (paddle, transform) in (&paddles, &mut transforms).join() { |
| 23 | + let movement = match paddle.side { |
| 24 | + Side::Left => input.axis_value("left_paddle"), |
| 25 | + Side::Right => input.axis_value("right_paddle"), |
| 26 | + }; |
| 27 | + if let Some(mv_amount) = movement { |
| 28 | + if mv_amount != 0.0 { |
| 29 | + let scaled_amount = 1.2 * mv_amount as f32; |
| 30 | + let paddle_y = transform.translation().y; |
| 31 | + transform.set_translation_y( |
| 32 | + (paddle_y + scaled_amount) |
| 33 | + .min(ARENA_HEIGHT - paddle.height * 0.5) |
| 34 | + .max(paddle.height * 0.5), |
| 35 | + ); |
| 36 | + } |
| 37 | + } |
| 38 | + } |
| 39 | + } |
| 40 | +} |
0 commit comments