bevy_entitiles 0.11.0

A 2d tilemap library for bevy. With many useful algorithms/tools built in.
Documentation
use std::marker::PhantomData;

use bevy::{
    asset::AssetServer,
    ecs::{bundle::Bundle, system::EntityCommands},
    utils::HashMap,
};

use crate::tiled::{
    resources::{TiledAssets, TiledCustomTileInstance},
    xml::{layer::TiledObjectInstance, property::ClassInstance},
};

pub type TiledObjectRegistry = HashMap<String, Box<dyn PhantomTiledObjectTrait>>;

pub trait TiledObject {
    fn initialize(
        commands: &mut EntityCommands,
        object_instance: &TiledObjectInstance,
        components: &HashMap<String, ClassInstance>,
        asset_server: &AssetServer,
        tiled_assets: &TiledAssets,
    );
}

pub struct PhantomTiledObject<T: TiledObject + Bundle> {
    marker: PhantomData<T>,
}

impl<T: TiledObject + Bundle> PhantomTiledObject<T> {
    pub fn new() -> Self {
        Self {
            marker: PhantomData,
        }
    }
}

pub trait PhantomTiledObjectTrait {
    fn initialize(
        &self,
        commands: &mut EntityCommands,
        object_instance: &TiledObjectInstance,
        components: &HashMap<String, ClassInstance>,
        asset_server: &AssetServer,
        tiled_assets: &TiledAssets,
    );
}

impl<T: TiledObject + Bundle> PhantomTiledObjectTrait for PhantomTiledObject<T> {
    fn initialize(
        &self,
        commands: &mut EntityCommands,
        object_instance: &TiledObjectInstance,
        components: &HashMap<String, ClassInstance>,
        asset_server: &AssetServer,
        tiled_assets: &TiledAssets,
    ) {
        T::initialize(
            commands,
            object_instance,
            components,
            asset_server,
            tiled_assets,
        );
    }
}

pub type TiledCustomTileRegistry = HashMap<String, Box<dyn PhantomTiledCustomTileTrait>>;

pub trait TiledCustomTile {
    fn initialize(
        commands: &mut EntityCommands,
        custom_tile_instance: &TiledCustomTileInstance,
        components: &HashMap<String, ClassInstance>,
        asset_server: &AssetServer,
        tiled_assets: &TiledAssets,
    );
}

pub struct PhantomTiledCustomTile<T: TiledCustomTile + Bundle> {
    marker: PhantomData<T>,
}

impl<T: TiledCustomTile + Bundle> PhantomTiledCustomTile<T> {
    pub fn new() -> Self {
        Self {
            marker: PhantomData,
        }
    }
}

pub trait PhantomTiledCustomTileTrait {
    fn initialize(
        &self,
        commands: &mut EntityCommands,
        custom_tile_instance: &TiledCustomTileInstance,
        components: &HashMap<String, ClassInstance>,
        asset_server: &AssetServer,
        tiled_assets: &TiledAssets,
    );
}

impl<T: TiledCustomTile + Bundle> PhantomTiledCustomTileTrait for PhantomTiledCustomTile<T> {
    fn initialize(
        &self,
        commands: &mut EntityCommands,
        custom_tile_instance: &TiledCustomTileInstance,
        components: &HashMap<String, ClassInstance>,
        asset_server: &AssetServer,
        tiled_assets: &TiledAssets,
    ) {
        T::initialize(
            commands,
            custom_tile_instance,
            components,
            asset_server,
            tiled_assets,
        );
    }
}

pub trait TiledClass {
    fn create(classes: &HashMap<String, ClassInstance>) -> Self;
}

pub trait TiledEnum {
    fn get_identifier(ident: &str) -> Self;
}