Extra2D/examples/scene_graph_demo
ChestnutYueyue e011cea090 style: 调整main.cpp的代码格式和include顺序
- 统一缩进为2个空格
- 调整头文件include顺序
- 移除多余的注释分隔线
2026-03-03 19:41:20 +08:00
..
romfs/shader refactor(renderer): 移除实例化渲染功能及相关代码 2026-03-03 12:18:32 +08:00
README.md feat(场景图系统): 实现完整的场景图模块和示例程序 2026-03-02 04:50:28 +08:00
game_scene.cpp refactor(renderer): 移除实例化渲染功能及相关代码 2026-03-03 12:18:32 +08:00
game_scene.h refactor(renderer): 移除实例化渲染功能及相关代码 2026-03-03 12:18:32 +08:00
main.cpp style: 调整main.cpp的代码格式和include顺序 2026-03-03 19:41:20 +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(0, 1280, 0, 720, -1, 1);
cameraNode->addComponent(camera);
scene->setMainCamera(camera);