From 1f389f52854efbaf23b1d960d17dccc1f9ee6a39 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 26 Jan 2026 00:48:56 +0500 Subject: [PATCH] Small hand rework, simplest cards shuffle --- assets/sprites/sources/cards.kra | Bin 68245 -> 97437 bytes src/card/drag.rs | 16 ++++-- src/card/mod.rs | 93 +++++++++++++++++++++++-------- src/grid.rs | 3 + src/main.rs | 11 ++-- 5 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 src/grid.rs diff --git a/assets/sprites/sources/cards.kra b/assets/sprites/sources/cards.kra index 1b81d48c05dd085e57f1e8258666970bad4579ec..3fd2568347fe615cbfcba5217524be4a5675a104 100644 GIT binary patch literal 97437 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 delta 16713 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 diff --git a/src/card/drag.rs b/src/card/drag.rs index 8352be9..31489fd 100644 --- a/src/card/drag.rs +++ b/src/card/drag.rs @@ -1,6 +1,9 @@ use bevy::prelude::*; -use crate::{animation::transform::AnimatedTransform, card::Hand}; +use crate::{ + animation::transform::AnimatedTransform, + card::{CardInHand, Hand, InsertCard}, +}; #[derive(Component)] pub struct DraggableCard; @@ -33,6 +36,7 @@ pub fn card_drag_start( mut commands: Commands, card_query: Query<(), With>, dragged_option: Option>, + mut hand: Single<&mut Hand>, ) { if dragged_option.is_some() { return; @@ -44,7 +48,11 @@ pub fn card_drag_start( commands .entity(event.entity) .insert(DraggedCard) - .remove_parent_in_place(); + .remove::(); + + if let Some(pos) = hand.0.iter().position(|ent| *ent == event.entity) { + hand.0.remove(pos); + } } pub fn card_drag( @@ -59,10 +67,10 @@ pub fn card_drag_end( _: On>, mut commands: Commands, dragged: Single>, - hand: Single>, ) { + commands.trigger(InsertCard(dragged.entity())); commands .entity(dragged.entity()) .remove::() - .set_parent_in_place(hand.entity()); + .insert(CardInHand); } diff --git a/src/card/mod.rs b/src/card/mod.rs index a8bf6bc..28d5309 100644 --- a/src/card/mod.rs +++ b/src/card/mod.rs @@ -1,3 +1,5 @@ +use std::f32; + use crate::animation::transform::AnimatedTransform; use bevy::prelude::*; use drag::*; @@ -10,7 +12,10 @@ pub struct CardPlugin; pub struct Card; #[derive(Component)] -pub struct Hand; +pub struct CardInHand; + +#[derive(Component)] +pub struct Hand(Vec); #[derive(Resource)] pub struct CardImage(Handle); @@ -18,6 +23,9 @@ pub struct CardImage(Handle); #[derive(Event)] pub struct AddCard; +#[derive(EntityEvent)] +pub struct InsertCard(Entity); + #[derive(Event)] pub struct ClearCards; @@ -26,7 +34,8 @@ impl Plugin for CardPlugin { app.add_systems(Startup, hand_setup) .add_systems(Update, card_arrange) .add_observer(card_add) - .add_observer(card_clear); + .add_observer(card_clear) + .add_observer(insert_card); app.insert_resource(MousePosition(Vec3::new(0., 0., 0.))) .add_systems(PreUpdate, mouse_position_system) .add_observer(card_drag_start) @@ -37,7 +46,7 @@ impl Plugin for CardPlugin { fn hand_setup(mut commands: Commands, asset_server: Res) { commands.spawn(( - Hand, + Hand(Vec::new()), Transform::from_xyz(0., -360., 0.), InheritedVisibility::VISIBLE, )); @@ -48,41 +57,79 @@ fn hand_setup(mut commands: Commands, asset_server: Res) { } fn card_arrange( - mut query: Query<(&mut AnimatedTransform, &Sprite), With>, - hand: Single<(Entity, &Children), With>, + mut query: Query<(&mut AnimatedTransform, &Sprite), With>, + hand: Single<(Entity, &Hand, &Transform)>, assets: Res>, ) { - let cards_amount = hand.1.len(); - for (index, card) in hand.1.iter().enumerate() { - let Ok((mut transform, sprite)) = query.get_mut(card) else { + let cards_amount = hand.1.0.len(); + for (index, card) in hand.1.0.iter().enumerate() { + let Ok((mut transform, sprite)) = query.get_mut(card.clone()) else { continue; }; let size = assets.get(&sprite.image).unwrap().size_f32(); let left_boundary = -size.x * (cards_amount as f32) / 2.0 + size.x / 2.0; - transform.translation.x = left_boundary + size.x * index as f32; - transform.translation.y = size.y / 2.0; + transform.translation.x = left_boundary + size.x * index as f32 + hand.2.translation.x; + transform.translation.y = size.y / 2.0 + hand.2.translation.y; } } fn card_add( _: On, mut commands: Commands, - hand: Single>, card_image: Res, + mut hand: Single<&mut Hand>, ) { - commands.spawn(( - Sprite::from_image(card_image.0.clone()), - Transform::from_xyz(0., 0., 0.), - AnimatedTransform::from_xyz(0., 0., 0.), - Card, - ChildOf(hand.entity()), - DraggableCard, - Pickable::default(), - )); + let card = commands + .spawn(( + Sprite::from_image(card_image.0.clone()), + Transform::from_xyz(0., 0., 0.), + AnimatedTransform::from_xyz(0., 0., 0.), + Card, + DraggableCard, + CardInHand, + Pickable::default(), + )) + .id(); + + hand.0.push(card); } -fn card_clear(_: On, mut commands: Commands, children: Single<&Children, With>) { - for card in children.iter() { - commands.entity(card).despawn(); +fn card_clear(_: On, mut commands: Commands, mut hand: Single<&mut Hand>) { + for card in &hand.0 { + let entity = card.clone(); + commands.entity(entity).despawn(); } + hand.0.clear(); +} + +fn insert_card( + event: On, + mut hand_query: Single<(Entity, &mut Hand)>, + transform_query: Query<&Transform, With>, +) { + let Ok(inserted_transform) = transform_query.get(event.0) else { + return; + }; + + let mut decided_index: usize = 0; + let mut decided_diff: f32 = f32::INFINITY; + + for (index, card) in hand_query.1.0.iter().enumerate() { + let Ok(card_transform) = transform_query.get(card.clone()) else { + continue; + }; + + let calculated_diff = + (inserted_transform.translation - card_transform.translation).length(); + + if decided_diff > calculated_diff { + decided_diff = calculated_diff; + decided_index = index; + } + } + + if let Some(pos) = hand_query.1.0.iter().position(|ent| *ent == event.0) { + hand_query.1.0.remove(pos); + } + hand_query.1.0.insert(decided_index, event.0); } diff --git a/src/grid.rs b/src/grid.rs new file mode 100644 index 0000000..b44db40 --- /dev/null +++ b/src/grid.rs @@ -0,0 +1,3 @@ +use bevy::prelude::*; + +pub struct GridPlugin; diff --git a/src/main.rs b/src/main.rs index a8fd8f3..4a2ddbb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,17 +4,18 @@ mod animation; mod buttons; mod card; mod dev_tools; +mod grid; mod turns; fn main() { App::new() .add_plugins(( - DefaultPlugins, - turns::TurnSystemPlugin, - card::CardPlugin, - dev_tools::DevToolsPlugin, - buttons::ButtonPlugin, animation::AnimationPlugin, + buttons::ButtonPlugin, + card::CardPlugin, + DefaultPlugins, + dev_tools::DevToolsPlugin, + turns::TurnSystemPlugin, )) .add_systems(Startup, setup) .run();