generated from 2ndbeam/bevy-template
feat: Implemented Inventory.find_free_space
- Added tests for find_free_space
This commit is contained in:
parent
13dd936044
commit
5f59e02788
3 changed files with 120 additions and 1 deletions
|
|
@ -1,3 +1,5 @@
|
|||
use std::mem::swap;
|
||||
|
||||
use bevy::prelude::*;
|
||||
|
||||
#[derive(Component, Clone)]
|
||||
|
|
@ -32,4 +34,16 @@ impl Item {
|
|||
|
||||
!rect.intersect(other_rect).is_empty()
|
||||
}
|
||||
|
||||
/// Swap size.x with size.y
|
||||
pub fn swap_size(&mut self) {
|
||||
swap(&mut self.size.x, &mut self.size.y);
|
||||
}
|
||||
|
||||
/// Get clone of item with swapped size
|
||||
pub fn clone_swapped(&self) -> Self {
|
||||
let mut new = self.clone();
|
||||
new.swap_size();
|
||||
new
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,4 +53,39 @@ impl Inventory {
|
|||
.collect::<Vec<Entity>>();
|
||||
self.can_fit(item_query, children.as_slice(), *size, queried_position)
|
||||
}
|
||||
|
||||
fn find_free_space_inner(
|
||||
&self,
|
||||
item_query: Query<&item::Item>,
|
||||
contained_items: &[Entity],
|
||||
queried_size: UVec2,
|
||||
was_swapped: bool,
|
||||
) -> Option<(UVec2, bool)> {
|
||||
let Some(UVec2 {x: tries_x, y: tries_y}) = self.size.checked_sub(queried_size) else {
|
||||
return None;
|
||||
};
|
||||
for x in 0..=tries_x {
|
||||
for y in 0..=tries_y {
|
||||
let tested_pos = UVec2::new(x, y);
|
||||
if self.can_fit(item_query, contained_items, queried_size, tested_pos) {
|
||||
return Some((tested_pos, was_swapped));
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
pub fn find_free_space(
|
||||
&self,
|
||||
item_query: Query<&item::Item>,
|
||||
contained_items: &[Entity],
|
||||
queried_size: UVec2,
|
||||
) -> Option<(UVec2, bool)> {
|
||||
let result = self.find_free_space_inner(item_query, contained_items, queried_size, false);
|
||||
if result.is_some() {
|
||||
return result;
|
||||
}
|
||||
let swapped_size = UVec2::new(queried_size.y, queried_size.x);
|
||||
self.find_free_space_inner(item_query, contained_items, swapped_size, true)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue