diff --git a/src/asset_preloader/checker.rs b/src/asset_preloader/checker.rs new file mode 100644 index 0000000..11df930 --- /dev/null +++ b/src/asset_preloader/checker.rs @@ -0,0 +1,50 @@ +use bevy::prelude::{Resource, Asset}; +use crate::asset_preloader::preloader::*; +use std::any::type_name; + + +#[derive(Resource)] +pub struct AssetPreloadChecker + where T : Asset +{ + pub data: Vec, + typename: String +} + +pub struct AssetPreloadCheckerBuilder + where T: Asset +{ + data : AssetPreloadChecker +} + +impl AssetPreloadChecker{ + pub(crate) fn build(asset_preload: &mut AssetPreload) -> AssetPreloadCheckerBuilder + { + let checker = AssetPreloadChecker::new(); + + asset_preload.0.insert(checker.typename.clone(), false); + + AssetPreloadCheckerBuilder{ + data: checker + } + } + + fn new() -> Self{ + AssetPreloadChecker + { + data: Vec::new(), + typename: type_name::().to_string() + } + } +} + +impl AssetPreloadCheckerBuilder{ + pub fn finish(self) -> AssetPreloadChecker { + self.data + } + + pub fn map_vec<'a, F>(&'a mut self, mut f: F) + where F: FnMut(&mut Vec) + 'a{ + f(&mut self.data.data); + } +} diff --git a/src/asset_preloader/mod.rs b/src/asset_preloader/mod.rs new file mode 100644 index 0000000..29c8a8d --- /dev/null +++ b/src/asset_preloader/mod.rs @@ -0,0 +1,15 @@ +use bevy::prelude::*; +use preloader::*; +use checker::*; + +pub mod preloader; +pub mod checker; + +pub(crate) fn check_preload_status(gl_preloader: Res) { + todo!(); +} + +pub(crate) fn check_loader_status(loader: Res>) + where T: Asset{ + todo!(); +} diff --git a/src/asset_preloader/preloader.rs b/src/asset_preloader/preloader.rs new file mode 100644 index 0000000..d68d26a --- /dev/null +++ b/src/asset_preloader/preloader.rs @@ -0,0 +1,16 @@ +use std::collections::HashMap; +use bevy::prelude::Resource; + +pub enum AssetPreloadState{ + Loading, + Ready +} + +#[derive(Resource)] +pub(crate) struct AssetPreload(pub(crate) HashMap); + +impl AssetPreload{ + pub(crate) fn new() -> Self{ + AssetPreload(HashMap::new()) + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 721f641..5ea35aa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,16 +13,44 @@ pub mod hand; pub mod animal; pub mod properties; pub mod plugins; +pub mod asset_preloader; -#[derive(Component)] +/*#[derive(Component)] pub struct JustUpdated; #[derive(Resource)] pub struct Systems { pub update_hand_dimensions: SystemId +}*/ + +pub fn setup(mut commands: Commands,asset_server: Res) { + let hand_img: Handle = asset_server.load("sprites/hand_9s.png"); + + commands.spawn(Camera2d); + commands.spawn( + ( + Hand{name: "Rendo".to_string()}, + Sprite { + image: hand_img, + image_mode: SpriteImageMode::Sliced(TextureSlicer { + border: BorderRect::square(4.), + center_scale_mode: SliceScaleMode::Stretch, + sides_scale_mode: SliceScaleMode::Stretch, + ..default() + }), + ..default() + }, + Transform::from_xyz(0., -300., 0.) + ) + ); } -pub fn setup( +pub fn setup_board() +{ + +} + +/*pub fn setup( mut commands: Commands, asset_server: Res, ) { @@ -50,12 +78,12 @@ pub fn setup( pub fn test_setup_hand( mut commands: Commands, asset_server: Res, - systems: Res, + //systems: Res, query: Single> ) { let hand_id = query.into_inner(); for _ in 0..4 { - create_card(&mut commands, &asset_server, Some(hand_id), &systems); + create_card(&mut commands, &asset_server, Some(hand_id)); } } @@ -63,7 +91,7 @@ pub fn create_card( commands: &mut Commands, asset_server: &Res, hand_entity: Option, - systems: &Res + //systems: &Res ) { let mut card = commands.spawn(( Card, @@ -74,33 +102,31 @@ pub fn create_card( if let Some(hand) = hand_entity { card.set_parent(hand); commands.entity(hand).insert(JustUpdated); - commands.run_system(systems.update_hand_dimensions); + //commands.run_system(systems.update_hand_dimensions); } } -// TODO: replace this const with getting asset dimensions from Assets -const CARD_SPRITE_SIZE: Vec2 = Vec2::new(128., 192.); - pub fn update_hand_dimensions( mut commands: Commands, p_query: Single<(Entity, &mut Sprite, &Children), (Added, With)>, mut c_query: Query<(&mut Transform, &Sprite), (With, Without)>, + assets: Res> ) { let mut hand = p_query.into_inner(); - let size = hand.2.iter().count(); - let hor_margin = 8.; - let ver_margin = 8.; - let sprite_size = CARD_SPRITE_SIZE; - let hand_total_width = (sprite_size.x + hor_margin) * (size as f32); - let hand_height = ver_margin * 2. + sprite_size.y; - let hand_offset = (hand_total_width - sprite_size.x - hor_margin) / 2.; - - for (index, &child_id) in hand.2.iter().enumerate() { + let mut counter = 0.; + let mut hand_total_width = 0.; + let mut hand_height = 0.; + for &child_id in hand.2.iter() { let Ok(mut child) = c_query.get_mut(child_id) else { continue; }; - let offset_x = (sprite_size.x + hor_margin) * (index as f32) - hand_offset; - let offset_y = 0.; - child.0.translation = Vec3::from((Vec2::new(offset_x, offset_y), 1.)); + let sprite_size = assets.get(child.1.image.id()).unwrap().size_f32(); + let hor_margin = Vec2::new(4., 0.); + let ver_margin = Vec2::new(0., 4.); + hand_total_width += sprite_size.x + hor_margin.x; + hand_height = sprite_size.y + ver_margin.y * 2.; + child.0.translation = Vec3::from((ver_margin + (sprite_size + hor_margin) * counter, 0.)); + counter += 1.; } hand.1.custom_size = Some(Vec2::new(hand_total_width, hand_height)); commands.entity(hand.0).remove::(); } +*/ \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 3da7f2e..32d4d59 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ use bevy::prelude::*; use evolution_rs::{ plugins::*, - setup, test_setup_hand + setup, //test_setup_hand, update_hand_dimensions }; @@ -16,7 +16,9 @@ use evolution_rs::{ // P.S. оставляю комменты в коде, потому что так надёжнее, чем сообщениями, которые можно потерять fn main() { App::new() - .add_plugins((DefaultPlugins,BasePropertiesPlugin)) - .add_systems(Startup, (setup, test_setup_hand).chain()) + .add_plugins((DefaultPlugins,BasePropertiesPlugin, asset_preloader::AssetPreloadPlugin)) + + .add_systems(Startup, setup) + //.add_systems(PostStartup, (test_setup_hand, update_hand_dimensions).chain()) .run(); } diff --git a/src/plugins/asset_preloader.rs b/src/plugins/asset_preloader.rs new file mode 100644 index 0000000..c9f0252 --- /dev/null +++ b/src/plugins/asset_preloader.rs @@ -0,0 +1,14 @@ +use bevy::prelude::*; +use crate::asset_preloader::{preloader::AssetPreload,checker::AssetPreloadChecker}; + +pub struct AssetPreloadPlugin; + +impl Plugin for AssetPreloadPlugin { + fn build(&self, app: &mut App) { + //app.init_resource::>(); + let mut preload = AssetPreload::new(); + let image: AssetPreloadChecker = AssetPreloadChecker::build(&mut preload).finish(); + + app.insert_resource(image); + } +} \ No newline at end of file diff --git a/src/plugins.rs b/src/plugins/mod.rs similarity index 96% rename from src/plugins.rs rename to src/plugins/mod.rs index 8852f14..1f901fd 100644 --- a/src/plugins.rs +++ b/src/plugins/mod.rs @@ -2,6 +2,8 @@ use bevy::prelude::{App,Plugin}; use crate::properties::{Property, TestProperty}; +pub mod asset_preloader; + pub struct BasePropertiesPlugin; impl Plugin for BasePropertiesPlugin