diff --git a/schafkopf-logic/src/main.rs b/schafkopf-logic/src/main.rs index 4a8135a..c99fd33 100644 --- a/schafkopf-logic/src/main.rs +++ b/schafkopf-logic/src/main.rs @@ -3,6 +3,7 @@ use bevy::{ prelude::*, render::render_resource::{Extent3d, TextureDimension, TextureFormat}, }; +use bevy::ecs::relationship::Relationship; use schafkopf_logic::{ deck::{Card, Deck, Rank, Suit}, gamemode::Gamemode, @@ -74,6 +75,10 @@ struct PlayerCardVisual { index: usize, } +// Marker for the base (non-atlas) sprite child under a card parent +#[derive(Component)] +struct BaseCardSprite; + fn main() { App::new() .add_plugins( @@ -159,6 +164,8 @@ fn spawn_player_hand( let parent = commands .spawn(Transform::from_xyz(start_x + i as f32 * spacing, y, 0.0)) + .observe(on_hover()) + .observe(on_unhover()) .id(); commands.entity(parent).with_children(|c| { @@ -170,11 +177,9 @@ fn spawn_player_hand( }, Transform::from_xyz(0.0, 0.0, 0.0), Pickable::default(), + BaseCardSprite, )) - .observe(on_hover()) - .observe(on_unhover()) - .observe(on_click(*card)) - .observe(on_click_update_label(*card)); + .observe(on_click_select(*card)); c.spawn(( Sprite::from_atlas_image( @@ -337,33 +342,77 @@ fn suit_color(suit: Suit) -> [u8; 4] { } } -fn on_hover() -> impl Fn(On>, Query<(&mut Sprite, &mut Transform)>) { - move |ev, mut q| { - if let Ok((mut sprite, mut transform)) = q.get_mut(ev.event_target()) { - sprite.color = Color::srgb(0.6, 0.6, 0.6); +fn on_hover( +) -> impl Fn( + On>, + Query<&mut Transform>, + Query<&Children>, + Query<(&mut Sprite, Option<&BaseCardSprite>)>, + Query<&ChildOf>, +) +{ + move |ev, mut q_transform, q_children, mut q_sprite, q_parent| { + // Determine the card parent entity from the event target + let mut parent_entity = ev.event_target(); + if let Ok(parent) = q_parent.get(parent_entity) { + parent_entity = parent.get(); + } + + // Scale the parent + if let Ok(mut transform) = q_transform.get_mut(parent_entity) { transform.scale = Vec3::splat(1.1); } - } -} -fn on_unhover() -> impl Fn(On>, Query<(&mut Sprite, &mut Transform)>) { - move |ev, mut q| { - if let Ok((mut sprite, mut transform)) = q.get_mut(ev.event_target()) { - sprite.color = Color::WHITE; - transform.scale = Vec3::ONE; + // Tint only the base sprite child (marked with BaseCardSprite) + if let Ok(children) = q_children.get(parent_entity) { + for child in children.iter() { + if let Ok((mut sprite, maybe_base)) = q_sprite.get_mut(child) { + if maybe_base.is_some() { + sprite.color = Color::srgb(0.6, 0.6, 0.6); + } + } + } } } } +fn on_unhover( +) -> impl Fn( + On>, + Query<&mut Transform>, + Query<&Children>, + Query<(&mut Sprite, Option<&BaseCardSprite>)>, + Query<&ChildOf>, +) +{ + move |ev, mut q_transform, q_children, mut q_sprite, q_parent| { + // Determine the card parent entity from the event target + let mut parent_entity = ev.event_target(); + if let Ok(parent) = q_parent.get(parent_entity) { + parent_entity = parent.get(); + } -fn on_click(card: Card) -> impl Fn(On>, Query<(&mut Sprite, &mut Transform)>) { - move |_, _| { - println!("Clicked on card: {:?}", card); + // Reset parent scale + if let Ok(mut transform) = q_transform.get_mut(parent_entity) { + transform.scale = Vec3::ONE; + } + + // Reset tint on the base sprite child + if let Ok(children) = q_children.get(parent_entity) { + for child in children.iter() { + if let Ok((mut sprite, maybe_base)) = q_sprite.get_mut(child) { + if maybe_base.is_some() { + sprite.color = Color::WHITE; + } + } + } + } } } -fn on_click_update_label(card: Card) -> impl Fn(On>, ResMut) { +fn on_click_select(card: Card) -> impl Fn(On>, ResMut) { move |_, mut clicked| { + println!("Clicked on card: {:?}", card); clicked.0 = Some(format!("{} {}", card.suit, card.rank)); } }