use bevy::ecs::system::SystemParam; use bevy::prelude::*; use crate::assets::AssetHandles; use crate::entities::lifecycle::{GameEntity, Player}; use crate::system::camera::ChaseCam; use crate::system::graphics::LAYER_CREATURE; use crate::world::level_map::GridPosition; const PLAYER_SPRITE: usize = 2; #[derive(SystemParam)] pub struct EntitySpawner<'w, 's> { pub commands: Commands<'w, 's>, pub handles: Res<'w, AssetHandles>, } impl<'w, 's> EntitySpawner<'w, 's> { pub fn spawn_player(&mut self, grid_position: UVec2) { let mut entity = self.commands.spawn(); entity .insert(ChaseCam) .insert(GameEntity) .insert(Player) .insert(GridPosition(grid_position)); entity.insert_bundle(SpriteSheetBundle { texture_atlas: self.handles.atlas("creatures"), transform: Transform::from_translation(grid_position.as_vec2().extend(LAYER_CREATURE)), sprite: TextureAtlasSprite { index: PLAYER_SPRITE, ..Default::default() }, ..Default::default() }); } }