Extra2D/examples/scene_graph_demo/game_scene.cpp

169 lines
3.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}