From 2b1adfc4b74b5ae81fb0cb7c0d38155508d398ee Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 19 Dec 2022 21:38:48 +0100 Subject: [PATCH] Some refactoring --- Cargo.lock | 4 ++-- src/fruit.rs | 10 --------- src/main.rs | 18 +++++++++++------ src/snake.rs | 45 ++++++++++++++++++++++++++++++++--------- src/snake/appearance.rs | 1 + src/snake/bulge.rs | 14 ++++++------- src/snake/movement.rs | 1 + 7 files changed, 59 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4fe9484..6b387d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,9 +92,9 @@ checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e" [[package]] name = "android_logger" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0c6cfd3264e874d461c0316a78fb78e4147562c68a64881af36fe10573613e" +checksum = "8619b80c242aa7bd638b5c7ddd952addeecb71f69c75e33f1d47b2804f8f883a" dependencies = [ "android_log-sys", "env_logger", diff --git a/src/fruit.rs b/src/fruit.rs index b79553d..d95be77 100644 --- a/src/fruit.rs +++ b/src/fruit.rs @@ -16,7 +16,6 @@ impl Plugin for FruitPlugin { app.add_event::() .add_startup_system(spawn_fruit_system) .add_system(eat_fruit_system.run_if(tick_triggered)) - .add_system(debug_eaten_event_system) .add_system(despawn_fruit_system) .add_system(spawn_fruit_system.run_if(eaten_event_sent)); } @@ -88,12 +87,3 @@ fn despawn_fruit_system(mut commands: Commands, mut event_reader: EventReader, - keypress: Res>, -) { - if keypress.just_pressed(KeyCode::Space) { - event_writer.send(EatenEvent(None)); - } -} diff --git a/src/main.rs b/src/main.rs index df146e4..e5cc0a3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,12 @@ use crate::{canvas::CanvasPlugin, fruit::FruitPlugin, snake::SnakePlugin, tick::TickPlugin}; use bevy::{prelude::*, render::camera::ScalingMode}; -use bevy_editor_pls::prelude::*; use bevy_tweening::TweeningPlugin; use grid::{SEGMENT_SIZE, SIZE}; use iyes_loopless::prelude::*; +#[cfg(debug_assertions)] +use bevy_editor_pls::prelude::*; + mod canvas; mod fruit; mod grid; @@ -24,8 +26,9 @@ enum AppState { } fn main() { - App::new() - .insert_resource(ClearColor(Color::rgb_u8(12, 12, 12))) + let mut app = App::new(); + + app.insert_resource(ClearColor(Color::rgb_u8(12, 12, 12))) .add_loopless_state(AppState::Begin) .add_plugins(DefaultPlugins.set(WindowPlugin { window: WindowDescriptor { @@ -37,7 +40,6 @@ fn main() { }, ..Default::default() })) - .add_plugin(EditorPlugin) .add_plugin(TweeningPlugin) .add_plugin(TickPlugin) .add_plugin(SnakePlugin) @@ -46,8 +48,12 @@ fn main() { .add_startup_system(setup_system) .add_system(camera_move_system) .add_system(bevy::window::close_on_esc) - .add_system(pause_system) - .run(); + .add_system(pause_system); + + #[cfg(debug_assertions)] + app.add_plugin(EditorPlugin); + + app.run(); } fn setup_system(mut commands: Commands) { diff --git a/src/snake.rs b/src/snake.rs index 93481b1..a5e65b4 100644 --- a/src/snake.rs +++ b/src/snake.rs @@ -4,9 +4,6 @@ mod movement; use crate::{fruit, grid, tick::tick_triggered, AppState}; use bevy::prelude::*; -use bulge::{ - add_bulge_system, animate_bulge_system, propagate_bulge_system, BulgePropagationTimer, -}; use itertools::Itertools; use iyes_loopless::prelude::*; @@ -24,7 +21,8 @@ impl Plugin for SnakePlugin { fn build(&self, app: &mut App) { let movement_stage = SystemStage::parallel(); - app.insert_resource(BulgePropagationTimer::default()) + app.add_event::() + .insert_resource(bulge::PropagationTimer::default()) .add_startup_system(setup_snake_system) .add_stage_after(CoreStage::Update, MovementStage, movement_stage) .add_system_to_stage( @@ -55,9 +53,13 @@ impl Plugin for SnakePlugin { .add_system(change_direction_system.run_in_state(AppState::InGame)) .add_system(grid_transform_system.run_in_state(AppState::InGame)) .add_system(add_tail_system) - .add_system(add_bulge_system) - .add_system(propagate_bulge_system) - .add_system(animate_bulge_system); + .add_system(bulge::add_bulge_system) + .add_system(bulge::propagate_bulge_system) + .add_system(bulge::animate_bulge_system) + .add_system(eaten_event_system); + + #[cfg(debug_assertions)] + app.add_system(debug::add_tail); } } @@ -118,6 +120,8 @@ struct Collision { about_to_collide: bool, } +pub struct AddTailEvent; + fn create_snake_segment(commands: &mut Commands, grid_position: grid::Coordinate) -> Entity { commands .spawn(SpriteBundle { @@ -167,12 +171,21 @@ fn add_direction_system( } } +fn eaten_event_system( + mut eaten_event_reader: EventReader, + mut tail_event_writer: EventWriter, +) { + eaten_event_reader + .iter() + .for_each(|_| tail_event_writer.send(AddTailEvent)); +} + fn add_tail_system( mut commands: Commands, - mut eaten_event_reader: EventReader, mut snake_query: Query<(Entity, &mut Segments), With>, + mut tail_event_reader: EventReader, ) { - for _ in eaten_event_reader.iter() { + for _ in tail_event_reader.iter() { let segment = create_snake_segment(&mut commands, grid::Coordinate::splat(grid::Index::MIN / 2)); @@ -286,3 +299,17 @@ fn next_grid_coordinate( Direction::Right => *current_coordinate + grid::Coordinate(1, 0), } } + +#[cfg(debug_assertions)] +mod debug { + use super::*; + + pub(super) fn add_tail( + keypress: Res>, + mut tail_event_writer: EventWriter, + ) { + if keypress.just_pressed(KeyCode::Space) { + tail_event_writer.send(AddTailEvent); + } + } +} diff --git a/src/snake/appearance.rs b/src/snake/appearance.rs index e69de29..8b13789 100644 --- a/src/snake/appearance.rs +++ b/src/snake/appearance.rs @@ -0,0 +1 @@ + diff --git a/src/snake/bulge.rs b/src/snake/bulge.rs index e50bf2c..b119fb4 100644 --- a/src/snake/bulge.rs +++ b/src/snake/bulge.rs @@ -1,5 +1,5 @@ -use super::{Segments, Snake, SnakeHead, SnakeSegment}; -use crate::{fruit, tick::TICK_PERIOD}; +use super::{AddTailEvent, Segments, Snake, SnakeHead, SnakeSegment}; +use crate::tick::TICK_PERIOD; use bevy::prelude::*; use bevy_tweening::{lens::TransformScaleLens, *}; use std::time::Duration; @@ -9,9 +9,9 @@ use std::time::Duration; pub(super) struct BulgeMarker; #[derive(Resource)] -pub(super) struct BulgePropagationTimer(Timer); +pub(super) struct PropagationTimer(Timer); -impl Default for BulgePropagationTimer { +impl Default for PropagationTimer { fn default() -> Self { Self(Timer::new( Duration::from_millis(TICK_PERIOD / 4), @@ -22,10 +22,10 @@ impl Default for BulgePropagationTimer { pub(super) fn add_bulge_system( mut commands: Commands, - mut eaten_event_reader: EventReader, + mut tail_event_reader: EventReader, query: Query>, ) { - for _ in eaten_event_reader.iter() { + for _ in tail_event_reader.iter() { let snake_head_entity = query.single(); commands.entity(snake_head_entity).insert(BulgeMarker); } @@ -36,7 +36,7 @@ pub(super) fn propagate_bulge_system( bulge_segment_query: Query<(Entity, &Parent), (With, With)>, snake_query: Query<&Segments, With>, time: Res