generated from 2ndbeam/bevy-template
ui: Inventory item rotation
- Fixed rotated item position
This commit is contained in:
parent
9a09b4da96
commit
beacc28ace
2 changed files with 48 additions and 29 deletions
|
|
@ -20,7 +20,26 @@ pub struct UiInventorySlot(UVec2);
|
|||
pub struct UiItem(Entity);
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct HoveredItem(Entity);
|
||||
pub struct HoveredItem;
|
||||
|
||||
fn ui_item_node_data(item: &Item) -> (Val, Val, Val, Val, UiTransform) {
|
||||
match item.rotated {
|
||||
true => (
|
||||
percent(50. * (item.size.x as f32 - item.size.y as f32)),
|
||||
percent(50. * (item.size.y as f32 - item.size.x as f32)),
|
||||
percent(100. * item.size.y as f32),
|
||||
percent(100. * item.size.x as f32),
|
||||
UiTransform::from_rotation(Rot2::radians(-FRAC_PI_2)),
|
||||
),
|
||||
false => (
|
||||
auto(),
|
||||
auto(),
|
||||
percent(100. * item.size.x as f32),
|
||||
percent(100. * item.size.y as f32),
|
||||
UiTransform::default(),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn on_slot_over(e: On<Pointer<Over>>, mut query: Query<&mut ImageNode, With<UiInventorySlot>>) {
|
||||
if let Ok(mut image) = query.get_mut(e.event_target()) {
|
||||
|
|
@ -36,7 +55,7 @@ fn on_slot_out(e: On<Pointer<Out>>, mut query: Query<&mut ImageNode, With<UiInve
|
|||
|
||||
fn on_item_over(e: On<Pointer<Over>>, mut commands: Commands, query: Query<Entity, With<UiItem>>) {
|
||||
if let Ok(_) = query.get(e.event_target()) {
|
||||
commands.entity(e.event_target()).insert(HoveredItem(e.event_target()));
|
||||
commands.entity(e.event_target()).insert(HoveredItem);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -95,15 +114,15 @@ fn on_item_drag_drop(
|
|||
}
|
||||
}
|
||||
|
||||
fn on_ui_rotate(
|
||||
event: On<UiRotateEvent>,
|
||||
item_query: Query<&Item>,
|
||||
mut mut_item_query: Query<(&ChildOf, &mut Item)>,
|
||||
pub fn on_ui_rotate(
|
||||
_: On<UiRotateEvent>,
|
||||
mut item_query: Query<&mut Item>,
|
||||
parent_query: Query<&ChildOf>,
|
||||
inventory_query: Query<(&Inventory, Option<&Children>)>,
|
||||
ui_item_query: Query<(&mut UiItem, &mut Node), With<HoveredItem>>,
|
||||
ui_item_query: Query<(&UiItem, &mut UiTransform, &mut Node), With<HoveredItem>>,
|
||||
) {
|
||||
for (mut ui_item, mut node) in ui_item_query {
|
||||
let Ok((item_parent, mut mut_item)) = mut_item_query.get_mut(ui_item.0) else {
|
||||
for (ui_item, mut ui_transform, mut node) in ui_item_query {
|
||||
let Ok(item_parent) = parent_query.get(ui_item.0) else {
|
||||
continue;
|
||||
};
|
||||
let Ok((inventory, children)) = inventory_query.get(item_parent.0) else {
|
||||
|
|
@ -115,7 +134,18 @@ fn on_ui_rotate(
|
|||
None => &[],
|
||||
};
|
||||
|
||||
// TODO
|
||||
if inventory.can_rotate(item_query.as_readonly(), children, ui_item.0) {
|
||||
let Ok(mut item) = item_query.get_mut(ui_item.0) else {
|
||||
continue;
|
||||
};
|
||||
item.rotate();
|
||||
let (left, top, min_width, min_height, new_ui_transform) = ui_item_node_data(&item);
|
||||
node.left = left;
|
||||
node.top = top;
|
||||
node.min_width = min_width;
|
||||
node.min_height = min_height;
|
||||
ui_transform.rotation = new_ui_transform.rotation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -165,7 +195,6 @@ fn inventory_slot_bundle(x: u32, y: u32, image: Handle<Image>) -> impl Bundle {
|
|||
height: percent(100.),
|
||||
grid_column: GridPlacement::start(x as i16 + 1),
|
||||
grid_row: GridPlacement::start(y as i16 + 1),
|
||||
align_items: AlignItems::Start,
|
||||
..default()
|
||||
},
|
||||
Pickable {
|
||||
|
|
@ -178,22 +207,7 @@ fn inventory_slot_bundle(x: u32, y: u32, image: Handle<Image>) -> impl Bundle {
|
|||
}
|
||||
|
||||
fn ui_item_bundle(item: &Item, item_entity: Entity, image: Handle<Image>) -> impl Bundle {
|
||||
let (left, top, min_width, min_height, ui_transform) = match item.rotated {
|
||||
true => (
|
||||
percent(100.),
|
||||
percent(-100.),
|
||||
percent(100. * item.size.y as f32),
|
||||
percent(100. * item.size.x as f32),
|
||||
UiTransform::from_rotation(Rot2::radians(-FRAC_PI_2)),
|
||||
),
|
||||
false => (
|
||||
auto(),
|
||||
auto(),
|
||||
percent(100. * item.size.x as f32),
|
||||
percent(100. * item.size.y as f32),
|
||||
UiTransform::default(),
|
||||
),
|
||||
};
|
||||
let (left, top, min_width, min_height, ui_transform) = ui_item_node_data(item);
|
||||
(
|
||||
UiItem(item_entity),
|
||||
ImageNode {
|
||||
|
|
|
|||
|
|
@ -83,13 +83,17 @@ fn setup_global(mut commands: Commands) {
|
|||
|
||||
impl Plugin for ExpeditionPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_plugins(input::InputAssetPlugin::<InputAction>::default())
|
||||
app.add_plugins((
|
||||
input::InputAssetPlugin::<InputAction>::default(),
|
||||
input::InputAssetPlugin::<UiAction>::default(),
|
||||
))
|
||||
.init_state::<GameState>()
|
||||
.insert_resource(ui::WindowSize::default())
|
||||
.add_systems(Startup, (player::setup_player, setup_global))
|
||||
.add_systems(Update, (
|
||||
player::handle_input,
|
||||
ui::update_window_size,
|
||||
ui::handle_input,
|
||||
insert_entity_name,
|
||||
))
|
||||
.add_systems(OnEnter(GameState::Inventory), inventory::ui::setup_ui_inventory)
|
||||
|
|
@ -99,6 +103,7 @@ impl Plugin for ExpeditionPlugin {
|
|||
.register_type::<inventory::item::Item>()
|
||||
.register_type::<inventory::ui::UiItem>()
|
||||
.register_type::<inventory::ui::UiInventorySlot>()
|
||||
.register_type::<inventory::ui::UiInventory>();
|
||||
.register_type::<inventory::ui::UiInventory>()
|
||||
.add_observer(inventory::ui::on_ui_rotate);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue