From eea35568feb51d3b00d99d920863286d015c045c Mon Sep 17 00:00:00 2001 From: altalk23 <45172705+altalk23@users.noreply.github.com> Date: Fri, 16 Feb 2024 23:58:40 +0300 Subject: [PATCH] isSpriteFrameName --- loader/include/Geode/utils/cocos.hpp | 12 +++++++++++ loader/src/utils/cocos.cpp | 32 +++++++++++++++++----------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/loader/include/Geode/utils/cocos.hpp b/loader/include/Geode/utils/cocos.hpp index 0d4cf0af..4192cdcb 100644 --- a/loader/include/Geode/utils/cocos.hpp +++ b/loader/include/Geode/utils/cocos.hpp @@ -737,6 +737,18 @@ namespace geode::cocos { return nullptr; } + /** + * Checks if a node has the given sprite frame + * name either in the sprite or in the sprite inside + * the button. + * + * @param node Node to check + * @param name Name of the sprite frame to search for + * @returns True if the node has the given sprite frame + * name + */ + bool isSpriteFrameName(cocos2d::CCNode* node, const char* name); + /** * Get the first child that has the given sprite frame * name either in the sprite or in the sprite inside diff --git a/loader/src/utils/cocos.cpp b/loader/src/utils/cocos.cpp index 3bc65dbe..e7db8687 100644 --- a/loader/src/utils/cocos.cpp +++ b/loader/src/utils/cocos.cpp @@ -339,28 +339,34 @@ std::shared_ptr WeakRefPool::manage(CCObject* obj) { return m_pool.at(obj); } -CCNode* geode::cocos::getChildBySpriteFrameName(CCNode* parent, const char* name) { +bool geode::cocos::isSpriteFrameName(CCNode* node, const char* name) { auto cache = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(name); - if (!cache) return nullptr; + if (!cache) return false; auto* texture = cache->getTexture(); auto rect = cache->getRect(); - for (int i = 0; i < parent->getChildrenCount(); ++i) { - auto* child = parent->getChildren()->objectAtIndex(i); - if (auto* spr = typeinfo_cast(child)) { + if (auto* spr = typeinfo_cast(node)) { + if (spr->getTexture() == texture && spr->getTextureRect() == rect) { + return true; + } + } else if (auto* btn = typeinfo_cast(node)) { + auto* img = btn->getNormalImage(); + if (auto* spr = typeinfo_cast(img)) { if (spr->getTexture() == texture && spr->getTextureRect() == rect) { - return spr; - } - } else if (auto* btn = typeinfo_cast(child)) { - auto* img = btn->getNormalImage(); - if (auto* spr = typeinfo_cast(img)) { - if (spr->getTexture() == texture && spr->getTextureRect() == rect) { - return btn; - } + return true; } } } + return false; +} + +CCNode* geode::cocos::getChildBySpriteFrameName(CCNode* parent, const char* name) { + for (auto child : CCArrayExt(parent->getChildren())) { + if (::isSpriteFrameName(static_cast(child), name)) { + return child; + } + } return nullptr; }