216 lines
5.5 KiB
Markdown
216 lines
5.5 KiB
Markdown
# 01. 快速开始
|
||
|
||
本教程将带你快速上手 Extra2D 引擎,通过一个简单的 Hello World 示例了解引擎的基本使用方法。
|
||
|
||
## 示例代码
|
||
|
||
完整示例位于 `examples/hello_world/main.cpp`:
|
||
|
||
```cpp
|
||
#include <extra2d/extra2d.h>
|
||
|
||
using namespace extra2d;
|
||
|
||
// ============================================================================
|
||
// Hello World 场景
|
||
// ============================================================================
|
||
|
||
/**
|
||
* @brief Hello World 场景类
|
||
* 显示简单的 "Hello World" 文字
|
||
*/
|
||
class HelloWorldScene : public Scene {
|
||
public:
|
||
/**
|
||
* @brief 场景进入时调用
|
||
*/
|
||
void onEnter() override {
|
||
E2D_LOG_INFO("HelloWorldScene::onEnter - 进入场景");
|
||
|
||
// 设置背景颜色为深蓝色
|
||
setBackgroundColor(Color(0.1f, 0.1f, 0.3f, 1.0f));
|
||
|
||
// 加载字体(支持多种字体后备)
|
||
auto &resources = Application::instance().resources();
|
||
font_ = resources.loadFont("assets/font.ttf", 48, true);
|
||
|
||
if (!font_) {
|
||
E2D_LOG_ERROR("字体加载失败,文字渲染将不可用!");
|
||
return;
|
||
}
|
||
|
||
// 创建 "你好世界" 文本组件 - 使用屏幕空间(固定位置,不随相机移动)
|
||
auto text1 = Text::create("你好世界", font_);
|
||
text1->withCoordinateSpace(CoordinateSpace::Screen)
|
||
->withScreenPosition(640.0f, 360.0f) // 屏幕中心
|
||
->withAnchor(0.5f, 0.5f) // 中心锚点,让文字中心对准位置
|
||
->withTextColor(Color(1.0f, 1.0f, 1.0f, 1.0f));
|
||
addChild(text1);
|
||
|
||
// 创建提示文本组件 - 使用屏幕空间,固定在屏幕底部
|
||
auto text2 = Text::create("退出按键(START 按钮)", font_);
|
||
text2->withCoordinateSpace(CoordinateSpace::Screen)
|
||
->withScreenPosition(640.0f, 650.0f) // 屏幕底部
|
||
->withAnchor(0.5f, 0.5f)
|
||
->withTextColor(Color(1.0f, 1.0f, 0.0f, 1.0f));
|
||
addChild(text2);
|
||
}
|
||
|
||
/**
|
||
* @brief 每帧更新时调用
|
||
* @param dt 时间间隔(秒)
|
||
*/
|
||
void onUpdate(float dt) override {
|
||
Scene::onUpdate(dt);
|
||
|
||
// 检查退出按键
|
||
auto &input = Application::instance().input();
|
||
|
||
// 使用手柄 START 按钮退出 (GamepadButton::Start)
|
||
if (input.isButtonPressed(GamepadButton::Start)) {
|
||
E2D_LOG_INFO("退出应用 (START 按钮)");
|
||
Application::instance().quit();
|
||
}
|
||
}
|
||
|
||
private:
|
||
Ptr<FontAtlas> font_; // 字体图集
|
||
};
|
||
|
||
// ============================================================================
|
||
// 程序入口
|
||
// ============================================================================
|
||
|
||
int main(int argc, char **argv)
|
||
{
|
||
// 初始化日志系统
|
||
Logger::init();
|
||
Logger::setLevel(LogLevel::Debug);
|
||
|
||
// 获取应用实例
|
||
auto &app = Application::instance();
|
||
|
||
// 配置应用
|
||
AppConfig config;
|
||
config.title = "Easy2D - Hello World";
|
||
config.width = 1280;
|
||
config.height = 720;
|
||
config.vsync = true;
|
||
config.fpsLimit = 60;
|
||
|
||
// 初始化应用
|
||
if (!app.init(config)) {
|
||
E2D_LOG_ERROR("应用初始化失败!");
|
||
return -1;
|
||
}
|
||
|
||
// 进入 Hello World 场景
|
||
app.enterScene(makePtr<HelloWorldScene>());
|
||
|
||
// 运行应用
|
||
app.run();
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
## 核心概念
|
||
|
||
### 1. 应用生命周期
|
||
|
||
Extra2D 应用遵循以下生命周期:
|
||
|
||
```
|
||
初始化 (Application::init)
|
||
↓
|
||
进入场景 (enterScene)
|
||
↓
|
||
主循环 (run) → 更新 (onUpdate) → 渲染 (onRender)
|
||
↓
|
||
退出 (quit)
|
||
```
|
||
|
||
### 2. 场景系统
|
||
|
||
场景是游戏内容的容器,通过继承 `Scene` 类并重写以下方法:
|
||
|
||
| 方法 | 说明 |
|
||
|------|------|
|
||
| `onEnter()` | 场景进入时调用,用于初始化资源 |
|
||
| `onExit()` | 场景退出时调用,用于清理资源 |
|
||
| `onUpdate(dt)` | 每帧更新时调用,用于处理游戏逻辑 |
|
||
| `onRender(renderer)` | 渲染时调用,用于自定义绘制 |
|
||
|
||
### 3. 坐标空间
|
||
|
||
Extra2D 支持三种坐标空间:
|
||
|
||
```cpp
|
||
// 屏幕空间 - 固定位置,不随相机移动
|
||
text->withCoordinateSpace(CoordinateSpace::Screen)
|
||
->withScreenPosition(640.0f, 360.0f);
|
||
|
||
// 相机空间 - 跟随相机但保持相对偏移
|
||
text->withCoordinateSpace(CoordinateSpace::Camera)
|
||
->withCameraOffset(50.0f, 50.0f);
|
||
|
||
// 世界空间 - 随相机移动(默认行为)
|
||
text->withCoordinateSpace(CoordinateSpace::World)
|
||
->withPosition(100.0f, 100.0f);
|
||
```
|
||
|
||
### 4. 输入处理
|
||
|
||
支持手柄输入检测:
|
||
|
||
```cpp
|
||
auto &input = Application::instance().input();
|
||
|
||
// 检测按键按下(持续触发)
|
||
if (input.isButtonDown(GamepadButton::A)) { }
|
||
|
||
// 检测按键按下(单次触发)
|
||
if (input.isButtonPressed(GamepadButton::A)) { }
|
||
|
||
// 检测按键释放
|
||
if (input.isButtonReleased(GamepadButton::A)) { }
|
||
```
|
||
|
||
常用按键:
|
||
- `GamepadButton::A` - A 键
|
||
- `GamepadButton::B` - B 键
|
||
- `GamepadButton::X` - X 键
|
||
- `GamepadButton::Y` - Y 键
|
||
- `GamepadButton::Start` - + 键 (Switch)
|
||
- `GamepadButton::DPadUp/Down/Left/Right` - 方向键
|
||
|
||
### 5. 资源加载
|
||
|
||
通过资源管理器加载字体、纹理等资源:
|
||
|
||
```cpp
|
||
auto &resources = Application::instance().resources();
|
||
|
||
// 加载字体
|
||
auto font = resources.loadFont("assets/font.ttf", 48, true);
|
||
|
||
// 加载纹理
|
||
auto texture = resources.loadTexture("assets/image.png");
|
||
```
|
||
|
||
### 6. 日志系统
|
||
|
||
使用宏进行日志输出:
|
||
|
||
```cpp
|
||
E2D_LOG_DEBUG("调试信息");
|
||
E2D_LOG_INFO("普通信息");
|
||
E2D_LOG_WARN("警告信息");
|
||
E2D_LOG_ERROR("错误信息");
|
||
```
|
||
|
||
## 下一步
|
||
|
||
- [02. 场景系统](./02_Scene_System.md) - 深入了解场景管理
|
||
- [03. 节点系统](./03_Node_System.md) - 学习节点和精灵的使用
|