Extra2D/examples/scene_graph_demo/game_scene.cpp

169 lines
3.9 KiB
C++
Raw Permalink Normal View History

#include "game_scene.h"
#include <cmath>
// ========================================
// PlayerNode 实现
// ========================================
PlayerNode::PlayerNode() {
setName("Player");
setTag(1);
// 设置玩家尺寸
setSize(64.0f, 64.0f);
// 设置锚点为中心点
setAnchor(0.5f, 0.5f);
// 添加精灵渲染组件
auto sprite = makePtr<SpriteRenderer>();
sprite->setColor(Color::Blue);
addComponent(sprite);
}
void PlayerNode::onUpdate(float dt) {
time_ += dt;
// 简单的圆周运动
float radius = 200.0f;
float x = 640.0f + radius * std::cos(time_ * 0.5f);
float y = 360.0f + radius * std::sin(time_ * 0.5f);
setPosition(x, y);
// 根据移动方向旋转(顺时针,使用负角度)
float angle = -time_ * 0.5f * 57.2958f + 90.0f;
setRotation(angle);
}
// ========================================
// RotatingDecoration 实现
// ========================================
RotatingDecoration::RotatingDecoration() {
setName("Decoration");
// 设置尺寸
setSize(32.0f, 32.0f);
// 设置锚点为中心
setAnchor(0.5f, 0.5f);
// 添加精灵渲染组件
auto sprite = makePtr<SpriteRenderer>();
sprite->setColor(Color::Yellow);
addComponent(sprite);
}
void RotatingDecoration::onUpdate(float dt) {
// 自转(顺时针,使用负角度)
setRotation(getRotation() - rotationSpeed_ * dt);
}
// ========================================
// GameScene 实现
// ========================================
GameScene::GameScene() {
// 场景初始化
}
void GameScene::onEnter() {
Scene::onEnter();
// 创建相机
createCamera();
// 创建玩家
createPlayer();
// 创建装饰物
createDecorations();
}
void GameScene::onExit() {
// 清理资源
player_.reset();
decorations_.clear();
Scene::onExit();
}
void GameScene::update(float dt) {
Scene::update(dt);
sceneTime_ += dt;
// 更新玩家
if (player_) {
player_->onUpdate(dt);
}
// 更新装饰物
for (auto &decoration : decorations_) {
decoration->onUpdate(dt);
}
}
void GameScene::createPlayer() {
player_ = makePtr<PlayerNode>();
player_->setPosition(640.0f, 360.0f);
addChild(player_);
}
void GameScene::createDecorations() {
// 创建围绕玩家旋转的装饰物
int count = 8;
float radius = 150.0f;
for (int i = 0; i < count; ++i) {
auto decoration = makePtr<RotatingDecoration>();
// 计算位置(圆形分布)
float angle = (2.0f * 3.14159f * i) / count;
float x = 640.0f + radius * std::cos(angle);
float y = 360.0f + radius * std::sin(angle);
decoration->setPosition(x, y);
decoration->setRotationSpeed(45.0f + i * 10.0f);
// 设置不同颜色
auto sprite = decoration->getComponent<SpriteRenderer>();
if (sprite) {
float hue = static_cast<float>(i) / count;
// 简单的HSV到RGB转换
float r = std::abs(hue * 6.0f - 3.0f) - 1.0f;
float g = 2.0f - std::abs(hue * 6.0f - 2.0f);
float b = 2.0f - std::abs(hue * 6.0f - 4.0f);
sprite->setColor(Color(std::max(0.0f, std::min(1.0f, r)),
std::max(0.0f, std::min(1.0f, g)),
std::max(0.0f, std::min(1.0f, b)), 1.0f));
}
decorations_.push_back(decoration);
addChild(decoration);
}
}
void GameScene::createCamera() {
// 创建相机节点
auto cameraNode = makePtr<Node>();
cameraNode->setName("MainCamera");
// 相机位置在(0, 0),这样世界坐标直接映射到屏幕
cameraNode->setPosition(0.0f, 0.0f);
// 添加相机组件
auto camera = makePtr<CameraComponent>();
// 使用标准的2D投影左上角为(0, 0),右下角为(1280, 720)
// Y轴向下bottom=720, top=0
camera->setOrtho(0.0f, 1280.0f, 720.0f, 0.0f, -1.0f, 1.0f);
cameraNode->addComponent(camera);
// 设置为主相机
setMainCamera(camera);
// 添加相机节点到场景
addChild(cameraNode);
}