Skip to content
Snippets Groups Projects
spawner.rs 966 B
Newer Older
Louis's avatar
Louis committed
use bevy::ecs::system::SystemParam;
use bevy::prelude::*;

use crate::assets::AssetHandles;
use crate::entities::lifecycle::GameEntity;
use crate::system::camera::ChaseCam;
use crate::system::graphics::LAYER_CREATURE;
use crate::world::level_map::GridPosition;
Louis's avatar
Louis committed

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(GridPosition(grid_position));
Louis's avatar
Louis committed

		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()
		});
	}
}