From 0140be11216874528b359404f14cd025876e6572 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sun, 21 Aug 2022 21:41:35 +0200 Subject: [PATCH] Add eating animation --- Cargo.lock | 17 +++++++++++ Cargo.toml | 1 + src/fruit.rs | 7 ++--- src/main.rs | 2 ++ src/snake.rs | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 105 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d1bf076..68df9e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,6 +246,7 @@ version = "0.1.0" dependencies = [ "bevy", "bevy_editor_pls", + "bevy_tweening", "itertools", "iyes_loopless", "rand", @@ -880,6 +881,16 @@ dependencies = [ "bevy_reflect", ] +[[package]] +name = "bevy_tweening" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "164bcb41708fa1aeb435b6bba6cae61777b9f8cf3e18b207bb6209ca5b970e77" +dependencies = [ + "bevy", + "interpolation", +] + [[package]] name = "bevy_ui" version = "0.8.1" @@ -2012,6 +2023,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "interpolation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7357d2bbc5ee92f8e899ab645233e43d21407573cceb37fed8bc3dede2c02" + [[package]] name = "io-kit-sys" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 3896fa2..ee78369 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ itertools = "0.10.3" # bevy-inspector-egui = "0.12.1" rand = "0.8.5" bevy_editor_pls = { git = "https://github.com/jakobhellermann/bevy_editor_pls" } +bevy_tweening = "0.5.0" [dependencies.bevy] version = "0.8.0" diff --git a/src/fruit.rs b/src/fruit.rs index 7ba0b5e..c1df868 100644 --- a/src/fruit.rs +++ b/src/fruit.rs @@ -29,10 +29,7 @@ fn eaten_event_sent(mut eaten_event_reader: EventReader) -> bool { eaten_event_reader.iter().count() != 0 } -fn spawn_fruit_system( - mut commands: Commands, - coordinate_query: Query<&grid::Coordinate>, -) { +fn spawn_fruit_system(mut commands: Commands, coordinate_query: Query<&grid::Coordinate>) { fn random_coordinate() -> grid::Coordinate { let mut rng = rand::thread_rng(); let coordinate_range = 0..grid::SIZE; @@ -49,7 +46,7 @@ fn spawn_fruit_system( .any(|&snake_coordinate| snake_coordinate == coordinate) }; - let fruit_coordinate = std::iter::repeat(random_coordinate()) + let fruit_coordinate = std::iter::repeat_with(random_coordinate) .find(|&coordinate| !coordinate_in_other_element(coordinate)) .expect("Should always be found."); diff --git a/src/main.rs b/src/main.rs index 76f727d..44f0fef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use bevy::{prelude::*, render::camera::ScalingMode}; use bevy_editor_pls::prelude::*; use grid::{SEGMENT_SIZE, SIZE}; use iyes_loopless::prelude::*; +use bevy_tweening::TweeningPlugin; mod canvas; mod fruit; @@ -35,6 +36,7 @@ fn main() { .add_loopless_state(AppState::Begin) .add_plugins(DefaultPlugins) .add_plugin(EditorPlugin) + .add_plugin(TweeningPlugin) .add_plugin(TickPlugin) .add_plugin(SnakePlugin) .add_plugin(FruitPlugin) diff --git a/src/snake.rs b/src/snake.rs index 99bf8f6..8a406bb 100644 --- a/src/snake.rs +++ b/src/snake.rs @@ -1,7 +1,9 @@ use crate::{fruit, grid, tick::tick_triggered, AppState}; use bevy::prelude::*; +use bevy_tweening::{lens::TransformScaleLens, *}; use itertools::Itertools; use iyes_loopless::prelude::*; +use std::time::Duration; #[derive(Debug, Clone, PartialEq, Eq, Hash, StageLabel)] struct MovementStage; @@ -17,7 +19,8 @@ impl Plugin for SnakePlugin { fn build(&self, app: &mut App) { let movement_stage = SystemStage::parallel(); - app.add_startup_system(setup_snake_system) + app.insert_resource(BulgePropagationTimer::default()) + .add_startup_system(setup_snake_system) .add_stage_after(CoreStage::Update, MovementStage, movement_stage) .add_system_to_stage( MovementStage, @@ -49,7 +52,10 @@ impl Plugin for SnakePlugin { .add_system(add_direction_system.run_in_state(AppState::Begin)) .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_tail_system) + .add_system(add_bulge_system) + .add_system(propagate_bulge_system) + .add_system(animate_bulge_system); } } @@ -78,6 +84,18 @@ struct Snake; #[derive(Component)] struct SnakeSegments(Vec); +#[derive(Component)] +#[component(storage = "SparseSet")] +struct BulgeMarker; + +struct BulgePropagationTimer(Timer); + +impl Default for BulgePropagationTimer { + fn default() -> Self { + Self(Timer::new(Duration::from_millis(30), true)) + } +} + impl SnakeSegments { fn with_head(snake_head: Entity) -> Self { Self(vec![snake_head]) @@ -167,6 +185,69 @@ fn add_tail_system( } } +fn add_bulge_system( + mut commands: Commands, + mut eaten_event_reader: EventReader, + query: Query>, +) { + for _ in eaten_event_reader.iter() { + let snake_head_entity = query.single(); + commands.entity(snake_head_entity).insert(BulgeMarker); + } +} + +fn propagate_bulge_system( + mut commands: Commands, + query: Query<(Entity, &Parent), (With, With)>, + snake_segments_query: Query<&SnakeSegments>, + time: Res