use bevy::prelude::*; pub struct CardPlugin; #[derive(Component)] pub struct Card; #[derive(Component)] pub struct Hand; #[derive(Resource)] pub struct CardImage(Handle); impl Plugin for CardPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, (hand_setup, test_card_setup).chain()) .add_systems(Update, card_arrange); } } fn hand_setup(mut commands: Commands, asset_server: Res) { commands.spawn((Hand, Transform::from_xyz(0., -360., 0.))); commands.insert_resource(CardImage( asset_server.load::("sprites/cards/units/fosma.png"), )); } fn test_card_setup( mut commands: Commands, hand: Single>, card_image: Res, ) { commands.spawn(( Sprite::from_image(card_image.0.clone()), Transform::from_xyz(0., 0., 0.), Card, ChildOf(hand.entity()), )); commands.spawn(( Sprite::from_image(card_image.0.clone()), Transform::from_xyz(0., 0., 0.), Card, ChildOf(hand.entity()), )); commands.spawn(( Sprite::from_image(card_image.0.clone()), Transform::from_xyz(0., 0., 0.), Card, ChildOf(hand.entity()), )); } fn card_arrange( query: Query<(&mut Transform, &Sprite, &ChildOf), With>, hand: Single<(Entity, &Children), With>, assets: Res>, ) { let cards_amount = hand.1.len(); let mut card_id = 0.; for (mut transform, sprite, child_of) in query { if child_of.parent() != hand.0 { 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 * card_id; transform.translation.y = size.y / 2.0; card_id += 1.0; } }