From 5cbd63e67d47c9c376c5b0165105927670948469 Mon Sep 17 00:00:00 2001 From: brad Date: Tue, 23 Apr 2019 00:47:49 -0500 Subject: [PATCH] added scoring & adjusted speeds --- font/square.ttf | Bin 0 -> 13652 bytes resources/display_config.ron | 2 +- src/main.rs | 10 ++++-- src/pong.rs | 58 ++++++++++++++++++++++++++++++++- src/systems/mod.rs | 2 ++ src/systems/paddle.rs | 2 +- src/systems/winner.rs | 60 +++++++++++++++++++++++++++++++++++ 7 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 font/square.ttf create mode 100644 src/systems/winner.rs diff --git a/font/square.ttf b/font/square.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f1867ee0329a3c6295704d87cb1df3c43990036 GIT binary patch literal 13652 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 literal 0 HcmV?d00001 diff --git a/resources/display_config.ron b/resources/display_config.ron index 3aa60f1..7999694 100644 --- a/resources/display_config.ron +++ b/resources/display_config.ron @@ -1,6 +1,6 @@ ( title: "Pong!", - dimensions: Some((875, 500)), + dimensions: Some((500, 500)), max_dimensions: None, min_dimensions: None, fullscreen: false, diff --git a/src/main.rs b/src/main.rs index 208dff7..fd5c926 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,9 @@ use amethyst::renderer::{DisplayConfig, DrawFlat2D, Event, Pipeline, use amethyst::utils::application_root_dir; use amethyst::core::transform::TransformBundle; use amethyst::input::InputBundle; +use amethyst::{ + ui::{DrawUi, UiBundle}, +}; use crate::pong::Pong; fn main() -> amethyst::Result<()> { @@ -20,7 +23,8 @@ fn main() -> amethyst::Result<()> { .with_stage( Stage::with_backbuffer() .clear_target([0.00196, 0.23726, 0.11765, 1.0], 1.0) - .with_pass(DrawFlat2D::new()), + .with_pass(DrawFlat2D::new()) + .with_pass(DrawUi::new()), ); let binding_path = format!( @@ -35,9 +39,11 @@ fn main() -> amethyst::Result<()> { .with_bundle(RenderBundle::new(pipe, Some(config)).with_sprite_sheet_processor())? .with_bundle(TransformBundle::new())? .with_bundle(input_bundle)? + .with_bundle(UiBundle::::new())? .with(systems::PaddleSystem, "paddle_system", &["input_system"]) .with(systems::MoveBallsSystem, "ball_system", &[]) - .with(systems::BounceSystem, "collision_system", &["paddle_system", "ball_system"],); + .with(systems::BounceSystem, "collision_system", &["paddle_system", "ball_system"],) + .with(systems::WinnerSystem, "winner_system", &["ball_system"]);; let mut game = Application::new("./", Pong, game_data)?; diff --git a/src/pong.rs b/src/pong.rs index 1a8fcd1..d325f94 100644 --- a/src/pong.rs +++ b/src/pong.rs @@ -1,12 +1,13 @@ use amethyst::assets::{AssetStorage, Loader}; use amethyst::core::transform::Transform; -use amethyst::ecs::prelude::{Component, DenseVecStorage}; +use amethyst::ecs::prelude::{Component, DenseVecStorage, Entity}; use amethyst::prelude::*; use amethyst::renderer::{ Camera, PngFormat, Projection, SpriteRender, SpriteSheet, Flipped, SpriteSheetFormat, SpriteSheetHandle, Texture, TextureMetadata, }; +use amethyst::ui::{Anchor, TtfFormat, UiText, UiTransform}; pub const ARENA_HEIGHT: f32 = 100.0; pub const ARENA_WIDTH: f32 = 100.0; @@ -30,6 +31,7 @@ impl SimpleState for Pong { initialise_ball(world, sprite_sheet_handle.clone()); initialise_paddles(world, sprite_sheet_handle); + initialise_scoreboard(world); initialise_camera(world); } } @@ -69,6 +71,19 @@ impl Component for Ball { type Storage = DenseVecStorage; } +/// ScoreBoard contains the actual score data +#[derive(Default)] +pub struct ScoreBoard { + pub score_left: i32, + pub score_right: i32, +} + +/// ScoreText contains the ui text components that display the score +pub struct ScoreText { + pub p1_score: Entity, + pub p2_score: Entity, +} + fn initialise_camera(world: &mut World) { let mut transform = Transform::default(); transform.set_z(1.0); @@ -140,6 +155,47 @@ fn initialise_ball(world: &mut World, sprite_sheet_handle: SpriteSheetHandle) { .build(); } +/// Initialises a ui scoreboard +fn initialise_scoreboard(world: &mut World) { + let font = world.read_resource::().load( + "font/square.ttf", + TtfFormat, + Default::default(), + (), + &world.read_resource(), + ); + let p1_transform = UiTransform::new( + "P1".to_string(), Anchor::TopMiddle, + -50., -50., 1., 200., 50., 0, + ); + let p2_transform = UiTransform::new( + "P2".to_string(), Anchor::TopMiddle, + 50., -50., 1., 200., 50., 0, + ); + + let p1_score = world + .create_entity() + .with(p1_transform) + .with(UiText::new( + font.clone(), + "0".to_string(), + [1., 1., 1., 1.], + 50., + )).build(); + + let p2_score = world + .create_entity() + .with(p2_transform) + .with(UiText::new( + font.clone(), + "0".to_string(), + [1., 1., 1., 1.], + 50., + )).build(); + + world.add_resource(ScoreText { p1_score, p2_score }); +} + fn load_sprite_sheet(world: &mut World) -> SpriteSheetHandle { // Load the sprite sheet necessary to render the graphics. // The texture is the pixel data diff --git a/src/systems/mod.rs b/src/systems/mod.rs index 9828cbb..43d61e2 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -1,7 +1,9 @@ mod paddle; mod move_balls; mod bounce; +mod winner; +pub use self::winner::WinnerSystem; pub use self::paddle::PaddleSystem; pub use self::bounce::BounceSystem; pub use self::move_balls::MoveBallsSystem; \ No newline at end of file diff --git a/src/systems/paddle.rs b/src/systems/paddle.rs index 76e92c3..c659bad 100644 --- a/src/systems/paddle.rs +++ b/src/systems/paddle.rs @@ -21,7 +21,7 @@ impl<'s> System<'s> for PaddleSystem { Side::Right => input.axis_value("right_paddle"), }; if let Some(mv_amount) = movement { - let scaled_amount = 1.2 * mv_amount as f32; + let scaled_amount = 2.0 * mv_amount as f32; let paddle_y = transform.translation().y; transform.set_y( (paddle_y + scaled_amount) diff --git a/src/systems/winner.rs b/src/systems/winner.rs new file mode 100644 index 0000000..bb9352a --- /dev/null +++ b/src/systems/winner.rs @@ -0,0 +1,60 @@ +use amethyst::{ + core::transform::Transform, + ecs::prelude::{Join, ReadExpect, System, Write, WriteStorage}, + ui::UiText, +}; + +use crate::pong::{Ball, ScoreBoard, ScoreText, ARENA_WIDTH}; + +pub struct WinnerSystem; + +impl<'s> System<'s> for WinnerSystem { + type SystemData = ( + WriteStorage<'s, Ball>, + WriteStorage<'s, Transform>, + WriteStorage<'s, UiText>, + Write<'s, ScoreBoard>, + ReadExpect<'s, ScoreText>, + ); + + fn run(&mut self, ( + mut balls, + mut locals, + mut ui_text, + mut scores, + score_text + ): Self::SystemData) { + for (ball, transform) in (&mut balls, &mut locals).join() { + let ball_x = transform.translation().x; + + let did_hit = if ball_x <= ball.radius { + // Right player scored on the left side. + scores.score_right = (scores.score_right + 1) + .min(999); + if let Some(text) = ui_text.get_mut(score_text.p2_score) { + text.text = scores.score_right.to_string(); + } + true + } else if ball_x >= ARENA_WIDTH - ball.radius { + // Left player scored on the right side. + scores.score_left = (scores.score_left + 1) + .min(999); + if let Some(text) = ui_text.get_mut(score_text.p1_score) { + text.text = scores.score_left.to_string(); + } + true + } else { + false + }; + + if did_hit { + ball.velocity[0] = -ball.velocity[0]; // Reverse Direction + transform.set_x(ARENA_WIDTH / 2.0); // Reset Position + println!( + "Score: | {:^3} | {:^3} |", + scores.score_left, scores.score_right + ); + } + } + } +} \ No newline at end of file