Crate bevy_play_card

Crate bevy_play_card 

Source
Expand description

§Using The Crate

§Registering the Plugin

First, you should add BevyCardPlugin, it has a ::default() implementation but can be reconfigured, for example:

app.add_plugins(
  BevyCardPlugin {
      card_consts: CardConsts {
          card_hover_height: 40.0,
          ..default()
      },
      ..default()
  },
);

§Spawning Cards

The basic functionality derived from Bevy Picking is added to Cards automatically. It’s recommended to instantiate a card using card bundles:

commands.spawn((
  CardBundle::new(Transform::default()),
  Sprite {
      image: asset_server.load("your card sprite path here"),
      ..default ()
  },
));

Cards are named automatically by the card_namer. When the Card component is removed from an entity, it’s automatically removed from it’s owner line if it had any.

§Spawning Card Lines

Cards can live on a card line, that’ll allow you to reorder them and keep them neatly organized. All you need to instantiate a card line is:

commands
  .spawn(CardLineBundle::from_transform(Transform::default()));

Or more specifically using from_card_line:

commands
  .spawn(CardLineBundle::from_card_line(
      CardLine::default()
        .with_origin(
          Transform::from_translation(location.into())
              .with_rotation(Quat::from_rotation_z(rotation)),
        )
        .with_max_cards(MAX_CARDS)
        .with_card_origin_gap(60.0),
  ));

§Using Card Line Requests

Although you could interact with the entities directly, you can spare yourself some boilerplate by firing events using MessageWriter<CardLineRequest>, already listened to by the plugin. Each CardLineRequest contains the entity of the line to which it’ll be applied and a request type with relevant additional data if there’s any. The variants of CardLineRequestType are as follows:

VariantRole
RaiseLineRaises the card line to it’s relative up
LowerLineLowers the card line back to place after being raised
AddToLineInserts the card to the line if within capacity
RemoveFromLineRemoves the card from the line if it was there
BatchAddToLineInserts the cards to the line if within capacity, starting from the first
BatchRemoveFromLineRemoves the cards from the line if they were there
RemoveAllCardsFromLineRemoves all the cards in the line

§Card Tags

Cards are being tagged for easier queries when they’re hovered, picked and dragged. Hovered and Dragged are removed once the status is done, Picked is toggled by clicking. This way you can, for example, get all hovered card with queries like: Query<&Card, With<Hovered>>

TagVisually
HoveredThe card would hover up a bit
DraggedThe card would follow your cursor, ignoring line movements, going back to place once released
PickedThe card would stay on hover height, ignoring the cursor leaving its area

§Workflow Example

Let’s spawn a line and add a few cards to it, First, let’s spawn a defaultly-configured line in the middle of the screen.

let line_entity = commands
  .spawn(CardLineBundle::from_transform(Transfrom::default())).id();

Now, let’s spawn three cards, sending a request to add each to a line. Sending the requests separately ensures the line stays within capacity, leaving out the last cards to be spawned if any. The shape of the loop is as follows:

for _ in 0..3 {
  let card_entity = commands.spawn(( ... )).id();
  card_line_request_writer.write(CardLineRequest { ... });
}

An example for card spawning would be:

let card_entity = commands
  .spawn((
      Sprite {
        image: asset_server.load("path to your card sprite here"),
        ..default()
      },
      CardBundle::new(Transform::default()),
    )).id();

With the appropriate addition request:

  card_line_request_writer.write(CardLineRequest {
    line: line_entity,
    request_type: CardLineRequestType::AddToLine { card_entity },
  });

Ending up with:

let line_entity = commands
  .spawn(CardLineBundle::from_transform(Transfrom::default())).id();
for _ in 0..3 {
  let card_entity = commands
      .spawn((
        Sprite {
          image: asset_server.load("path to your card sprite here"),
          ..default()
        },
        CardBundle::new(Transform::default()),
      )).id();
  card_line_request_writer.write(CardLineRequest {
    line: line_entity,
    request_type: CardLineRequestType::AddToLine { card_entity },
  });
}

Modules§

bevy_card_plugin
cards
consts
macros
prelude
trait_unions
utilities

Macros§

plugin_for_implementors_of_trait
trait_union