Extra2D/examples/scene_graph_demo
ChestnutYueyue 3686ba35c1 feat(camera): 为相机组件添加简化的正交投影设置方法
添加一个接受宽高参数的 `setOrtho` 重载方法,以简化常见2D场景下的相机设置。同时更新示例代码以使用新方法,使代码更简洁易读。
2026-03-16 22:03:25 +08:00
..
romfs refactor(shader): 合并分离的着色器文件为单一GLSL文件 2026-03-16 20:38:03 +08:00
README.md feat(camera): 为相机组件添加简化的正交投影设置方法 2026-03-16 22:03:25 +08:00
game_scene.cpp feat(camera): 为相机组件添加简化的正交投影设置方法 2026-03-16 22:03:25 +08:00
game_scene.h refactor(renderer): 移除实例化渲染功能及相关代码 2026-03-03 12:18:32 +08:00
main.cpp feat: 添加spdlog日志库并本地化日志消息 2026-03-03 20:32:51 +08:00
xmake.lua refactor(renderer): 移除实例化渲染功能及相关代码 2026-03-03 12:18:32 +08:00

README.md

场景图系统示例 (Scene Graph Demo)

这个示例演示了 Extra2D 引擎场景图模块的核心功能。

功能演示

1. Director 场景管理

  • 通过 SceneModule 获取 Director
  • 使用 runScene() 启动场景

2. Scene 场景容器

  • 继承 Scene 类创建自定义场景
  • 实现 onEnter()onExit() 生命周期方法
  • update() 中处理场景级逻辑

3. Node 节点层级

  • 创建自定义节点类(PlayerNode, RotatingDecoration
  • 使用 addChild() 构建节点树
  • 节点变换自动继承父节点

4. Component 组件系统

  • TransformComponent: 位置、旋转、缩放、锚点
  • SpriteRenderer: 2D 精灵渲染
  • CameraComponent: 相机投影和视图

5. Transform 变换(含锚点)

  • 归一化锚点设置 [0,1]
  • 锚点影响旋转中心和位置参考点
  • 世界变换自动计算

运行效果

  • 蓝色方块(玩家)沿圆周运动
  • 8个彩色小方块围绕中心旋转
  • 每个小方块还有自转动画

构建和运行

# 配置(启用示例)
xmake f -p mingw --examples=true

# 构建
xmake

# 运行
./build/examples/scene_graph_demo/scene_graph_demo.exe

代码结构

scene_graph_demo/
├── main.cpp          # 程序入口
├── game_scene.h      # 场景和节点类定义
├── game_scene.cpp    # 场景和节点实现
└── xmake.lua         # 构建配置

关键 API

创建场景

class GameScene : public Scene {
public:
    void onEnter() override;
    void update(float dt) override;
};

auto scene = makePtr<GameScene>();
director->runScene(scene);

创建节点

auto node = makePtr<Node>();
node->setPosition(100, 200);
node->setAnchor(0.5f, 0.5f);  // 中心锚点
node->setSize(64, 64);
scene->addChild(node);

添加组件

auto sprite = makePtr<SpriteRenderer>();
sprite->setColor(Color::Red);
node->addComponent(sprite);

设置相机

auto camera = makePtr<CameraComponent>();
camera->setOrtho(1280, 720);
cameraNode->addComponent(camera);
scene->setMainCamera(camera);