From 1cdba9b75a56739094aa5c289f95d5eb12c9d2ba Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Sun, 29 Dec 2024 19:29:48 -0800 Subject: [PATCH] "figured out" z-ordering might write a blog about it... --- src/play.rs | 91 ++++++++++++++++++++++++++++++---------------------- src/setup.rs | 56 +++++++++++++++++++------------- todo.txt | 5 +-- 3 files changed, 86 insertions(+), 66 deletions(-) diff --git a/src/play.rs b/src/play.rs index a6cc659..a7ea6d2 100644 --- a/src/play.rs +++ b/src/play.rs @@ -1,6 +1,6 @@ use bevy::{prelude::*, utils::RandomState}; -use crate::{deck::Card, menu::UiMessage, setup::AnimationStore, GameState}; +use crate::{deck::Card, menu::UiMessage, setup::AnimationStore, view::ViewState}; pub struct PlayPlugin; @@ -8,7 +8,7 @@ impl Plugin for PlayPlugin { fn build(&self, app: &mut App) { app.add_event::() .add_observer(serve_cards) - .add_systems(OnEnter(GameState::Main), deal_cards) + .add_systems(OnEnter(ViewState::Play), deal_cards) .add_systems(Update, deal_cards.run_if(set_added)) .add_systems(Update, delayed_animation); } @@ -54,20 +54,20 @@ pub(crate) fn play_selected_animation( store: Res, mut commands: Commands, ) { - let e = trigger.entity(); - info!("Play selected animation {:?}", e); let (g, ai) = store.store.get("rotate".into()).unwrap(); - commands.entity(e).insert(g.clone()); - query.get_mut(e).unwrap().play(ai.clone()).repeat(); + commands.entity(trigger.entity()).insert(g.clone()); + query + .get_mut(trigger.entity()) + .unwrap() + .play(ai.clone()) + .repeat(); } pub(crate) fn stop_selected_animation( trigger: Trigger, mut query: Query<(&mut Transform, &mut AnimationPlayer)>, ) { - let e = trigger.entity(); - info!("Stop selected animation {:?}", e); - let (mut t, mut ap) = query.get_mut(e).unwrap(); + let (mut t, mut ap) = query.get_mut(trigger.entity()).unwrap(); ap.stop_all(); t.rotation = Quat::default(); } @@ -75,9 +75,11 @@ pub(crate) fn stop_selected_animation( /// Check a set when the "Set" button is clicked pub(crate) fn check_set( _trigger: Trigger>, - mut query: Query<(Entity, &Card, &mut Visibility, &mut Transform), With>, + query: Query<(Entity, &Card, &PlayLocation, &Parent), With>, + mut transforms: Query<&mut Transform>, sets: Query<&SetNumber>, mut commands: Commands, + animation_store: Res, ) { let mut cards = query.iter(); if cards.len() == 3 { @@ -86,20 +88,35 @@ pub(crate) fn check_set( cards.next().unwrap(), cards.next().unwrap(), ); + match is_set((a, b, c)) { Ok(()) => { - query - .iter_mut() - .for_each(|(entity, _, mut visibility, mut transform)| { - *visibility = Visibility::Hidden; - *transform = Transform::default(); - let set_number = sets.iter().len() as u8 / 3 + 1; - commands - .entity(entity) - .remove::() - .remove::() - .insert(SetNumber(set_number)); - }); + query.iter().for_each(|(entity, _, play_location, parent)| { + let (graph_handle, animation_index) = animation_store + .store + .get(&format!( + "{:?}->discard", + (play_location.x, play_location.y) + )) + .unwrap(); + + let set_number = sets.iter().len() as u8 / 3 + 1; + + // Adjust Z-location for proper discard animation + transforms.get_mut(parent.get()).unwrap().translation.z = set_number as f32; + + commands + .entity(entity) + .remove::() + .remove::() + .insert(DelayedAnimation { + delay: Timer::from_seconds(0.1, TimerMode::Once), + graph: graph_handle.clone(), + animation_index: animation_index.clone(), + }) + .insert(SetNumber(set_number)) + .insert(PickingBehavior::IGNORE); + }); commands.trigger(UiMessage("Yipee!".into())); } Err(invalid_set_err) => { @@ -226,54 +243,50 @@ fn set_added(query: Query>) -> bool { #[derive(Component)] struct DelayedAnimation { graph: AnimationGraphHandle, + animation_index: AnimationNodeIndex, delay: Timer, } +#[derive(Event, Clone)] +pub(crate) struct AnimationComplete; + /// When a card is added to the board, place it on the screen pub(crate) fn place_card( trigger: Trigger, - mut query: Query<( - Entity, - &PlayLocation, - &mut Visibility, - &Name, - &mut AnimationPlayer, - )>, + mut query: Query<(Entity, &PlayLocation, &mut Visibility)>, animation_store: Res, mut commands: Commands, random_state: Local, ) { - let (entity, play_location, mut visibility, name, mut player) = - query.get_mut(trigger.entity()).unwrap(); + let (entity, play_location, mut visibility) = query.get_mut(trigger.entity()).unwrap(); let (graph_handle, animation_index) = animation_store .store .get(&format!("deck->{:?}", (play_location.x, play_location.y))) .unwrap(); - player.play(animation_index.clone()); - let delay = ((random_state.hash_one(entity) % 9) as f32 / 10.0) + 0.1; - info!("Delay: {:?}", delay); - commands.entity(entity).insert((DelayedAnimation { - graph: graph_handle.clone(), + commands.entity(entity).insert(DelayedAnimation { + animation_index: animation_index.clone(), delay: Timer::from_seconds(delay, TimerMode::Once), - },)); + graph: graph_handle.clone(), + }); // Set it to visible *visibility = Visibility::Inherited; } fn delayed_animation( - mut query: Query<(Entity, &mut DelayedAnimation)>, + mut query: Query<(Entity, &mut DelayedAnimation, &mut AnimationPlayer)>, mut commands: Commands, time: Res