#include "game_scene.h" #include // ======================================== // PlayerNode 实现 // ======================================== PlayerNode::PlayerNode() { setName("Player"); setTag(1); // 设置玩家尺寸 setSize(64.0f, 64.0f); // 设置锚点为中心点 setAnchor(0.5f, 0.5f); // 添加精灵渲染组件 auto sprite = makePtr(); 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(); 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(); 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(); // 计算位置(圆形分布) 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(); if (sprite) { float hue = static_cast(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(); cameraNode->setName("MainCamera"); // 相机位置在(0, 0),这样世界坐标直接映射到屏幕 cameraNode->setPosition(0.0f, 0.0f); // 添加相机组件 auto camera = makePtr(); // 使用标准的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); }