fantasy-craft 0.0.2

A 2D / 2.5D game engine built on top of Macroquad and Hecs for the Foxvoid Ecosystem
Documentation
use hecs::Entity;
use macroquad::prelude::*;
use serde::Deserialize;
use serde_json::Value;
use crate::core::context::Context;
use crate::scene::scene_loader::ComponentLoader;

#[derive(Debug)]
pub struct CameraComponent {
    pub lerp_factor: f32,
    pub zoom: f32,
    pub camera: Camera2D
}

fn default_lerp() -> f32 { 0.0 }
fn default_zoom() -> f32 { 1.0 }

#[derive(Deserialize, Debug, Default)]
struct CameraComponentLoaderData {
    #[serde(default="default_lerp")]
    pub lerp_factor: f32,

    #[serde(default="default_zoom")]
    pub zoom: f32
}

pub struct CameraComponentLoader;

impl ComponentLoader for CameraComponentLoader {
    fn load(&self, ctx: &mut Context, entity: Entity, data: &Value) {
        let loader_data: CameraComponentLoaderData = serde_json::from_value(data.clone())
            .unwrap_or_default();

        let component = CameraComponent {
            lerp_factor: loader_data.lerp_factor,
            zoom: loader_data.zoom,
            camera: Camera2D::default()
        };

        ctx.world.insert_one(entity, component).expect("Failed to insert CameraComponent");
    }
}

#[derive(Debug)]
pub struct MainCamera;

pub struct MainCameraLoader;

impl ComponentLoader for MainCameraLoader {
    fn load(&self, ctx: &mut Context, entity: Entity, _data: &Value) {
        ctx.world.insert_one(entity, MainCamera).expect("Failed to insert MainCamera");
    }
}

#[derive(Debug)]
pub struct CameraTarget;

pub struct CameraTargetLoader;

impl ComponentLoader for CameraTargetLoader {
    fn load(&self, ctx: &mut Context, entity: Entity, _data: &Value) {
        ctx.world.insert_one(entity, CameraTarget).expect("Failed to insert CameraTarget");
    }
}