diff --git a/Frostbite2D/include/frostbite2D/2d/actor.h b/Frostbite2D/include/frostbite2D/2d/actor.h index d2dd705..b6ac4d8 100644 --- a/Frostbite2D/include/frostbite2D/2d/actor.h +++ b/Frostbite2D/include/frostbite2D/2d/actor.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,9 @@ public: const std::string& GetName() const { return name_; } void SetName(const std::string& name) { name_ = name; } + const UUID& GetUUID() const { return uuid_; } + std::string GetUUIDString() const { return uuid_.toString(); } + const Vec2& GetPosition() const { return position_; } void SetPosition(const Vec2& pos); void SetPosition(float x, float y); @@ -129,6 +133,7 @@ private: Scene* scene_; ActorList children_; + UUID uuid_; std::string name_; Vec2 position_; float rotation_; diff --git a/Frostbite2D/include/frostbite2D/base/object_registry.h b/Frostbite2D/include/frostbite2D/base/object_registry.h new file mode 100644 index 0000000..a721bd7 --- /dev/null +++ b/Frostbite2D/include/frostbite2D/base/object_registry.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include + +namespace frostbite2D { + +class Actor; +class UUID; + +class ObjectRegistry { +public: + static ObjectRegistry& get(); + + ObjectRegistry(const ObjectRegistry&) = delete; + ObjectRegistry& operator=(const ObjectRegistry&) = delete; + + void registerObject(const UUID& uuid, Actor* actor); + void unregisterObject(const UUID& uuid); + + Actor* getObject(const UUID& uuid); + Actor* getObject(const std::string& uuidStr); + + bool hasObject(const UUID& uuid) const; + bool hasObject(const std::string& uuidStr) const; + + void clear(); + +private: + ObjectRegistry() = default; + ~ObjectRegistry() = default; + + std::map registry_; +}; + +} // namespace frostbite2D diff --git a/Frostbite2D/include/frostbite2D/types/uuid.h b/Frostbite2D/include/frostbite2D/types/uuid.h new file mode 100644 index 0000000..0f031cd --- /dev/null +++ b/Frostbite2D/include/frostbite2D/types/uuid.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include +#include + +namespace frostbite2D { + +class UUID { +public: + static UUID generate(); + static UUID fromString(const std::string& str); + std::string toString() const; + + UUID() = default; + + bool operator==(const UUID& other) const { return data_ == other.data_; } + bool operator!=(const UUID& other) const { return data_ != other.data_; } + + bool isValid() const { + for (auto byte : data_) { + if (byte != 0) return true; + } + return false; + } + + const std::array& data() const { return data_; } + +private: + explicit UUID(const std::array& data) : data_(data) {} + + std::array data_{}; +}; + +} // namespace frostbite2D diff --git a/Frostbite2D/src/frostbite2D/2d/actor.cpp b/Frostbite2D/src/frostbite2D/2d/actor.cpp index 6ca7e37..4376dc7 100644 --- a/Frostbite2D/src/frostbite2D/2d/actor.cpp +++ b/Frostbite2D/src/frostbite2D/2d/actor.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -16,6 +17,8 @@ Actor::Actor() , zOrder_(0) , opacity_(1.0f) , anchor_(Vec2(0.0f, 0.0f)) { + uuid_ = UUID::generate(); + ObjectRegistry::get().registerObject(uuid_, this); } void Actor::SetOpacity(float opacity) { @@ -118,6 +121,7 @@ void Actor::updateWorldTransform() const { } Actor::~Actor() { + ObjectRegistry::get().unregisterObject(uuid_); RemoveAllChildren(); } diff --git a/Frostbite2D/src/frostbite2D/base/object_registry.cpp b/Frostbite2D/src/frostbite2D/base/object_registry.cpp new file mode 100644 index 0000000..192bca0 --- /dev/null +++ b/Frostbite2D/src/frostbite2D/base/object_registry.cpp @@ -0,0 +1,44 @@ +#include +#include +#include + +namespace frostbite2D { + +ObjectRegistry& ObjectRegistry::get() { + static ObjectRegistry instance; + return instance; +} + +void ObjectRegistry::registerObject(const UUID& uuid, Actor* actor) { + registry_[uuid.toString()] = actor; +} + +void ObjectRegistry::unregisterObject(const UUID& uuid) { + registry_.erase(uuid.toString()); +} + +Actor* ObjectRegistry::getObject(const UUID& uuid) { + return getObject(uuid.toString()); +} + +Actor* ObjectRegistry::getObject(const std::string& uuidStr) { + auto it = registry_.find(uuidStr); + if (it != registry_.end()) { + return it->second; + } + return nullptr; +} + +bool ObjectRegistry::hasObject(const UUID& uuid) const { + return hasObject(uuid.toString()); +} + +bool ObjectRegistry::hasObject(const std::string& uuidStr) const { + return registry_.find(uuidStr) != registry_.end(); +} + +void ObjectRegistry::clear() { + registry_.clear(); +} + +} // namespace frostbite2D diff --git a/Frostbite2D/src/frostbite2D/core/application.cpp b/Frostbite2D/src/frostbite2D/core/application.cpp index cdbce4b..6a9a96e 100644 --- a/Frostbite2D/src/frostbite2D/core/application.cpp +++ b/Frostbite2D/src/frostbite2D/core/application.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +103,8 @@ void Application::shutdown() { sdlQuitCalled = true; } + ObjectRegistry::get().clear(); + initialized_ = false; running_ = false; } @@ -155,12 +158,11 @@ bool Application::initCoreModules() { // 设置窗口清除颜色和视口 renderer_->setClearColor(0.0f, 0.0f, 0.0f); - renderer_->setViewport(0, 0, config_.windowConfig.width, - config_.windowConfig.height); + renderer_->setViewport(0, 0, window_->width(), window_->height()); // 创建并设置相机 camera_ = new Camera(); - camera_->setViewport(config_.windowConfig.width, config_.windowConfig.height); + camera_->setViewport(window_->width(), window_->height()); camera_->setFlipY(true); // 启用 Y 轴翻转,(0,0) 在左上角 renderer_->setCamera(camera_); diff --git a/Frostbite2D/src/frostbite2D/types/uuid.cpp b/Frostbite2D/src/frostbite2D/types/uuid.cpp new file mode 100644 index 0000000..08816b1 --- /dev/null +++ b/Frostbite2D/src/frostbite2D/types/uuid.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +namespace frostbite2D { + +UUID UUID::generate() { + std::array data; + for (int i = 0; i < 16; ++i) { + data[i] = static_cast(rand() % 256); + } + + data[6] = (data[6] & 0x0F) | 0x40; + data[8] = (data[8] & 0x3F) | 0x80; + + return UUID(data); +} + +UUID UUID::fromString(const std::string& str) { + if (str.length() != 36) { + return UUID{}; + } + + std::array data{}; + std::stringstream ss(str); + char dash; + for (int i = 0; i < 16; ++i) { + int byte; + ss >> std::hex >> byte; + data[i] = static_cast(byte); + if (i < 15) { + ss >> dash; + } + } + + return UUID(data); +} + +std::string UUID::toString() const { + const auto& data = data_; + std::stringstream ss; + ss << std::hex << std::setfill('0') + << std::setw(2) << static_cast(data[0]) + << std::setw(2) << static_cast(data[1]) + << std::setw(2) << static_cast(data[2]) + << std::setw(2) << static_cast(data[3]) + << '-' + << std::setw(2) << static_cast(data[4]) + << std::setw(2) << static_cast(data[5]) + << '-' + << std::setw(2) << static_cast(data[6]) + << std::setw(2) << static_cast(data[7]) + << '-' + << std::setw(2) << static_cast(data[8]) + << std::setw(2) << static_cast(data[9]) + << '-' + << std::setw(2) << static_cast(data[10]) + << std::setw(2) << static_cast(data[11]) + << std::setw(2) << static_cast(data[12]) + << std::setw(2) << static_cast(data[13]) + << std::setw(2) << static_cast(data[14]) + << std::setw(2) << static_cast(data[15]); + return ss.str(); +} + +} // namespace frostbite2D diff --git a/Game/src/main.cpp b/Game/src/main.cpp index c98e99c..97df0f0 100644 --- a/Game/src/main.cpp +++ b/Game/src/main.cpp @@ -32,8 +32,8 @@ int main(int argc, char **argv) { AppConfig config = AppConfig::createDefault(); config.appName = "Frostbite2D Test App"; config.appVersion = "1.0.0"; - config.windowConfig.width = 1920; - config.windowConfig.height = 1080; + config.windowConfig.width = 1280; + config.windowConfig.height = 720; config.windowConfig.title = "Frostbite2D - Renderer Test"; Application& app = Application::get(); @@ -66,6 +66,10 @@ int main(int argc, char **argv) { SDL_Log("Animation created successfully"); // ani->SetAnchor(Vec2(0.5f, 0.5f)); ani->SetPosition(640, 360); + + auto uuid = ani->GetUUIDString(); + SDL_Log("Animation UUID: %s", uuid.c_str()); + menuScene->AddChild(ani); }