172 lines
3.6 KiB
Markdown
172 lines
3.6 KiB
Markdown
|
|
# Extra2D API 教程 - 02. 场景系统
|
|||
|
|
|
|||
|
|
## 场景基础
|
|||
|
|
|
|||
|
|
场景(Scene)是游戏的基本组织单位,负责管理节点和渲染。
|
|||
|
|
|
|||
|
|
### 创建场景
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
#include <extra2d/extra2d.h>
|
|||
|
|
|
|||
|
|
using namespace extra2d;
|
|||
|
|
|
|||
|
|
class MyScene : public Scene {
|
|||
|
|
public:
|
|||
|
|
// 场景进入时调用
|
|||
|
|
void onEnter() override {
|
|||
|
|
// 必须先调用父类的 onEnter()
|
|||
|
|
Scene::onEnter();
|
|||
|
|
|
|||
|
|
// 设置背景颜色
|
|||
|
|
setBackgroundColor(Color(0.1f, 0.1f, 0.3f, 1.0f));
|
|||
|
|
|
|||
|
|
E2D_LOG_INFO("场景已进入");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 每帧更新时调用
|
|||
|
|
void onUpdate(float dt) override {
|
|||
|
|
Scene::onUpdate(dt);
|
|||
|
|
// dt 是时间间隔(秒)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 渲染时调用
|
|||
|
|
void onRender(RenderBackend &renderer) override {
|
|||
|
|
Scene::onRender(renderer);
|
|||
|
|
// 绘制自定义内容
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 场景退出时调用
|
|||
|
|
void onExit() override {
|
|||
|
|
// 清理资源
|
|||
|
|
Scene::onExit();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 重要提示
|
|||
|
|
|
|||
|
|
**必须调用 `Scene::onEnter()`**:
|
|||
|
|
```cpp
|
|||
|
|
void onEnter() override {
|
|||
|
|
Scene::onEnter(); // 必须调用!
|
|||
|
|
// 你的初始化代码
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如果不调用,会导致:
|
|||
|
|
- `running_` 状态未设置
|
|||
|
|
- 子节点无法正确注册到空间索引
|
|||
|
|
- 碰撞检测失效
|
|||
|
|
|
|||
|
|
## 场景管理
|
|||
|
|
|
|||
|
|
### 进入场景
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// 进入新场景
|
|||
|
|
app.enterScene(makePtr<MyScene>());
|
|||
|
|
|
|||
|
|
// 替换当前场景(带过渡效果)
|
|||
|
|
app.scenes().replaceScene(
|
|||
|
|
makePtr<PlayScene>(),
|
|||
|
|
TransitionType::Fade, // 淡入淡出
|
|||
|
|
0.25f // 过渡时间(秒)
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 场景过渡类型
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
enum class TransitionType {
|
|||
|
|
None, // 无过渡
|
|||
|
|
Fade, // 淡入淡出
|
|||
|
|
SlideLeft, // 向左滑动
|
|||
|
|
SlideRight, // 向右滑动
|
|||
|
|
SlideUp, // 向上滑动
|
|||
|
|
SlideDown // 向下滑动
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 场景配置
|
|||
|
|
|
|||
|
|
### 视口设置
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
void onEnter() override {
|
|||
|
|
Scene::onEnter();
|
|||
|
|
|
|||
|
|
// 设置视口大小(影响坐标系)
|
|||
|
|
setViewportSize(1280.0f, 720.0f);
|
|||
|
|
|
|||
|
|
// 设置背景颜色
|
|||
|
|
setBackgroundColor(Colors::Black);
|
|||
|
|
|
|||
|
|
// 启用/禁用空间索引
|
|||
|
|
setSpatialIndexingEnabled(true);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 空间索引
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// 获取空间管理器
|
|||
|
|
auto &spatialManager = getSpatialManager();
|
|||
|
|
|
|||
|
|
// 切换空间索引策略
|
|||
|
|
spatialManager.setStrategy(SpatialStrategy::QuadTree); // 四叉树
|
|||
|
|
spatialManager.setStrategy(SpatialStrategy::SpatialHash); // 空间哈希
|
|||
|
|
|
|||
|
|
// 查询所有碰撞
|
|||
|
|
auto collisions = queryCollisions();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 完整示例
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
class GameScene : public Scene {
|
|||
|
|
public:
|
|||
|
|
void onEnter() override {
|
|||
|
|
Scene::onEnter();
|
|||
|
|
|
|||
|
|
// 设置视口和背景
|
|||
|
|
setViewportSize(1280.0f, 720.0f);
|
|||
|
|
setBackgroundColor(Color(0.1f, 0.2f, 0.3f, 1.0f));
|
|||
|
|
|
|||
|
|
// 启用空间索引
|
|||
|
|
setSpatialIndexingEnabled(true);
|
|||
|
|
|
|||
|
|
E2D_LOG_INFO("游戏场景已加载");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void onUpdate(float dt) override {
|
|||
|
|
Scene::onUpdate(dt);
|
|||
|
|
|
|||
|
|
// 检查退出按键
|
|||
|
|
auto &input = Application::instance().input();
|
|||
|
|
if (input.isButtonPressed(SDL_CONTROLLER_BUTTON_START)) {
|
|||
|
|
Application::instance().quit();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void onRender(RenderBackend &renderer) override {
|
|||
|
|
Scene::onRender(renderer);
|
|||
|
|
|
|||
|
|
// 绘制 FPS
|
|||
|
|
auto &app = Application::instance();
|
|||
|
|
std::string fpsText = "FPS: " + std::to_string(app.fps());
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void onExit() override {
|
|||
|
|
E2D_LOG_INFO("游戏场景退出");
|
|||
|
|
Scene::onExit();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 下一步
|
|||
|
|
|
|||
|
|
- [03. 节点系统](03_Node_System.md)
|
|||
|
|
- [04. 资源管理](04_Resource_Management.md)
|