use new spawn api

This commit is contained in:
2025-04-29 19:55:40 +02:00
parent 11568d57ed
commit 5cc97da98b
8 changed files with 265 additions and 282 deletions

View File

@@ -2,7 +2,7 @@ use super::{BackbackSwapEvent, Backpack, UiHeadState};
use crate::{
GameState, global_observer, heads::HeadsImages, loading_assets::UIAssets, sounds::PlaySound,
};
use bevy::prelude::*;
use bevy::{ecs::spawn::SpawnIter, prelude::*};
static HEAD_SLOTS: usize = 5;
@@ -57,31 +57,34 @@ pub fn plugin(app: &mut App) {
}
fn setup(mut commands: Commands, assets: Res<UIAssets>) {
commands
.spawn((
Name::new("backpack-ui"),
BackpackMarker,
Visibility::Hidden,
Node {
position_type: PositionType::Absolute,
top: Val::Px(20.0),
right: Val::Px(20.0),
height: Val::Px(74.0),
..default()
},
))
.with_children(|parent| {
for i in 0..HEAD_SLOTS {
commands.spawn((
Name::new("backpack-ui"),
BackpackMarker,
Visibility::Hidden,
Node {
position_type: PositionType::Absolute,
top: Val::Px(20.0),
right: Val::Px(20.0),
height: Val::Px(74.0),
..default()
},
Children::spawn(SpawnIter((0..HEAD_SLOTS).map({
let bg = assets.head_bg.clone();
let regular = assets.head_regular.clone();
let selector = assets.head_selector.clone();
let damage = assets.head_damage.clone();
move |i| {
spawn_head_ui(
parent,
assets.head_bg.clone(),
assets.head_regular.clone(),
assets.head_selector.clone(),
assets.head_damage.clone(),
bg.clone(),
regular.clone(),
selector.clone(),
damage.clone(),
i,
);
)
}
});
}))),
));
commands.spawn((
Name::new("backpack-head-count-ui"),
@@ -105,26 +108,25 @@ fn setup(mut commands: Commands, assets: Res<UIAssets>) {
}
fn spawn_head_ui(
parent: &mut ChildSpawnerCommands,
bg: Handle<Image>,
regular: Handle<Image>,
selector: Handle<Image>,
damage: Handle<Image>,
head_slot: usize,
) {
) -> impl Bundle {
const SIZE: f32 = 90.0;
const DAMAGE_SIZE: f32 = 74.0;
parent
.spawn((Node {
(
Node {
position_type: PositionType::Relative,
justify_content: JustifyContent::Center,
align_items: AlignItems::Center,
width: Val::Px(SIZE),
..default()
},))
.with_children(|parent| {
parent.spawn((
},
children![
(
Name::new("selector"),
Node {
position_type: PositionType::Absolute,
@@ -134,16 +136,16 @@ fn spawn_head_ui(
Visibility::Hidden,
ImageNode::new(selector).with_flip_y(),
HeadSelector(head_slot),
));
parent.spawn((
),
(
Name::new("bg"),
Node {
position_type: PositionType::Absolute,
..default()
},
ImageNode::new(bg),
));
parent.spawn((
),
(
Name::new("head"),
Node {
position_type: PositionType::Absolute,
@@ -152,43 +154,40 @@ fn spawn_head_ui(
ImageNode::default(),
Visibility::Hidden,
HeadImage(head_slot),
));
parent.spawn((
),
(
Name::new("rings"),
Node {
position_type: PositionType::Absolute,
..default()
},
ImageNode::new(regular),
));
parent
.spawn((
Name::new("health"),
),
(
Name::new("health"),
Node {
height: Val::Px(DAMAGE_SIZE),
width: Val::Px(DAMAGE_SIZE),
..default()
},
children![(
Name::new("damage_ring"),
HeadDamage(head_slot),
Node {
height: Val::Px(DAMAGE_SIZE),
width: Val::Px(DAMAGE_SIZE),
position_type: PositionType::Absolute,
display: Display::Block,
overflow: Overflow::clip(),
top: Val::Px(0.),
left: Val::Px(0.),
right: Val::Px(0.),
height: Val::Percent(0.),
..default()
},
))
.with_children(|parent| {
parent
.spawn((
Name::new("damage_ring"),
HeadDamage(head_slot),
Node {
position_type: PositionType::Absolute,
display: Display::Block,
overflow: Overflow::clip(),
top: Val::Px(0.),
left: Val::Px(0.),
right: Val::Px(0.),
height: Val::Percent(0.),
..default()
},
))
.with_child(ImageNode::new(damage));
});
});
children![ImageNode::new(damage)]
)]
)
],
)
}
fn update_visibility(