fantasy_craft/camera/camera2d/
components.rs1use hecs::Entity;
2use macroquad::prelude::*;
3use serde::Deserialize;
4use serde_json::Value;
5use crate::core::context::Context;
6use crate::scene::scene_loader::ComponentLoader;
7
8#[derive(Debug)]
9pub struct CameraComponent {
10 pub lerp_factor: f32,
11 pub zoom: f32,
12 pub camera: Camera2D
13}
14
15fn default_lerp() -> f32 { 0.0 }
16fn default_zoom() -> f32 { 1.0 }
17
18#[derive(Deserialize, Debug, Default)]
19struct CameraComponentLoaderData {
20 #[serde(default="default_lerp")]
21 pub lerp_factor: f32,
22
23 #[serde(default="default_zoom")]
24 pub zoom: f32
25}
26
27pub struct CameraComponentLoader;
28
29impl ComponentLoader for CameraComponentLoader {
30 fn load(&self, ctx: &mut Context, entity: Entity, data: &Value) {
31 let loader_data: CameraComponentLoaderData = serde_json::from_value(data.clone())
32 .unwrap_or_default();
33
34 let component = CameraComponent {
35 lerp_factor: loader_data.lerp_factor,
36 zoom: loader_data.zoom,
37 camera: Camera2D::default()
38 };
39
40 ctx.world.insert_one(entity, component).expect("Failed to insert CameraComponent");
41 }
42}
43
44#[derive(Debug)]
45pub struct MainCamera;
46
47pub struct MainCameraLoader;
48
49impl ComponentLoader for MainCameraLoader {
50 fn load(&self, ctx: &mut Context, entity: Entity, _data: &Value) {
51 ctx.world.insert_one(entity, MainCamera).expect("Failed to insert MainCamera");
52 }
53}
54
55#[derive(Debug)]
56pub struct CameraTarget;
57
58pub struct CameraTargetLoader;
59
60impl ComponentLoader for CameraTargetLoader {
61 fn load(&self, ctx: &mut Context, entity: Entity, _data: &Value) {
62 ctx.world.insert_one(entity, CameraTarget).expect("Failed to insert CameraTarget");
63 }
64}