ShitEngine 1.4.2
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
Tilemap.h
浏览该文件的文档.
1#pragma once
2#include "../Core/Core.h"
3#include "../Math.h"
4#include "Component.h"
5#include "RendererComponent.h"
6#include <SDL3/SDL_rect.h>
7#include <string>
8#include <vector>
9
10namespace Shit {
11 class CameraComponent;
12
27 class SHIT_API SHIT_REFLECT(BlackList) Tilemap : public RendererComponent {
29 public:
31 ~Tilemap() override;
32
33 void onAfterDeserialize() override;
34 void onFieldChanged(const std::string& fieldName) override;
35
37 void onRender(SDL_Renderer* renderer, const CameraComponent* camera) const override;
39 SDL_FRect getGlobalBounds() override;
40
41 // --- 配置 ---
42 void setTexturePath(const std::string& path);
43 const std::string& getTexturePath() const { return m_texturePath; }
44
45 void setTileSize(int w, int h);
46 int getTileWidth() const { return m_tileWidth; }
47 int getTileHeight() const { return m_tileHeight; }
48
49 void setGridSize(int cols, int rows);
50 int getGridWidth() const { return m_gridWidth; }
51 int getGridHeight() const { return m_gridHeight; }
52
53 void setTileWorldSize(const Vector2& size);
54 const Vector2& getTileWorldSize() const { return m_tileWorldSize; }
55
56 // --- 网格数据 ---
57 void setTile(int col, int row, int tileId);
58 int getTile(int col, int row) const;
59 void clear();
60 bool isEmpty() const;
61 int getTileCount() const;
62
63 // --- 序列化载体(m_gridData 供反射持久化;内部使用) ---
64 const std::string& getGridData() const { return m_gridData; }
65 void setGridData(const std::string& data);
66
67 private:
68 friend class TilemapDrawTool; // 编辑器刷图工具直接访问网格
69
70 // 反射可序列化字段
71 SHIT_META(({.displayName = "Texture", .tooltip = "瓦片集纹理路径(sprite sheet)"}))
72 std::string m_texturePath;
73 SHIT_META(({.displayName = "Tile Width", .tooltip = "单个瓦片在纹理中的像素宽度"}))
74 int m_tileWidth = 32;
75 SHIT_META(({.displayName = "Tile Height", .tooltip = "单个瓦片在纹理中的像素高度"}))
76 int m_tileHeight = 32;
77 SHIT_META(({.displayName = "Grid Width", .tooltip = "网格列数"}))
78 int m_gridWidth = 10;
79 SHIT_META(({.displayName = "Grid Height", .tooltip = "网格行数"}))
80 int m_gridHeight = 10;
81 SHIT_META(({.displayName = "Tile World Size", .tooltip = "每格世界尺寸(默认=瓦片像素;留 0 自动)"}))
82 Vector2 m_tileWorldSize{ 0.0f, 0.0f };
83 // 序列化载体:逗号分隔瓦片 id(含尺寸头 [cols,rows,...]),随 .scene 持久化
84 SHIT_META(({.displayName = "Grid Data", .tooltip = "序列化载体,由刷图工具自动维护", .readOnly = true}))
85 std::string m_gridData;
86
87 // 运行时网格(非反射,从 m_gridData 解析而来)
88 SHIT_META(Disable)
89 std::vector<int> m_tiles;
90
92 void parseGridData();
94 void syncGridData();
96 void ensureTileBuffer();
97 };
98}
#define SHIT_API
定义 Core.h:14
#define SHIT_REFLECT_BODY(Type)
定义 Macros.h:89
#define SHIT_REFLECT(Mode)
定义 Macros.h:86
#define SHIT_META(...)
定义 Macros.h:95
相机组件,定义"从哪个角度观察世界"
定义 CameraComponent.h:16
SDL_FRect getGlobalBounds() override
世界坐标轴对齐包围盒(覆盖整个网格)
int getTileWidth() const
定义 Tilemap.h:46
int getTileHeight() const
定义 Tilemap.h:47
void setTileSize(int w, int h)
设置单个瓦片纹理像素尺寸
const Vector2 & getTileWorldSize() const
定义 Tilemap.h:54
void setGridSize(int cols, int rows)
调整网格行列数(保留重叠部分数据)
const std::string & getGridData() const
定义 Tilemap.h:64
int getTileCount() const
当前瓦片数量(非空格)
void setTileWorldSize(const Vector2 &size)
每格世界尺寸(默认=瓦片像素)
int getGridWidth() const
定义 Tilemap.h:50
int getTile(int col, int row) const
读取瓦片(越界返回 -1)
friend class TilemapDrawTool
定义 Tilemap.h:68
void setTile(int col, int row, int tileId)
放置瓦片(-1 擦除)
void onAfterDeserialize() override
反序列化完成后回调(Prefab::apply 逐组件调用一次,字段已写入)。 用于重建"直写字段绕过了 setter、无法自动触发的引擎状态"(如精灵纹理加载)。
~Tilemap() override
void onFieldChanged(const std::string &fieldName) override
检查器直接写反射字段后回调(字段名)。用于绕过 setter 的直写完成后 重新同步引擎状态(如 Box2D 刚体/形状)。默认无操作。
int getGridHeight() const
定义 Tilemap.h:51
const std::string & getTexturePath() const
定义 Tilemap.h:43
void clear()
全部擦除
bool isEmpty() const
是否全空
void setTexturePath(const std::string &path)
void onRender(SDL_Renderer *renderer, const CameraComponent *camera) const override
按相机绘制网格(RendererComponent 纯虚实现)
void setGridData(const std::string &data)
反序列化用:解析外部字符串(含尺寸头)
定义 AnimationClip.h:12
glm::vec2 Vector2
定义 Math.h:7