From aa83e85f46d9bc04bb030c5204993cbfae890f4f Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 20 Mar 2018 15:42:12 +0800 Subject: [PATCH 01/29] fix Animation reverse not effect --- .../creator-luacpp-support/CreatorReader.fbs | 3 ++- .../reader/CreatorReader_generated.h | 15 ++++----------- .../reader/animation/AnimationClip.h | 4 +++- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs index c6526039..1b8eb15b 100644 --- a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs +++ b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs @@ -373,7 +373,8 @@ table DragonBones // //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -enum AnimWrapMode:byte {Default, Normal, Loop, PingPong, Reverse, LoopReverse, PingPongReverse} +// refer to: https://github.com/cocos-creator/engine/blob/master/cocos2d/animation/types.js#L28 +enum AnimWrapMode:byte {Default = 0, Normal = 1, Loop = 2, PingPong = 22, Reverse = 36, LoopReverse = 38, PingPongReverse = 54} //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // Animation Clip diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h index 22cd2c5c..f51df3df 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h @@ -446,21 +446,14 @@ enum AnimWrapMode { AnimWrapMode_Default = 0, AnimWrapMode_Normal = 1, AnimWrapMode_Loop = 2, - AnimWrapMode_PingPong = 3, - AnimWrapMode_Reverse = 4, - AnimWrapMode_LoopReverse = 5, - AnimWrapMode_PingPongReverse = 6, + AnimWrapMode_PingPong = 22, + AnimWrapMode_Reverse = 36, + AnimWrapMode_LoopReverse = 38, + AnimWrapMode_PingPongReverse = 54, AnimWrapMode_MIN = AnimWrapMode_Default, AnimWrapMode_MAX = AnimWrapMode_PingPongReverse }; -inline const char **EnumNamesAnimWrapMode() { - static const char *names[] = { "Default", "Normal", "Loop", "PingPong", "Reverse", "LoopReverse", "PingPongReverse", nullptr }; - return names; -} - -inline const char *EnumNameAnimWrapMode(AnimWrapMode e) { return EnumNamesAnimWrapMode()[static_cast(e)]; } - MANUALLY_ALIGNED_STRUCT(4) Vec2 FLATBUFFERS_FINAL_CLASS { private: float x_; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h index 89754dfc..ee12c3f2 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h @@ -33,7 +33,9 @@ NS_CCR_BEGIN class AnimationClip: public cocos2d::Ref { public: - enum class WrapMode {Default, Normal, Loop, PingPong, Reverse, LoopReverse, PingPongReverse}; + + // refer to: https://github.com/cocos-creator/engine/blob/master/cocos2d/animation/types.js#L28 + enum class WrapMode {Default = 0, Normal = 1, Loop = 2, PingPong = 22, Reverse = 36, LoopReverse = 38, PingPongReverse = 54}; static AnimationClip* create(); virtual ~AnimationClip(); From 15b7f055d1a81240266d01f7a86e9b97d2c41a46 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 20 Mar 2018 16:32:03 +0800 Subject: [PATCH 02/29] fix loop reverse bug --- .../creator-luacpp-support/reader/animation/AnimateClip.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 537dfd5d..0794380e 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -329,7 +329,7 @@ float AnimateClip::computeElapse() const if (wrapMode == AnimationClip::WrapMode::Reverse // reverse mode || (wrapMode == AnimationClip::WrapMode::PingPong && !oddRound) // pingpong mode and it is the second round || (wrapMode == AnimationClip::WrapMode::PingPongReverse && oddRound) // pingpongreverse mode and it is the first round - || (wrapMode == AnimationClip::WrapMode::LoopReverse && oddRound) + || (wrapMode == AnimationClip::WrapMode::LoopReverse) // loop reverse mode, reverse again and again ) elapsed = duration - elapsed; From 6e6e7c00289cf96efd16ae66d4d02a45df9fb05d Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 20 Mar 2018 16:52:57 +0800 Subject: [PATCH 03/29] remove a while not needed --- .../reader/animation/AnimateClip.cpp | 7 +++---- .../creator-luacpp-support/reader/animation/AnimateClip.h | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 0794380e..4e9d413e 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -320,16 +320,15 @@ float AnimateClip::computeElapse() const auto elapsed = _elapsed; auto duration = _clip->getDuration(); - // if wrap mode is pingpong or pingpongreverse, then _elapsed may be bigger than duration - while (elapsed >= duration) - elapsed = elapsed - duration; + // as the time goes, _elapsed will be bigger than duration when _needStop = false + elapsed = elapsed - static_cast(elapsed / duration) * duration; const auto wrapMode = _clip->getWrapMode(); bool oddRound = (static_cast(_elapsed / duration) % 2) == 0; if (wrapMode == AnimationClip::WrapMode::Reverse // reverse mode || (wrapMode == AnimationClip::WrapMode::PingPong && !oddRound) // pingpong mode and it is the second round || (wrapMode == AnimationClip::WrapMode::PingPongReverse && oddRound) // pingpongreverse mode and it is the first round - || (wrapMode == AnimationClip::WrapMode::LoopReverse) // loop reverse mode, reverse again and again + || (wrapMode == AnimationClip::WrapMode::LoopReverse) ) elapsed = duration - elapsed; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h index e0fe2d83..da974f1b 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h @@ -60,7 +60,8 @@ class AnimateClip : public cocos2d::Node { float computeElapse() const; AnimationClip* _clip; - + + // the time elapsed since the animation start float _elapsed; cocos2d::Node *_rootTarget; From 1b44b7ce6eff4a135faba13680ece2e96bdbb52e Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 20 Mar 2018 16:53:40 +0800 Subject: [PATCH 04/29] PingPong is a Loop mode --- .../reader/animation/AnimateClip.cpp | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 4e9d413e..db4d754c 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -32,9 +32,9 @@ #include namespace { - + creator::AnimationClip* g_clip = nullptr; - + // -1: invalid index // -2: haven't reached first frame, so it should be the same as first frame template @@ -42,30 +42,30 @@ namespace { { if (properties.empty()) return -1; - + if (properties.front().frame > elapsed) return -2; if (properties.back().frame <= elapsed) return properties.size() - 1; - + for (int i = 0, len = properties.size(); i < len; ++i) { const auto& prop = properties[i]; if (prop.frame > elapsed) return i - 1; } - + return -1; } - + template float getPercent(const P& p1, const P& p2, float elapsed) { const auto& curveType = p1.curveType; const auto& curveData = p1.curveData; auto ratio = (elapsed - p1.frame) / (p2.frame - p1.frame); - + if (!curveType.empty()) { const auto& easingFunc = creator::Easing::getFunction(curveType); @@ -73,71 +73,71 @@ namespace { } if (curveData.size() > 0) ratio = creator::Bazier::computeBezier(curveData, ratio); - + return ratio; } - + void assignValue(float src, float& dst) { dst = src; } - + void assignValue(const cocos2d::Color3B& src, cocos2d::Color3B& dst) { dst.r = src.r; dst.g = src.g; dst.b = src.b; } - + void assignValue(const cocos2d::Vec2& src, cocos2d::Vec2& dst) { dst.x = src.x; dst.y = src.y; } - + template void computeNextValue(T start, T end, float percent, T &out) { out = start + percent * (end - start); } - + void computeNextValue(const cocos2d::Color3B& start, const cocos2d::Color3B& end, float percent, cocos2d::Color3B& out) { computeNextValue(start.r, end.r, percent, out.r); computeNextValue(start.g, end.g, percent, out.g); computeNextValue(start.b, end.b, percent, out.b); } - + void computeNextValue(const cocos2d::Vec2& start, const cocos2d::Vec2& end, float percent, cocos2d::Vec2& out) { computeNextValue(start.x, end.x, percent, out.x); computeNextValue(start.y, end.y, percent, out.y); } - + template bool getNextValue(const P & properties, float elapsed, T &out) { int index = getValidIndex(properties, elapsed); if (index == -1) return false; - + if (index == -2) { assignValue(properties.front().value, out); return true; } - + if (index == properties.size() -1) { assignValue(properties.back().value, out); return true; } - + const auto& prop = properties[index]; const auto& nextProp = properties[index+1]; float percent = getPercent(prop, nextProp, elapsed); computeNextValue(prop.value, nextProp.value, percent, out); - + return true; } } @@ -205,19 +205,20 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip _clip = clip; _rootTarget = rootTarget; CC_SAFE_RETAIN(_rootTarget); - + if (_clip) { _clip->retain(); - + auto wrapMode = clip->getWrapMode(); if (wrapMode == AnimationClip::WrapMode::Loop || wrapMode == AnimationClip::WrapMode::LoopReverse) _needStop = false; - + _durationToStop = _clip->getDuration(); if (wrapMode == AnimationClip::WrapMode::PingPong || wrapMode == AnimationClip::WrapMode::PingPongReverse) + _needStop = false; _durationToStop = _clip->getDuration() * 2; - + // assign it to be used in anonymous namespace g_clip = _clip; } @@ -227,16 +228,16 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip void AnimateClip::update(float dt) { _elapsed += dt; - + if (_needStop && _elapsed >= _durationToStop) { stopAnimate(); if (_endCallback) _endCallback(); - + return; } - + const auto& allAnimProperties = _clip->getAnimProperties(); for (const auto& animProperties : allAnimProperties) doUpdate(animProperties); @@ -248,7 +249,7 @@ void AnimateClip::doUpdate(const AnimProperties& animProperties) const if (target) { auto elapsed = computeElapse(); - + // update position cocos2d::Vec2 nextPos; if (getNextValue(animProperties.animPosition, elapsed, nextPos)) @@ -295,7 +296,7 @@ void AnimateClip::doUpdate(const AnimProperties& animProperties) const // positoin x if (getNextValue(animProperties.animPositionX, elapsed, nextValue)) target->setPositionX(nextValue); - + // position y if (getNextValue(animProperties.animPositionY, elapsed, nextValue)) target->setPositionY(nextValue); @@ -306,7 +307,7 @@ cocos2d::Node* AnimateClip::getTarget(const std::string &path) const { if (path.empty()) return _rootTarget; - + cocos2d::Node *ret = nullptr; _rootTarget->enumerateChildren(path, [&ret](cocos2d::Node* result) -> bool { ret = result; @@ -319,10 +320,10 @@ float AnimateClip::computeElapse() const { auto elapsed = _elapsed; auto duration = _clip->getDuration(); - + // as the time goes, _elapsed will be bigger than duration when _needStop = false elapsed = elapsed - static_cast(elapsed / duration) * duration; - + const auto wrapMode = _clip->getWrapMode(); bool oddRound = (static_cast(_elapsed / duration) % 2) == 0; if (wrapMode == AnimationClip::WrapMode::Reverse // reverse mode @@ -331,6 +332,7 @@ float AnimateClip::computeElapse() const || (wrapMode == AnimationClip::WrapMode::LoopReverse) ) elapsed = duration - elapsed; - + return elapsed; } + From 4e87cbeeb364414bdb50d580cf7081549b5183c5 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 20 Mar 2018 17:07:28 +0800 Subject: [PATCH 05/29] add comment --- .../creator-luacpp-support/reader/animation/AnimateClip.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index db4d754c..9000a940 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -329,7 +329,7 @@ float AnimateClip::computeElapse() const if (wrapMode == AnimationClip::WrapMode::Reverse // reverse mode || (wrapMode == AnimationClip::WrapMode::PingPong && !oddRound) // pingpong mode and it is the second round || (wrapMode == AnimationClip::WrapMode::PingPongReverse && oddRound) // pingpongreverse mode and it is the first round - || (wrapMode == AnimationClip::WrapMode::LoopReverse) + || (wrapMode == AnimationClip::WrapMode::LoopReverse) // loop reverse mode, reverse again and again ) elapsed = duration - elapsed; From 62b5f58fcc67a2d6ade58da3e9872d5a69b4d30b Mon Sep 17 00:00:00 2001 From: drelaptop Date: Wed, 21 Mar 2018 09:13:28 +0800 Subject: [PATCH 06/29] add export option --- .../packages/creator-luacpp-support/core/Constants.js | 3 ++- .../packages/creator-luacpp-support/package.json | 3 ++- .../creator-luacpp-support/panels/setup-project-panel.html | 5 ++++- .../creator-luacpp-support/panels/setup-project-panel.js | 6 ++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/core/Constants.js b/creator_project/packages/creator-luacpp-support/core/Constants.js index dc7efc87..346006fb 100644 --- a/creator_project/packages/creator-luacpp-support/core/Constants.js +++ b/creator_project/packages/creator-luacpp-support/core/Constants.js @@ -42,7 +42,8 @@ Constants.PROFILE_DEFAULTS = { setup: false, path: '', autoBuild: false, - exportResourceOnly: false + exportResourceOnly: false, + exportResourceUnused: false }; module.exports = Constants; diff --git a/creator_project/packages/creator-luacpp-support/package.json b/creator_project/packages/creator-luacpp-support/package.json index 88d3c701..d99553ae 100644 --- a/creator_project/packages/creator-luacpp-support/package.json +++ b/creator_project/packages/creator-luacpp-support/package.json @@ -25,7 +25,8 @@ "setup": false, "path": "", "autoBuild": false, - "exportResourceOnly": false + "exportResourceOnly": false, + "exportResourceUnused": false } } } diff --git a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html index e7f45bef..cf59ae26 100644 --- a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html +++ b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html @@ -21,10 +21,13 @@

Setup Target Project v{{version}}

- + Export Resource Only + + Export Resource Unused + diff --git a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js index cb9ebf44..22ac6d51 100644 --- a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js +++ b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js @@ -88,6 +88,12 @@ Editor.Panel.extend({ this.profileProject.save(); }, + _onChangeExportResourceUnused(event) { + event.stopPropagation(); + this.profileProject.data.exportResourceUnused = event.target.value; + this.profileProject.save(); + }, + _onChangeAutoBuild(event) { event.stopPropagation(); this.profileProject.data.autoBuild = event.target.value; From 84c03d3de63d9f4c4c3870f465025b9eed64d95e Mon Sep 17 00:00:00 2001 From: drelaptop Date: Wed, 21 Mar 2018 16:10:59 +0800 Subject: [PATCH 07/29] add js logic to copy dynamic res --- .../core/BuildWorker.js | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js index b5b75b77..f7c3b25e 100644 --- a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js +++ b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js @@ -10,6 +10,7 @@ const Constants = require('./Constants'); const Fs = require('fire-fs'); const Del = require('del') const parse_fire = require('./parser/ConvertFireToJson'); +const parse_utils = require('./parser/Utils') const {WorkerBase, registerWorker} = require('./WorkerBase'); @@ -29,6 +30,8 @@ class BuildWorker extends WorkerBase { Utils.getAssetsInfo(function(uuidmap) { let copyReourceInfos = this._convertFireToJson(uuidmap); + let dynamicLoadRes = this._getDynamicLoadRes(uuidmap); + Object.assign(copyReourceInfos, dynamicLoadRes); this._compileJsonToBinary(function() { this._copyResources(copyReourceInfos); Editor.Ipc.sendToAll('creator-luacpp-support:state-changed', 'finish', 100); @@ -39,7 +42,7 @@ class BuildWorker extends WorkerBase { } _convertFireToJson(uuidmap) { - let fireFiles = this._getFireList(); + let fireFiles = this._getFireList(); let copyReourceInfos = parse_fire(fireFiles, 'creator', Constants.JSON_PATH, uuidmap); return copyReourceInfos; @@ -72,7 +75,6 @@ class BuildWorker extends WorkerBase { // - resources in assets and folder // - all files in reader // - lua binding codes(currently is missing) - let projectRoot = this._state.path; // root path of resources @@ -171,6 +173,21 @@ class BuildWorker extends WorkerBase { }); return foundFiles; } + + // dynamically load resources located at assets/resources folder + _getDynamicLoadRes(uuidmap, collectedResources) { + let dynamicLoadRes = {}; + let resourcesPath = Path.join(Constants.ASSETS_PATH, 'resources'); + + Object.keys(uuidmap).forEach(function(uuid) { + if(uuidmap[uuid].indexOf(resourcesPath) < 0) + return true; + + dynamicLoadRes[uuid] = parse_utils.get_relative_full_path_by_uuid(uuid); + }); + + return dynamicLoadRes; + } } registerWorker(BuildWorker, 'run-build-worker'); From d4be795a5b3f5e9161e1ff6dd64af67d4ce41178 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Wed, 21 Mar 2018 16:32:52 +0800 Subject: [PATCH 08/29] improve var name --- .../packages/creator-luacpp-support/core/BuildWorker.js | 8 +++++++- .../packages/creator-luacpp-support/core/Constants.js | 2 +- .../packages/creator-luacpp-support/package.json | 2 +- .../panels/setup-project-panel.html | 4 ++-- .../creator-luacpp-support/panels/setup-project-panel.js | 4 ++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js index f7c3b25e..d70b0261 100644 --- a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js +++ b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js @@ -14,6 +14,8 @@ const parse_utils = require('./parser/Utils') const {WorkerBase, registerWorker} = require('./WorkerBase'); +const plugin_profile = 'profile://project/creator-luacpp-support.json'; + class BuildWorker extends WorkerBase { run(state, callback) { Utils.recordBuild(); @@ -110,7 +112,7 @@ class BuildWorker extends WorkerBase { }); } - let state = Editor.remote.Profile.load('profile://project/creator-luacpp-support.json', Constants.PROFILE_DEFAULTS); + let state = Editor.remote.Profile.load(plugin_profile, Constants.PROFILE_DEFAULTS); if (state.data.exportResourceOnly) return; @@ -176,6 +178,10 @@ class BuildWorker extends WorkerBase { // dynamically load resources located at assets/resources folder _getDynamicLoadRes(uuidmap, collectedResources) { + let state = Editor.remote.Profile.load(plugin_profile, Constants.PROFILE_DEFAULTS); + if (!state.data.exportDynamicallyLoadResource) + return; + let dynamicLoadRes = {}; let resourcesPath = Path.join(Constants.ASSETS_PATH, 'resources'); diff --git a/creator_project/packages/creator-luacpp-support/core/Constants.js b/creator_project/packages/creator-luacpp-support/core/Constants.js index 346006fb..e9b8fc39 100644 --- a/creator_project/packages/creator-luacpp-support/core/Constants.js +++ b/creator_project/packages/creator-luacpp-support/core/Constants.js @@ -43,7 +43,7 @@ Constants.PROFILE_DEFAULTS = { path: '', autoBuild: false, exportResourceOnly: false, - exportResourceUnused: false + exportDynamicallyLoadResource: false }; module.exports = Constants; diff --git a/creator_project/packages/creator-luacpp-support/package.json b/creator_project/packages/creator-luacpp-support/package.json index d99553ae..81261848 100644 --- a/creator_project/packages/creator-luacpp-support/package.json +++ b/creator_project/packages/creator-luacpp-support/package.json @@ -26,7 +26,7 @@ "path": "", "autoBuild": false, "exportResourceOnly": false, - "exportResourceUnused": false + "exportDynamicallyLoadResource": false } } } diff --git a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html index cf59ae26..d72ddf49 100644 --- a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html +++ b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html @@ -25,8 +25,8 @@

Setup Target Project v{{version}}

Export Resource Only - - Export Resource Unused + + Export Dynamically Load Resource
diff --git a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js index 22ac6d51..29f8bb68 100644 --- a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js +++ b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js @@ -88,9 +88,9 @@ Editor.Panel.extend({ this.profileProject.save(); }, - _onChangeExportResourceUnused(event) { + _onChangeexportDynamicallyLoadResource(event) { event.stopPropagation(); - this.profileProject.data.exportResourceUnused = event.target.value; + this.profileProject.data.exportDynamicallyLoadResource = event.target.value; this.profileProject.save(); }, From 6827e85f89d981ef1ce590c77ef7746256616af0 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Wed, 21 Mar 2018 16:45:57 +0800 Subject: [PATCH 09/29] roolback unrelated changes --- .../creator-luacpp-support/CreatorReader.fbs | 3 +- .../reader/CreatorReader_generated.h | 15 +++- .../reader/animation/AnimateClip.cpp | 73 +++++++++---------- .../reader/animation/AnimateClip.h | 3 +- .../reader/animation/AnimationClip.h | 4 +- 5 files changed, 50 insertions(+), 48 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs index 1b8eb15b..c6526039 100644 --- a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs +++ b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs @@ -373,8 +373,7 @@ table DragonBones // //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -// refer to: https://github.com/cocos-creator/engine/blob/master/cocos2d/animation/types.js#L28 -enum AnimWrapMode:byte {Default = 0, Normal = 1, Loop = 2, PingPong = 22, Reverse = 36, LoopReverse = 38, PingPongReverse = 54} +enum AnimWrapMode:byte {Default, Normal, Loop, PingPong, Reverse, LoopReverse, PingPongReverse} //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // Animation Clip diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h index f51df3df..22cd2c5c 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h @@ -446,14 +446,21 @@ enum AnimWrapMode { AnimWrapMode_Default = 0, AnimWrapMode_Normal = 1, AnimWrapMode_Loop = 2, - AnimWrapMode_PingPong = 22, - AnimWrapMode_Reverse = 36, - AnimWrapMode_LoopReverse = 38, - AnimWrapMode_PingPongReverse = 54, + AnimWrapMode_PingPong = 3, + AnimWrapMode_Reverse = 4, + AnimWrapMode_LoopReverse = 5, + AnimWrapMode_PingPongReverse = 6, AnimWrapMode_MIN = AnimWrapMode_Default, AnimWrapMode_MAX = AnimWrapMode_PingPongReverse }; +inline const char **EnumNamesAnimWrapMode() { + static const char *names[] = { "Default", "Normal", "Loop", "PingPong", "Reverse", "LoopReverse", "PingPongReverse", nullptr }; + return names; +} + +inline const char *EnumNameAnimWrapMode(AnimWrapMode e) { return EnumNamesAnimWrapMode()[static_cast(e)]; } + MANUALLY_ALIGNED_STRUCT(4) Vec2 FLATBUFFERS_FINAL_CLASS { private: float x_; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 9000a940..537dfd5d 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -32,9 +32,9 @@ #include namespace { - + creator::AnimationClip* g_clip = nullptr; - + // -1: invalid index // -2: haven't reached first frame, so it should be the same as first frame template @@ -42,30 +42,30 @@ namespace { { if (properties.empty()) return -1; - + if (properties.front().frame > elapsed) return -2; if (properties.back().frame <= elapsed) return properties.size() - 1; - + for (int i = 0, len = properties.size(); i < len; ++i) { const auto& prop = properties[i]; if (prop.frame > elapsed) return i - 1; } - + return -1; } - + template float getPercent(const P& p1, const P& p2, float elapsed) { const auto& curveType = p1.curveType; const auto& curveData = p1.curveData; auto ratio = (elapsed - p1.frame) / (p2.frame - p1.frame); - + if (!curveType.empty()) { const auto& easingFunc = creator::Easing::getFunction(curveType); @@ -73,71 +73,71 @@ namespace { } if (curveData.size() > 0) ratio = creator::Bazier::computeBezier(curveData, ratio); - + return ratio; } - + void assignValue(float src, float& dst) { dst = src; } - + void assignValue(const cocos2d::Color3B& src, cocos2d::Color3B& dst) { dst.r = src.r; dst.g = src.g; dst.b = src.b; } - + void assignValue(const cocos2d::Vec2& src, cocos2d::Vec2& dst) { dst.x = src.x; dst.y = src.y; } - + template void computeNextValue(T start, T end, float percent, T &out) { out = start + percent * (end - start); } - + void computeNextValue(const cocos2d::Color3B& start, const cocos2d::Color3B& end, float percent, cocos2d::Color3B& out) { computeNextValue(start.r, end.r, percent, out.r); computeNextValue(start.g, end.g, percent, out.g); computeNextValue(start.b, end.b, percent, out.b); } - + void computeNextValue(const cocos2d::Vec2& start, const cocos2d::Vec2& end, float percent, cocos2d::Vec2& out) { computeNextValue(start.x, end.x, percent, out.x); computeNextValue(start.y, end.y, percent, out.y); } - + template bool getNextValue(const P & properties, float elapsed, T &out) { int index = getValidIndex(properties, elapsed); if (index == -1) return false; - + if (index == -2) { assignValue(properties.front().value, out); return true; } - + if (index == properties.size() -1) { assignValue(properties.back().value, out); return true; } - + const auto& prop = properties[index]; const auto& nextProp = properties[index+1]; float percent = getPercent(prop, nextProp, elapsed); computeNextValue(prop.value, nextProp.value, percent, out); - + return true; } } @@ -205,20 +205,19 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip _clip = clip; _rootTarget = rootTarget; CC_SAFE_RETAIN(_rootTarget); - + if (_clip) { _clip->retain(); - + auto wrapMode = clip->getWrapMode(); if (wrapMode == AnimationClip::WrapMode::Loop || wrapMode == AnimationClip::WrapMode::LoopReverse) _needStop = false; - + _durationToStop = _clip->getDuration(); if (wrapMode == AnimationClip::WrapMode::PingPong || wrapMode == AnimationClip::WrapMode::PingPongReverse) - _needStop = false; _durationToStop = _clip->getDuration() * 2; - + // assign it to be used in anonymous namespace g_clip = _clip; } @@ -228,16 +227,16 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip void AnimateClip::update(float dt) { _elapsed += dt; - + if (_needStop && _elapsed >= _durationToStop) { stopAnimate(); if (_endCallback) _endCallback(); - + return; } - + const auto& allAnimProperties = _clip->getAnimProperties(); for (const auto& animProperties : allAnimProperties) doUpdate(animProperties); @@ -249,7 +248,7 @@ void AnimateClip::doUpdate(const AnimProperties& animProperties) const if (target) { auto elapsed = computeElapse(); - + // update position cocos2d::Vec2 nextPos; if (getNextValue(animProperties.animPosition, elapsed, nextPos)) @@ -296,7 +295,7 @@ void AnimateClip::doUpdate(const AnimProperties& animProperties) const // positoin x if (getNextValue(animProperties.animPositionX, elapsed, nextValue)) target->setPositionX(nextValue); - + // position y if (getNextValue(animProperties.animPositionY, elapsed, nextValue)) target->setPositionY(nextValue); @@ -307,7 +306,7 @@ cocos2d::Node* AnimateClip::getTarget(const std::string &path) const { if (path.empty()) return _rootTarget; - + cocos2d::Node *ret = nullptr; _rootTarget->enumerateChildren(path, [&ret](cocos2d::Node* result) -> bool { ret = result; @@ -320,19 +319,19 @@ float AnimateClip::computeElapse() const { auto elapsed = _elapsed; auto duration = _clip->getDuration(); - - // as the time goes, _elapsed will be bigger than duration when _needStop = false - elapsed = elapsed - static_cast(elapsed / duration) * duration; - + + // if wrap mode is pingpong or pingpongreverse, then _elapsed may be bigger than duration + while (elapsed >= duration) + elapsed = elapsed - duration; + const auto wrapMode = _clip->getWrapMode(); bool oddRound = (static_cast(_elapsed / duration) % 2) == 0; if (wrapMode == AnimationClip::WrapMode::Reverse // reverse mode || (wrapMode == AnimationClip::WrapMode::PingPong && !oddRound) // pingpong mode and it is the second round || (wrapMode == AnimationClip::WrapMode::PingPongReverse && oddRound) // pingpongreverse mode and it is the first round - || (wrapMode == AnimationClip::WrapMode::LoopReverse) // loop reverse mode, reverse again and again + || (wrapMode == AnimationClip::WrapMode::LoopReverse && oddRound) ) elapsed = duration - elapsed; - + return elapsed; } - diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h index da974f1b..e0fe2d83 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h @@ -60,8 +60,7 @@ class AnimateClip : public cocos2d::Node { float computeElapse() const; AnimationClip* _clip; - - // the time elapsed since the animation start + float _elapsed; cocos2d::Node *_rootTarget; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h index ee12c3f2..89754dfc 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h @@ -33,9 +33,7 @@ NS_CCR_BEGIN class AnimationClip: public cocos2d::Ref { public: - - // refer to: https://github.com/cocos-creator/engine/blob/master/cocos2d/animation/types.js#L28 - enum class WrapMode {Default = 0, Normal = 1, Loop = 2, PingPong = 22, Reverse = 36, LoopReverse = 38, PingPongReverse = 54}; + enum class WrapMode {Default, Normal, Loop, PingPong, Reverse, LoopReverse, PingPongReverse}; static AnimationClip* create(); virtual ~AnimationClip(); From ed809fad93a8f9554789161784442def96e511fc Mon Sep 17 00:00:00 2001 From: drelaptop Date: Fri, 23 Mar 2018 10:14:07 +0800 Subject: [PATCH 10/29] improve UI/var name --- .../packages/creator-luacpp-support/core/BuildWorker.js | 2 +- .../packages/creator-luacpp-support/core/Constants.js | 2 +- creator_project/packages/creator-luacpp-support/package.json | 2 +- .../creator-luacpp-support/panels/setup-project-panel.html | 4 ++-- .../creator-luacpp-support/panels/setup-project-panel.js | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js index d70b0261..bed992a4 100644 --- a/creator_project/packages/creator-luacpp-support/core/BuildWorker.js +++ b/creator_project/packages/creator-luacpp-support/core/BuildWorker.js @@ -179,7 +179,7 @@ class BuildWorker extends WorkerBase { // dynamically load resources located at assets/resources folder _getDynamicLoadRes(uuidmap, collectedResources) { let state = Editor.remote.Profile.load(plugin_profile, Constants.PROFILE_DEFAULTS); - if (!state.data.exportDynamicallyLoadResource) + if (!state.data.exportResourceDynamicallyLoaded) return; let dynamicLoadRes = {}; diff --git a/creator_project/packages/creator-luacpp-support/core/Constants.js b/creator_project/packages/creator-luacpp-support/core/Constants.js index e9b8fc39..6ca1a4fe 100644 --- a/creator_project/packages/creator-luacpp-support/core/Constants.js +++ b/creator_project/packages/creator-luacpp-support/core/Constants.js @@ -43,7 +43,7 @@ Constants.PROFILE_DEFAULTS = { path: '', autoBuild: false, exportResourceOnly: false, - exportDynamicallyLoadResource: false + exportResourceDynamicallyLoaded: false }; module.exports = Constants; diff --git a/creator_project/packages/creator-luacpp-support/package.json b/creator_project/packages/creator-luacpp-support/package.json index 81261848..a8f3eef6 100644 --- a/creator_project/packages/creator-luacpp-support/package.json +++ b/creator_project/packages/creator-luacpp-support/package.json @@ -26,7 +26,7 @@ "path": "", "autoBuild": false, "exportResourceOnly": false, - "exportDynamicallyLoadResource": false + "exportResourceDynamicallyLoaded": false } } } diff --git a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html index d72ddf49..98884584 100644 --- a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html +++ b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.html @@ -25,8 +25,8 @@

Setup Target Project v{{version}}

Export Resource Only - - Export Dynamically Load Resource + + Export Resource Dynamically Loaded
diff --git a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js index 29f8bb68..4f252465 100644 --- a/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js +++ b/creator_project/packages/creator-luacpp-support/panels/setup-project-panel.js @@ -88,9 +88,9 @@ Editor.Panel.extend({ this.profileProject.save(); }, - _onChangeexportDynamicallyLoadResource(event) { + _onChangeExportDynamicallyLoadResource(event) { event.stopPropagation(); - this.profileProject.data.exportDynamicallyLoadResource = event.target.value; + this.profileProject.data.exportResourceDynamicallyLoaded = event.target.value; this.profileProject.save(); }, From cbe246a9c01934f752c344681b0d3b62ee450d07 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Fri, 23 Mar 2018 10:37:42 +0800 Subject: [PATCH 11/29] improve mod method --- .gitignore | 6 ++++++ .../creator-luacpp-support/reader/animation/AnimateClip.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f54921af..eb2f9c4f 100755 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,9 @@ quick_gen_project_*_autogen.sh.meta #///////////////////////////////////////////////////////////////////////////// .idea/ + +#///////////////////////////////////////////////////////////////////////////// +# vscode files +#///////////////////////////////////////////////////////////////////////////// + +.vscode/ diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 9000a940..bdb706d8 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -322,7 +322,7 @@ float AnimateClip::computeElapse() const auto duration = _clip->getDuration(); // as the time goes, _elapsed will be bigger than duration when _needStop = false - elapsed = elapsed - static_cast(elapsed / duration) * duration; + elapsed = fmodf(elapsed, duration); const auto wrapMode = _clip->getWrapMode(); bool oddRound = (static_cast(_elapsed / duration) % 2) == 0; From 23eb44fb07367133d36dfefa86fc55e83faf361d Mon Sep 17 00:00:00 2001 From: drelaptop Date: Fri, 23 Mar 2018 10:53:58 +0800 Subject: [PATCH 12/29] remove useless duration twice --- .../reader/animation/AnimateClip.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index bdb706d8..39cd3158 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -209,15 +209,14 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip if (_clip) { _clip->retain(); + _durationToStop = _clip->getDuration(); auto wrapMode = clip->getWrapMode(); - if (wrapMode == AnimationClip::WrapMode::Loop || wrapMode == AnimationClip::WrapMode::LoopReverse) - _needStop = false; - - _durationToStop = _clip->getDuration(); - if (wrapMode == AnimationClip::WrapMode::PingPong || wrapMode == AnimationClip::WrapMode::PingPongReverse) + if (wrapMode == AnimationClip::WrapMode::Loop + || wrapMode == AnimationClip::WrapMode::LoopReverse + || wrapMode == AnimationClip::WrapMode::PingPong // PingPong and PingPongReverse are loop animations + || wrapMode == AnimationClip::WrapMode::PingPongReverse) _needStop = false; - _durationToStop = _clip->getDuration() * 2; // assign it to be used in anonymous namespace g_clip = _clip; From 449c242ed89a7e0fc1fbb1c78d5e313ee4945cea Mon Sep 17 00:00:00 2001 From: drelaptop Date: Mon, 26 Mar 2018 16:00:00 +0800 Subject: [PATCH 13/29] fix loop animate memory leak --- .../creator-luacpp-support/reader/CreatorReader.cpp | 4 ++++ .../reader/animation/AnimateClip.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 45989582..5d95be65 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -131,6 +131,10 @@ CreatorReader::CreatorReader() { _animationManager = new AnimationManager(); _collisionManager = new ColliderManager(); + _animationManager->autorelease(); + _collisionManager->autorelease(); + CC_SAFE_RETAIN(_animationManager); + CC_SAFE_RETAIN(_collisionManager); } CreatorReader::~CreatorReader() diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 39cd3158..dbc4cf3c 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -168,6 +168,10 @@ AnimateClip::AnimateClip() AnimateClip::~AnimateClip() { + // a loop animate might keep running until destruction, memory will leak if not stop it + if(_running) + stopAnimate(); + CC_SAFE_RELEASE(_clip); CC_SAFE_RELEASE(_rootTarget); } @@ -180,6 +184,9 @@ void AnimateClip::startAnimate() void AnimateClip::stopAnimate() { + if (_endCallback) + _endCallback(); + unscheduleUpdate(); // release self _running = false; @@ -231,8 +238,6 @@ void AnimateClip::update(float dt) { if (_needStop && _elapsed >= _durationToStop) { stopAnimate(); - if (_endCallback) - _endCallback(); return; } From ba726bc5f1880f3234e2370b8150cf4662ab32c3 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Mon, 26 Mar 2018 17:48:59 +0800 Subject: [PATCH 14/29] fix PlayOnLoad loop animation leaks --- .../reader/animation/AnimationManager.cpp | 9 +++++++++ .../reader/animation/AnimationManager.h | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp index 69d3ad53..ccac1f8f 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp @@ -27,6 +27,15 @@ void AnimationManager::playOnLoad() } } +void AnimationManager::stopPlayOnLoad() +{ + for (auto& animationInfo : _animations) + { + if (animationInfo.playOnLoad && animationInfo.defaultClip) + stopAnimationClip(animationInfo.target, animationInfo.defaultClip->getName()); + } +} + void AnimationManager::playAnimationClip(cocos2d::Node *target, const std::string &animationClipName) { bool foundTarget = false; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h index a44a5694..fe741089 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h @@ -50,6 +50,8 @@ class AnimationManager : public cocos2d::Node void stopAnimationClip(cocos2d::Node *target, const std::string &animationClipName); void pauseAnimationClip(cocos2d::Node *target, const std::string &animationClipName); void resumeAnimationClip(cocos2d::Node *target, const std::string &animationClipName); + // if a "Play On Load" animation is a loop animation, please stop it manually. + void stopPlayOnLoad(); private: friend class CreatorReader; @@ -59,7 +61,7 @@ class AnimationManager : public cocos2d::Node // functions invoked by CreatorReader only void addAnimation(const AnimationInfo& animationInfo); void playOnLoad(); - + void runAnimationClip(cocos2d::Node *target, AnimationClip* animationClip); // AnimateClip will be released void removeAnimateClip(cocos2d::Node *target, const std::string &animationClipName); From 914d731cb146194e056c9753697114952b042ae7 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 27 Mar 2018 17:50:12 +0800 Subject: [PATCH 15/29] init add widget components --- .../creator-luacpp-support/core/parser/Node.js | 9 +++++++++ .../creator-luacpp-support/core/parser/Utils.js | 2 +- .../creator-luacpp-support/core/parser/Widget.js | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 creator_project/packages/creator-luacpp-support/core/parser/Widget.js diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Node.js b/creator_project/packages/creator-luacpp-support/core/parser/Node.js index fba99c64..963b7ddc 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Node.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Node.js @@ -1,5 +1,6 @@ const state = require('./Global').state; const Collider = require('./Collider'); +const Widget = require('./Widget'); let Utils = require('./Utils'); const fs = require('fs'); @@ -194,6 +195,7 @@ class Node { this.parse_clip(); this.parse_colliders(); + this.parse_widget(); } parse_child(node_idx) { @@ -224,6 +226,13 @@ class Node { } } + parse_widget() { + let component = Node.get_node_components_of_type(this._node_data, 'cc.Widget'); + if(component){ + this._properties.widget = Widget.parse(component); + } + } + parse_clip() { let component = Node.get_node_component_of_type(this._node_data, 'cc.Animation'); if (component) { diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Utils.js b/creator_project/packages/creator-luacpp-support/core/parser/Utils.js index ee98444e..10d464c1 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Utils.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Utils.js @@ -220,7 +220,7 @@ let get_tiledmap_path_by_uuid = function (uuid) { } } -let DEBUG = false; +let DEBUG = true; log = function(s) { if (DEBUG) Utils.log(s); diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js new file mode 100644 index 00000000..ce286115 --- /dev/null +++ b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js @@ -0,0 +1,15 @@ +let Utils = require('./Utils'); + +class Widget { + static parse(data) { + let result = {}; + + // debugger; + Utils.log("try to parse widget" + JSON.stringify(data)); + + return result; + } +} + + +module.exports = Widget; \ No newline at end of file From 894371293778873d1d428f1bcdef16373da91da8 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 27 Mar 2018 18:25:48 +0800 Subject: [PATCH 16/29] widget property collect --- .../core/parser/Node.js | 4 +-- .../core/parser/Widget.js | 25 +++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Node.js b/creator_project/packages/creator-luacpp-support/core/parser/Node.js index 963b7ddc..35634de4 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Node.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Node.js @@ -228,8 +228,8 @@ class Node { parse_widget() { let component = Node.get_node_components_of_type(this._node_data, 'cc.Widget'); - if(component){ - this._properties.widget = Widget.parse(component); + if(component.length === 1) { + this._properties.widget = Widget.parse(component[0]); } } diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js index ce286115..e1ec44cc 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js @@ -4,8 +4,29 @@ class Widget { static parse(data) { let result = {}; - // debugger; - Utils.log("try to parse widget" + JSON.stringify(data)); + Utils.log("parse widget init value:" + JSON.stringify(data)); + + // meaningful in cocos2d-x? + result.isAlignOnce = data.isAlignOnce; + + // margin value, pixel or percentage + result.left = data._left; + result.right = data._right; + result.top = data._top; + result.bottom = data._bottom; + result.verticalCenter = data._verticalCenter; + result.horizontalCenter = data._verticalCenter; + + // If true, value is pixel, otherwise is percentage (0 - 1) + result.isAbsLeft = data._isAbsLeft; + result.isAbsRight = data._isAbsRight; + result.isAbsTop = data._isAbsTop; + result.isAbsBottom = data._isAbsBottom; + result.isAbsHorizontalCenter = data._isAbsHorizontalCenter; + result.isAbsVerticalCenter = data._isAbsVerticalCenter; + + Utils.log("parse widget result value:" + JSON.stringify(result)); + debugger; return result; } From f88de5fc865b3bd5a261900fd8248dea60544702 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 27 Mar 2018 18:40:15 +0800 Subject: [PATCH 17/29] add necessary flatbuffer info --- .../creator-luacpp-support/CreatorReader.fbs | 18 +++ .../reader/CreatorReader_generated.h | 119 +++++++++++++++++- 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs index c6526039..dac43a1e 100644 --- a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs +++ b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs @@ -102,6 +102,7 @@ table Node tag:int = 0; anim:AnimationRef; colliders:[Collider]; + widget:Widget; groupIndex:int; } @@ -354,6 +355,23 @@ table Collider radius:float; // CircleCollider } +table Widget +{ + isAlignOnce:bool; + left:float; + right:float; + top:float; + bottom:float; + verticalCenter:float; + horizontalCenter:float; + isAbsLeft:bool; + isAbsRight:bool; + isAbsTop:bool; + isAbsBottom:bool; + isAbsHorizontalCenter:bool; + isAbsVerticalCenter:bool; +} + table DragonBones { node:Node; diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h index 22cd2c5c..b0490f5a 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h @@ -68,6 +68,8 @@ struct AnimationRef; struct Collider; +struct Widget; + struct DragonBones; struct AnimationClip; @@ -882,7 +884,8 @@ struct Node FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VT_TAG = 38, VT_ANIM = 40, VT_COLLIDERS = 42, - VT_GROUPINDEX = 44 + VT_WIDGET = 44, + VT_GROUPINDEX = 46 }; const Size *contentSize() const { return GetStruct(VT_CONTENTSIZE); } bool enabled() const { return GetField(VT_ENABLED, 1) != 0; } @@ -904,6 +907,7 @@ struct Node FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { int32_t tag() const { return GetField(VT_TAG, 0); } const AnimationRef *anim() const { return GetPointer(VT_ANIM); } const flatbuffers::Vector> *colliders() const { return GetPointer> *>(VT_COLLIDERS); } + const Widget *widget() const { return GetPointer(VT_WIDGET); } int32_t groupIndex() const { return GetField(VT_GROUPINDEX, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && @@ -931,6 +935,8 @@ struct Node FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { VerifyField(verifier, VT_COLLIDERS) && verifier.Verify(colliders()) && verifier.VerifyVectorOfTables(colliders()) && + VerifyField(verifier, VT_WIDGET) && + verifier.VerifyTable(widget()) && VerifyField(verifier, VT_GROUPINDEX) && verifier.EndTable(); } @@ -959,11 +965,12 @@ struct NodeBuilder { void add_tag(int32_t tag) { fbb_.AddElement(Node::VT_TAG, tag, 0); } void add_anim(flatbuffers::Offset anim) { fbb_.AddOffset(Node::VT_ANIM, anim); } void add_colliders(flatbuffers::Offset>> colliders) { fbb_.AddOffset(Node::VT_COLLIDERS, colliders); } + void add_widget(flatbuffers::Offset widget) { fbb_.AddOffset(Node::VT_WIDGET, widget); } void add_groupIndex(int32_t groupIndex) { fbb_.AddElement(Node::VT_GROUPINDEX, groupIndex, 0); } NodeBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } NodeBuilder &operator=(const NodeBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 21)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 22)); return o; } }; @@ -989,9 +996,11 @@ inline flatbuffers::Offset CreateNode(flatbuffers::FlatBufferBuilder &_fbb int32_t tag = 0, flatbuffers::Offset anim = 0, flatbuffers::Offset>> colliders = 0, + flatbuffers::Offset widget = 0, int32_t groupIndex = 0) { NodeBuilder builder_(_fbb); builder_.add_groupIndex(groupIndex); + builder_.add_widget(widget); builder_.add_colliders(colliders); builder_.add_anim(anim); builder_.add_tag(tag); @@ -1036,8 +1045,9 @@ inline flatbuffers::Offset CreateNodeDirect(flatbuffers::FlatBufferBuilder int32_t tag = 0, flatbuffers::Offset anim = 0, const std::vector> *colliders = nullptr, + flatbuffers::Offset widget = 0, int32_t groupIndex = 0) { - return CreateNode(_fbb, contentSize, enabled, name ? _fbb.CreateString(name) : 0, anchorPoint, cascadeOpacityEnabled, color, globalZOrder, localZOrder, opacity, opacityModifyRGB, position, rotationSkewX, rotationSkewY, scaleX, scaleY, skewX, skewY, tag, anim, colliders ? _fbb.CreateVector>(*colliders) : 0, groupIndex); + return CreateNode(_fbb, contentSize, enabled, name ? _fbb.CreateString(name) : 0, anchorPoint, cascadeOpacityEnabled, color, globalZOrder, localZOrder, opacity, opacityModifyRGB, position, rotationSkewX, rotationSkewY, scaleX, scaleY, skewX, skewY, tag, anim, colliders ? _fbb.CreateVector>(*colliders) : 0, widget, groupIndex); } struct Sprite FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { @@ -2762,6 +2772,109 @@ inline flatbuffers::Offset CreateColliderDirect(flatbuffers::FlatBuffe return CreateCollider(_fbb, type, offset, size, points ? _fbb.CreateVector(*points) : 0, radius); } +struct Widget FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + enum { + VT_ISALIGNONCE = 4, + VT_LEFT = 6, + VT_RIGHT = 8, + VT_TOP = 10, + VT_BOTTOM = 12, + VT_VERTICALCENTER = 14, + VT_HORIZONTALCENTER = 16, + VT_ISABSLEFT = 18, + VT_ISABSRIGHT = 20, + VT_ISABSTOP = 22, + VT_ISABSBOTTOM = 24, + VT_ISABSHORIZONTALCENTER = 26, + VT_ISABSVERTICALCENTER = 28 + }; + bool isAlignOnce() const { return GetField(VT_ISALIGNONCE, 0) != 0; } + float left() const { return GetField(VT_LEFT, 0.0f); } + float right() const { return GetField(VT_RIGHT, 0.0f); } + float top() const { return GetField(VT_TOP, 0.0f); } + float bottom() const { return GetField(VT_BOTTOM, 0.0f); } + float verticalCenter() const { return GetField(VT_VERTICALCENTER, 0.0f); } + float horizontalCenter() const { return GetField(VT_HORIZONTALCENTER, 0.0f); } + bool isAbsLeft() const { return GetField(VT_ISABSLEFT, 0) != 0; } + bool isAbsRight() const { return GetField(VT_ISABSRIGHT, 0) != 0; } + bool isAbsTop() const { return GetField(VT_ISABSTOP, 0) != 0; } + bool isAbsBottom() const { return GetField(VT_ISABSBOTTOM, 0) != 0; } + bool isAbsHorizontalCenter() const { return GetField(VT_ISABSHORIZONTALCENTER, 0) != 0; } + bool isAbsVerticalCenter() const { return GetField(VT_ISABSVERTICALCENTER, 0) != 0; } + bool Verify(flatbuffers::Verifier &verifier) const { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ISALIGNONCE) && + VerifyField(verifier, VT_LEFT) && + VerifyField(verifier, VT_RIGHT) && + VerifyField(verifier, VT_TOP) && + VerifyField(verifier, VT_BOTTOM) && + VerifyField(verifier, VT_VERTICALCENTER) && + VerifyField(verifier, VT_HORIZONTALCENTER) && + VerifyField(verifier, VT_ISABSLEFT) && + VerifyField(verifier, VT_ISABSRIGHT) && + VerifyField(verifier, VT_ISABSTOP) && + VerifyField(verifier, VT_ISABSBOTTOM) && + VerifyField(verifier, VT_ISABSHORIZONTALCENTER) && + VerifyField(verifier, VT_ISABSVERTICALCENTER) && + verifier.EndTable(); + } +}; + +struct WidgetBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_isAlignOnce(bool isAlignOnce) { fbb_.AddElement(Widget::VT_ISALIGNONCE, static_cast(isAlignOnce), 0); } + void add_left(float left) { fbb_.AddElement(Widget::VT_LEFT, left, 0.0f); } + void add_right(float right) { fbb_.AddElement(Widget::VT_RIGHT, right, 0.0f); } + void add_top(float top) { fbb_.AddElement(Widget::VT_TOP, top, 0.0f); } + void add_bottom(float bottom) { fbb_.AddElement(Widget::VT_BOTTOM, bottom, 0.0f); } + void add_verticalCenter(float verticalCenter) { fbb_.AddElement(Widget::VT_VERTICALCENTER, verticalCenter, 0.0f); } + void add_horizontalCenter(float horizontalCenter) { fbb_.AddElement(Widget::VT_HORIZONTALCENTER, horizontalCenter, 0.0f); } + void add_isAbsLeft(bool isAbsLeft) { fbb_.AddElement(Widget::VT_ISABSLEFT, static_cast(isAbsLeft), 0); } + void add_isAbsRight(bool isAbsRight) { fbb_.AddElement(Widget::VT_ISABSRIGHT, static_cast(isAbsRight), 0); } + void add_isAbsTop(bool isAbsTop) { fbb_.AddElement(Widget::VT_ISABSTOP, static_cast(isAbsTop), 0); } + void add_isAbsBottom(bool isAbsBottom) { fbb_.AddElement(Widget::VT_ISABSBOTTOM, static_cast(isAbsBottom), 0); } + void add_isAbsHorizontalCenter(bool isAbsHorizontalCenter) { fbb_.AddElement(Widget::VT_ISABSHORIZONTALCENTER, static_cast(isAbsHorizontalCenter), 0); } + void add_isAbsVerticalCenter(bool isAbsVerticalCenter) { fbb_.AddElement(Widget::VT_ISABSVERTICALCENTER, static_cast(isAbsVerticalCenter), 0); } + WidgetBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } + WidgetBuilder &operator=(const WidgetBuilder &); + flatbuffers::Offset Finish() { + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 13)); + return o; + } +}; + +inline flatbuffers::Offset CreateWidget(flatbuffers::FlatBufferBuilder &_fbb, + bool isAlignOnce = false, + float left = 0.0f, + float right = 0.0f, + float top = 0.0f, + float bottom = 0.0f, + float verticalCenter = 0.0f, + float horizontalCenter = 0.0f, + bool isAbsLeft = false, + bool isAbsRight = false, + bool isAbsTop = false, + bool isAbsBottom = false, + bool isAbsHorizontalCenter = false, + bool isAbsVerticalCenter = false) { + WidgetBuilder builder_(_fbb); + builder_.add_horizontalCenter(horizontalCenter); + builder_.add_verticalCenter(verticalCenter); + builder_.add_bottom(bottom); + builder_.add_top(top); + builder_.add_right(right); + builder_.add_left(left); + builder_.add_isAbsVerticalCenter(isAbsVerticalCenter); + builder_.add_isAbsHorizontalCenter(isAbsHorizontalCenter); + builder_.add_isAbsBottom(isAbsBottom); + builder_.add_isAbsTop(isAbsTop); + builder_.add_isAbsRight(isAbsRight); + builder_.add_isAbsLeft(isAbsLeft); + builder_.add_isAlignOnce(isAlignOnce); + return builder_.Finish(); +} + struct DragonBones FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { enum { VT_NODE = 4, From 32a1b473a270f7b7c9a7e553a677a7c33c8f6f32 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Thu, 29 Mar 2018 18:29:56 +0800 Subject: [PATCH 18/29] init cpp to support widget --- .../reader/CreatorReader.cpp | 43 +++++++++++++++++++ .../reader/CreatorReader.h | 13 +++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 5d95be65..e11d012a 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -127,6 +127,7 @@ namespace { // CreatorReader::CreatorReader() : _version("") +, _isExistWidget(false) , _positionDiffDesignResolution(0, 0) { _animationManager = new AnimationManager(); @@ -396,11 +397,19 @@ cocos2d::Node* CreatorReader::createTree(const buffers::NodeTree* tree) const auto button = static_cast(node); auto label = static_cast(child); button->setTitleLabel(label); + // insert layout Node, wrong!!!!!! no parent Node + if (_isExistWidget) { + node = adjustWidget(button->getParent(), dynamic_cast(button)); + } } else { node->addChild(child); adjustPosition(child); + // insert layout Node, wrong!!!!!! no parent Node + if (_isExistWidget) { + node = adjustWidget(node, dynamic_cast(child)); + } } } } @@ -469,6 +478,8 @@ void CreatorReader::parseNode(cocos2d::Node* node, const buffers::Node* nodeBuff parseNodeAnimation(node, nodeBuffer); parseColliders(node, nodeBuffer); + + parseWidget(node, nodeBuffer); } void CreatorReader::parseNodeAnimation(cocos2d::Node* node, const buffers::Node* nodeBuffer) const @@ -603,6 +614,23 @@ void CreatorReader::parseColliders(cocos2d::Node* node, const buffers::Node* nod _collisionManager->addCollider(collider); } +void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBuffer) const +{ + const auto& info = nodeBuffer->widget(); + if ((info != nullptr) && (dynamic_cast(node) != nullptr)) { + const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); + auto parameter = ui::LayoutParameter::create(); + parameter->setMargin(margin); + dynamic_cast(node)->setLayoutParameter(parameter); + + _isExistWidget = true; + } + else + { + _isExistWidget = _isExistWidget || false; + } +} + cocos2d::Sprite* CreatorReader::createSprite(const buffers::Sprite* spriteBuffer) const { cocos2d::Sprite* sprite = cocos2d::Sprite::create(); @@ -1458,6 +1486,21 @@ void CreatorReader::adjustPosition(cocos2d::Node* node) const } } +cocos2d::ui::Layout* CreatorReader::adjustWidget(cocos2d::Node* parent, cocos2d::ui::Widget* child) const +{ + auto layout = ui::Layout::create(); + layout->setLayoutType(ui::LayoutType::HORIZONTAL); + layout->setContentSize(parent->getContentSize()); + layout->setName(child->getName() + "-Widget"); + + // insert layout node + child->removeFromParentAndCleanup(false); + layout->addChild(child); + + _isExistWidget = false; + return layout; +} + // // Helper free functions // diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h index 8f7cef12..95aad9f8 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h @@ -88,6 +88,7 @@ class CreatorReader: public cocos2d::Ref void parseNode(cocos2d::Node* node, const buffers::Node* nodeBuffer) const; void parseNodeAnimation(cocos2d::Node* node, const buffers::Node* nodeBuffer) const; void parseColliders(cocos2d::Node* node, const buffers::Node* nodeBuffer) const; + void parseWidget(cocos2d::Node* node, const buffers::Node* nodeBuffer) const; cocos2d::Sprite* createSprite(const buffers::Sprite* spriteBuffer) const; void parseSprite(cocos2d::Sprite* sprite, const buffers::Sprite* spriteBuffer) const; @@ -157,9 +158,19 @@ class CreatorReader: public cocos2d::Ref this function adjust that */ void adjustPosition(cocos2d::Node* node) const; + /** Widget in creator is a component used to do Layout, + but in cocos2d-x is a Base class for all ui widgets. + To preduce the similar effect, we have to add a Layout between parent Node and child Node. + */ + cocos2d::ui::Layout* adjustWidget(cocos2d::Node* parent, cocos2d::ui::Widget* child) const; + // variables cocos2d::Data _data; std::string _version; + + // FIXME: wrong method, we need a map to storage related info + // true if exist Widget Component in current Node, false otherwise + mutable bool _isExistWidget; AnimationManager *_animationManager; ColliderManager *_collisionManager; @@ -167,7 +178,7 @@ class CreatorReader: public cocos2d::Ref // creator will make scene at the center of screen when apply design solution strategy, cocos2d-x doesn't do it like this // this value record the diff cocos2d::Vec2 _positionDiffDesignResolution; - + CREATOR_DISALLOW_COPY_ASSIGN_AND_MOVE(CreatorReader); }; From 2697f404eaee2b6fcd01c34c6564cc601ade15de Mon Sep 17 00:00:00 2001 From: drelaptop Date: Fri, 30 Mar 2018 10:26:26 +0800 Subject: [PATCH 19/29] change the adapt way, add WidgetAdapter class --- .../reader/CMakeLists.txt | 2 + .../reader/ui/WidgetAdapter.cpp | 30 ++++++++++++ .../reader/ui/WidgetAdapter.h | 47 +++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp create mode 100644 creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h diff --git a/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt b/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt index b2063166..daa01079 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt +++ b/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt @@ -31,6 +31,7 @@ set(READER_HEADER Macros.h ui/RichtextStringVisitor.h ui/PageView.h + ui/WidgetAdapter.h ) set(READER_SOURCE @@ -46,6 +47,7 @@ set(READER_SOURCE CreatorReader.cpp ui/PageView.cpp ui/RichtextStringVisitor.cpp + ui/WidgetAdapter.cpp ) if(BUILD_LUA_LIBS) diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp new file mode 100644 index 00000000..148a169d --- /dev/null +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp @@ -0,0 +1,30 @@ +/**************************************************************************** + Copyright (c) 2017 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ +#include "WidgetAdapter.h" + + +NS_CCR_BEGIN + + +NS_CCR_END diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h new file mode 100644 index 00000000..f4142b57 --- /dev/null +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h @@ -0,0 +1,47 @@ +/**************************************************************************** + Copyright (c) 2017 Chukong Technologies Inc. + + http://www.cocos2d-x.org + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + ****************************************************************************/ +#pragma once + +#include "cocos2d.h" +#include "ui/CocosGUI.h" +#include "CreatorReader_generated.h" + +#include "Macros.h" + +NS_CCR_BEGIN + +class WidgetAdapter +{ +public: + +private: + // the node's parent must existed + cocos2d::Node* _nodeNeedWidget; + // insert the _layout between _nodeNeedWidget and its parent + cocos2d::ui::Layout* _layout; + // layout information source,exported from the creator + creator::buffers::Widget* _widgetData; +}; + +NS_CCR_END From ce7b6ea8c0256659120bb4dd0ad8f13741bac58e Mon Sep 17 00:00:00 2001 From: drelaptop Date: Fri, 30 Mar 2018 18:40:48 +0800 Subject: [PATCH 20/29] add widget adapter --- .../reader/CreatorReader.cpp | 51 ++++++------- .../reader/CreatorReader.h | 9 +-- .../reader/ui/WidgetAdapter.cpp | 74 +++++++++++++++++++ .../reader/ui/WidgetAdapter.h | 38 ++++++++-- 4 files changed, 132 insertions(+), 40 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index e11d012a..7d0669aa 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -127,7 +127,6 @@ namespace { // CreatorReader::CreatorReader() : _version("") -, _isExistWidget(false) , _positionDiffDesignResolution(0, 0) { _animationManager = new AnimationManager(); @@ -284,6 +283,9 @@ cocos2d::Scene* CreatorReader::getSceneGraph() const node->addChild(_animationManager); _collisionManager->start(); + // insert widget-layout node + adjustWidgets(); + return static_cast(node); } @@ -397,19 +399,11 @@ cocos2d::Node* CreatorReader::createTree(const buffers::NodeTree* tree) const auto button = static_cast(node); auto label = static_cast(child); button->setTitleLabel(label); - // insert layout Node, wrong!!!!!! no parent Node - if (_isExistWidget) { - node = adjustWidget(button->getParent(), dynamic_cast(button)); - } } else { node->addChild(child); adjustPosition(child); - // insert layout Node, wrong!!!!!! no parent Node - if (_isExistWidget) { - node = adjustWidget(node, dynamic_cast(child)); - } } } } @@ -617,17 +611,21 @@ void CreatorReader::parseColliders(cocos2d::Node* node, const buffers::Node* nod void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBuffer) const { const auto& info = nodeBuffer->widget(); - if ((info != nullptr) && (dynamic_cast(node) != nullptr)) { + auto widgetNode = dynamic_cast(node); + if ((info != nullptr) && (widgetNode != nullptr)) { + // meaningful? const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); - auto parameter = ui::LayoutParameter::create(); + auto parameter = ui::LinearLayoutParameter::create(); parameter->setMargin(margin); - dynamic_cast(node)->setLayoutParameter(parameter); - - _isExistWidget = true; - } - else - { - _isExistWidget = _isExistWidget || false; + if (info->left() != 0) { +// parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::) + } + widgetNode->setLayoutParameter(parameter); + // save the widget component info + auto widgetInfo = WidgetAdapter::create(); + widgetInfo->setAdaptNode(widgetNode); +// widgetInfo->setWidgetData(info); + _needAdaptWidgets.pushBack(widgetInfo); } } @@ -1486,19 +1484,12 @@ void CreatorReader::adjustPosition(cocos2d::Node* node) const } } -cocos2d::ui::Layout* CreatorReader::adjustWidget(cocos2d::Node* parent, cocos2d::ui::Widget* child) const +void CreatorReader::adjustWidgets() const { - auto layout = ui::Layout::create(); - layout->setLayoutType(ui::LayoutType::HORIZONTAL); - layout->setContentSize(parent->getContentSize()); - layout->setName(child->getName() + "-Widget"); - - // insert layout node - child->removeFromParentAndCleanup(false); - layout->addChild(child); - - _isExistWidget = false; - return layout; + for(auto& adapter : _needAdaptWidgets){ + adapter->doAlignOnce(); + CCLOG("adjustWidgets Once"); + } } // diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h index 95aad9f8..1ea832b9 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h @@ -34,6 +34,7 @@ #include "collider/ColliderManager.h" #include "dragonbones/DragonBonesHeaders.h" #include "dragonbones/cocos2dx/CCDragonBonesHeaders.h" +#include "ui/WidgetAdapter.h" @@ -162,16 +163,14 @@ class CreatorReader: public cocos2d::Ref but in cocos2d-x is a Base class for all ui widgets. To preduce the similar effect, we have to add a Layout between parent Node and child Node. */ - cocos2d::ui::Layout* adjustWidget(cocos2d::Node* parent, cocos2d::ui::Widget* child) const; + void adjustWidgets() const; // variables cocos2d::Data _data; std::string _version; - // FIXME: wrong method, we need a map to storage related info - // true if exist Widget Component in current Node, false otherwise - mutable bool _isExistWidget; - + mutable cocos2d::Vector _needAdaptWidgets; + AnimationManager *_animationManager; ColliderManager *_collisionManager; diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp index 148a169d..b8e88b74 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp @@ -26,5 +26,79 @@ NS_CCR_BEGIN +WidgetAdapter* WidgetAdapter::create() +{ + auto adapter = new (std::nothrow) WidgetAdapter; + if (adapter && adapter->init()) { + adapter->autorelease(); + return adapter; + } + return nullptr; +} +bool WidgetAdapter::init() +{ + _layoutNode = cocos2d::ui::Layout::create(); + CC_SAFE_RETAIN(_layoutNode); + + return true; +} + +WidgetAdapter::WidgetAdapter() +: _layoutTarget(nullptr) +, _needAdaptNode(nullptr) +, _widgetData(nullptr) +{ + +} + +WidgetAdapter::~WidgetAdapter() +{ + CC_SAFE_RELEASE(_layoutNode); +} + +void WidgetAdapter::setAdaptNode(cocos2d::Node* needAdaptNode) +{ + _needAdaptNode = needAdaptNode; +} + +void WidgetAdapter::setWidgetData(const creator::buffers::Widget *const widgetData) +{ +// _widgetData = widgetData; +} + +void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) +{ + _layoutTarget = layoutTarget; +} + +void WidgetAdapter::doAlignOnce() +{ + if (_layoutTarget == nullptr) { + _layoutTarget = _needAdaptNode->getParent(); + } + CCASSERT(_layoutTarget != nullptr, "layout target can't be null"); + + _layoutNode->setLayoutType(cocos2d::ui::LayoutType::HORIZONTAL); + _layoutNode->setContentSize(_layoutTarget->getContentSize()); + + _layoutNode->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); + _layoutNode->setBackGroundColor(cocos2d::Color3B(128, 128, 128)); + _layoutNode->setOpacity(128); + _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); + _layoutNode->setPosition(_layoutTarget->getPosition()); + _layoutNode->setName(_needAdaptNode->getName() + " Layout"); + + insertLayoutNode(); +} + +void WidgetAdapter::insertLayoutNode() +{ + auto parent = _needAdaptNode->getParent(); + CCASSERT(parent != nullptr, "adaptNode's parent can't be null"); + + _needAdaptNode->removeFromParentAndCleanup(false); + _layoutNode->addChild(_needAdaptNode); + parent->addChild(_layoutNode); +} NS_CCR_END diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h index f4142b57..8bf681f6 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h @@ -31,17 +31,45 @@ NS_CCR_BEGIN -class WidgetAdapter +class WidgetAdapter : public cocos2d::Ref { + public: + static WidgetAdapter* create(); + WidgetAdapter(); + virtual ~WidgetAdapter(); + + bool init(); + + void setAdaptNode(cocos2d::Node* needAdaptNode); + void setWidgetData(const creator::buffers::Widget *const widgetData); + // set after known AdaptNode's parent + void setLayoutTarget(cocos2d::Node* layoutTarget); + // adapt layout depend on _widgetData and _layoutTarget + void doAlignOnce(); private: - // the node's parent must existed - cocos2d::Node* _nodeNeedWidget; + // widget layout target, it's a Node + cocos2d::Node* _layoutTarget; + // _layoutTarget must existed, the default target is _needAdaptNode's parent + cocos2d::Node* _needAdaptNode; // insert the _layout between _nodeNeedWidget and its parent - cocos2d::ui::Layout* _layout; + cocos2d::ui::Layout* _layoutNode; // layout information source,exported from the creator - creator::buffers::Widget* _widgetData; + const creator::buffers::Widget* const _widgetData; + // change the node relationship to insert Layout. + void insertLayoutNode(); }; +//class WidgetManager : public cocos2d::Ref +//{ +//public: +// void addWidgetInfo(cocos2d::Node* parent, creator::WidgetAdapter* adapter); +//private: +// // +// std::map _widgetInfoMap; +// +// CREATOR_DISALLOW_COPY_ASSIGN_AND_MOVE(WidgetManager); +//} + NS_CCR_END From c0b32d5985a9d14799f2f9e0ebf451fe54b83466 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Mon, 2 Apr 2018 11:08:02 +0800 Subject: [PATCH 21/29] linear layout effect wrong --- .../reader/CreatorReader.cpp | 18 +++++++++++++----- .../reader/ui/WidgetAdapter.cpp | 9 +++++---- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 7d0669aa..e1c0aeb5 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -613,18 +613,26 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu const auto& info = nodeBuffer->widget(); auto widgetNode = dynamic_cast(node); if ((info != nullptr) && (widgetNode != nullptr)) { - // meaningful? + // save the widget component info const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); auto parameter = ui::LinearLayoutParameter::create(); parameter->setMargin(margin); - if (info->left() != 0) { -// parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::) + if (info->left() > MATH_EPSILON) { + parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::LEFT); + } else if (info->top() > MATH_EPSILON){ + parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::TOP); + } else if (info->right() > MATH_EPSILON){ + parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::RIGHT); + } else if (info->bottom() > MATH_EPSILON){ + parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::BOTTOM); + } else if (info->verticalCenter() > MATH_EPSILON){ + parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::CENTER_VERTICAL); + } else if (info->horizontalCenter() > MATH_EPSILON){ + parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::CENTER_HORIZONTAL); } widgetNode->setLayoutParameter(parameter); - // save the widget component info auto widgetInfo = WidgetAdapter::create(); widgetInfo->setAdaptNode(widgetNode); -// widgetInfo->setWidgetData(info); _needAdaptWidgets.pushBack(widgetInfo); } } diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp index b8e88b74..e8cbccfb 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp @@ -79,16 +79,17 @@ void WidgetAdapter::doAlignOnce() } CCASSERT(_layoutTarget != nullptr, "layout target can't be null"); - _layoutNode->setLayoutType(cocos2d::ui::LayoutType::HORIZONTAL); + _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::HORIZONTAL); _layoutNode->setContentSize(_layoutTarget->getContentSize()); - _layoutNode->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); - _layoutNode->setBackGroundColor(cocos2d::Color3B(128, 128, 128)); - _layoutNode->setOpacity(128); _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); _layoutNode->setPosition(_layoutTarget->getPosition()); _layoutNode->setName(_needAdaptNode->getName() + " Layout"); + // debug info + _layoutNode->setBackGroundColor(cocos2d::Color3B(128, 128, 128)); + _layoutNode->setOpacity(128); + insertLayoutNode(); } From ecc726f53fe032c3d1d5e21660d9f5860f7904bb Mon Sep 17 00:00:00 2001 From: drelaptop Date: Mon, 2 Apr 2018 15:34:54 +0800 Subject: [PATCH 22/29] change to relative layout, correct --- .../reader/CreatorReader.cpp | 41 +++++++++++++------ .../reader/ui/WidgetAdapter.cpp | 10 +---- .../reader/ui/WidgetAdapter.h | 20 ++------- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index e1c0aeb5..110feee6 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -613,22 +613,37 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu const auto& info = nodeBuffer->widget(); auto widgetNode = dynamic_cast(node); if ((info != nullptr) && (widgetNode != nullptr)) { + // the creator scene file didn't include the info about align which side + bool isAlignLeft = fabs(info->left()) > MATH_EPSILON ? true : false; + bool isAlignTop = fabs(info->top()) > MATH_EPSILON ? true : false; + bool isAlignRight = fabs(info->right()) > MATH_EPSILON ? true : false; + bool isAlignBottom = fabs(info->bottom()) > MATH_EPSILON ? true : false; + bool isAlignVerticalCenter = fabs(info->verticalCenter()) > MATH_EPSILON ? true : false; + bool isAlignHorizontalCenter = fabs(info->horizontalCenter()) > MATH_EPSILON ? true : false; // save the widget component info const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); - auto parameter = ui::LinearLayoutParameter::create(); + auto parameter = ui::RelativeLayoutParameter::create(); parameter->setMargin(margin); - if (info->left() > MATH_EPSILON) { - parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::LEFT); - } else if (info->top() > MATH_EPSILON){ - parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::TOP); - } else if (info->right() > MATH_EPSILON){ - parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::RIGHT); - } else if (info->bottom() > MATH_EPSILON){ - parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::BOTTOM); - } else if (info->verticalCenter() > MATH_EPSILON){ - parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::CENTER_VERTICAL); - } else if (info->horizontalCenter() > MATH_EPSILON){ - parameter->setGravity(ui::LinearLayoutParameter::LinearGravity::CENTER_HORIZONTAL); + // TODO: imp Layout target, how to get the layout target? + // parameter->setRelativeToWidgetName(const std::string &name); + if (isAlignLeft && isAlignTop) { + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT); + } else if (isAlignTop && isAlignRight){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT); + } else if (isAlignRight && isAlignBottom){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM); + } else if (isAlignBottom && isAlignLeft){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM); + } else if (isAlignVerticalCenter && isAlignLeft){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); + } else if (isAlignVerticalCenter && isAlignRight){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL); + } else if (isAlignHorizontalCenter && isAlignTop){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL); + } else if (isAlignHorizontalCenter && isAlignBottom){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL); + } else if (isAlignHorizontalCenter && isAlignVerticalCenter){ + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); } widgetNode->setLayoutParameter(parameter); auto widgetInfo = WidgetAdapter::create(); diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp index e8cbccfb..42172702 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp @@ -47,7 +47,6 @@ bool WidgetAdapter::init() WidgetAdapter::WidgetAdapter() : _layoutTarget(nullptr) , _needAdaptNode(nullptr) -, _widgetData(nullptr) { } @@ -79,16 +78,11 @@ void WidgetAdapter::doAlignOnce() } CCASSERT(_layoutTarget != nullptr, "layout target can't be null"); - _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::HORIZONTAL); + _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE); _layoutNode->setContentSize(_layoutTarget->getContentSize()); - _layoutNode->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); _layoutNode->setPosition(_layoutTarget->getPosition()); - _layoutNode->setName(_needAdaptNode->getName() + " Layout"); - - // debug info - _layoutNode->setBackGroundColor(cocos2d::Color3B(128, 128, 128)); - _layoutNode->setOpacity(128); + _layoutNode->setName(PLUGIN_EXTRA_LAYOUT_NAME); insertLayoutNode(); } diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h index 8bf681f6..a3cdbbef 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h @@ -31,6 +31,8 @@ NS_CCR_BEGIN +#define PLUGIN_EXTRA_LAYOUT_NAME "Creator Widget to Cocos2d-x Layout" + class WidgetAdapter : public cocos2d::Ref { @@ -46,7 +48,7 @@ class WidgetAdapter : public cocos2d::Ref void setWidgetData(const creator::buffers::Widget *const widgetData); // set after known AdaptNode's parent void setLayoutTarget(cocos2d::Node* layoutTarget); - // adapt layout depend on _widgetData and _layoutTarget + // adapt layout depend and _layoutTarget void doAlignOnce(); private: // widget layout target, it's a Node @@ -55,21 +57,7 @@ class WidgetAdapter : public cocos2d::Ref cocos2d::Node* _needAdaptNode; // insert the _layout between _nodeNeedWidget and its parent cocos2d::ui::Layout* _layoutNode; - // layout information source,exported from the creator - const creator::buffers::Widget* const _widgetData; - // change the node relationship to insert Layout. + // insert Layout to support widget component. void insertLayoutNode(); }; - -//class WidgetManager : public cocos2d::Ref -//{ -//public: -// void addWidgetInfo(cocos2d::Node* parent, creator::WidgetAdapter* adapter); -//private: -// // -// std::map _widgetInfoMap; -// -// CREATOR_DISALLOW_COPY_ASSIGN_AND_MOVE(WidgetManager); -//} - NS_CCR_END From f2a70b7541634a8f149eb35b80e644dcde64e37a Mon Sep 17 00:00:00 2001 From: drelaptop Date: Mon, 2 Apr 2018 18:57:36 +0800 Subject: [PATCH 23/29] add widget manager, run fail --- .../core/parser/Widget.js | 3 +- .../reader/CMakeLists.txt | 4 +- .../reader/CreatorReader.cpp | 22 +++++----- .../reader/CreatorReader.h | 13 ++---- .../{WidgetAdapter.cpp => WidgetExport.cpp} | 41 ++++++++++++++----- .../ui/{WidgetAdapter.h => WidgetExport.h} | 19 +++++++-- 6 files changed, 64 insertions(+), 38 deletions(-) rename creator_project/packages/creator-luacpp-support/reader/ui/{WidgetAdapter.cpp => WidgetExport.cpp} (79%) rename creator_project/packages/creator-luacpp-support/reader/ui/{WidgetAdapter.h => WidgetExport.h} (85%) diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js index e1ec44cc..ef87b622 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js @@ -15,7 +15,7 @@ class Widget { result.top = data._top; result.bottom = data._bottom; result.verticalCenter = data._verticalCenter; - result.horizontalCenter = data._verticalCenter; + result.horizontalCenter = data._horizontalCenter; // If true, value is pixel, otherwise is percentage (0 - 1) result.isAbsLeft = data._isAbsLeft; @@ -26,7 +26,6 @@ class Widget { result.isAbsVerticalCenter = data._isAbsVerticalCenter; Utils.log("parse widget result value:" + JSON.stringify(result)); - debugger; return result; } diff --git a/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt b/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt index daa01079..fa2a0b54 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt +++ b/creator_project/packages/creator-luacpp-support/reader/CMakeLists.txt @@ -31,7 +31,7 @@ set(READER_HEADER Macros.h ui/RichtextStringVisitor.h ui/PageView.h - ui/WidgetAdapter.h + ui/WidgetExport.h ) set(READER_SOURCE @@ -47,7 +47,7 @@ set(READER_SOURCE CreatorReader.cpp ui/PageView.cpp ui/RichtextStringVisitor.cpp - ui/WidgetAdapter.cpp + ui/WidgetExport.cpp ) if(BUILD_LUA_LIBS) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 110feee6..1f975482 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -131,10 +131,13 @@ CreatorReader::CreatorReader() { _animationManager = new AnimationManager(); _collisionManager = new ColliderManager(); + _widgetManager = new WidgetManager(); _animationManager->autorelease(); _collisionManager->autorelease(); + _widgetManager->autorelease(); CC_SAFE_RETAIN(_animationManager); CC_SAFE_RETAIN(_collisionManager); + CC_SAFE_RETAIN(_widgetManager); } CreatorReader::~CreatorReader() @@ -278,13 +281,13 @@ cocos2d::Scene* CreatorReader::getSceneGraph() const child->setPosition(child->getPosition() + _positionDiffDesignResolution); _animationManager->playOnLoad(); - + node->addChild(_collisionManager); node->addChild(_animationManager); _collisionManager->start(); - // insert widget-layout node - adjustWidgets(); + _widgetManager->setupWidgets(); + node->addChild(_widgetManager); return static_cast(node); } @@ -613,6 +616,8 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu const auto& info = nodeBuffer->widget(); auto widgetNode = dynamic_cast(node); if ((info != nullptr) && (widgetNode != nullptr)) { + // debug + CCLOG("%s", widgetNode->getName().c_str()); // the creator scene file didn't include the info about align which side bool isAlignLeft = fabs(info->left()) > MATH_EPSILON ? true : false; bool isAlignTop = fabs(info->top()) > MATH_EPSILON ? true : false; @@ -648,7 +653,8 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu widgetNode->setLayoutParameter(parameter); auto widgetInfo = WidgetAdapter::create(); widgetInfo->setAdaptNode(widgetNode); - _needAdaptWidgets.pushBack(widgetInfo); + widgetInfo->setIsAlignOnce(info->isAlignOnce()); + _widgetManager->_needAdaptWidgets.pushBack(widgetInfo); } } @@ -1507,14 +1513,6 @@ void CreatorReader::adjustPosition(cocos2d::Node* node) const } } -void CreatorReader::adjustWidgets() const -{ - for(auto& adapter : _needAdaptWidgets){ - adapter->doAlignOnce(); - CCLOG("adjustWidgets Once"); - } -} - // // Helper free functions // diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h index 1ea832b9..04d89920 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h @@ -34,7 +34,7 @@ #include "collider/ColliderManager.h" #include "dragonbones/DragonBonesHeaders.h" #include "dragonbones/cocos2dx/CCDragonBonesHeaders.h" -#include "ui/WidgetAdapter.h" +#include "ui/WidgetExport.h" @@ -159,20 +159,15 @@ class CreatorReader: public cocos2d::Ref this function adjust that */ void adjustPosition(cocos2d::Node* node) const; - /** Widget in creator is a component used to do Layout, - but in cocos2d-x is a Base class for all ui widgets. - To preduce the similar effect, we have to add a Layout between parent Node and child Node. - */ - void adjustWidgets() const; - // variables cocos2d::Data _data; std::string _version; - mutable cocos2d::Vector _needAdaptWidgets; - AnimationManager *_animationManager; ColliderManager *_collisionManager; + + // Widget in creator is a component used to do Layout + WidgetManager *_widgetManager; // creator will make scene at the center of screen when apply design solution strategy, cocos2d-x doesn't do it like this // this value record the diff diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp similarity index 79% rename from creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp rename to creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp index 42172702..f8c2c14c 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************************************************/ -#include "WidgetAdapter.h" +#include "WidgetExport.h" NS_CCR_BEGIN @@ -39,13 +39,15 @@ WidgetAdapter* WidgetAdapter::create() bool WidgetAdapter::init() { _layoutNode = cocos2d::ui::Layout::create(); - CC_SAFE_RETAIN(_layoutNode); + _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE); + CC_SAFE_RETAIN(_layoutNode); return true; } WidgetAdapter::WidgetAdapter() -: _layoutTarget(nullptr) +: _isAlignOnce(true) +, _layoutTarget(nullptr) , _needAdaptNode(nullptr) { @@ -56,14 +58,13 @@ WidgetAdapter::~WidgetAdapter() CC_SAFE_RELEASE(_layoutNode); } -void WidgetAdapter::setAdaptNode(cocos2d::Node* needAdaptNode) +void WidgetAdapter::setIsAlignOnce(bool isAlignOnce) { - _needAdaptNode = needAdaptNode; + _isAlignOnce = isAlignOnce; } - -void WidgetAdapter::setWidgetData(const creator::buffers::Widget *const widgetData) +void WidgetAdapter::setAdaptNode(cocos2d::Node* needAdaptNode) { -// _widgetData = widgetData; + _needAdaptNode = needAdaptNode; } void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) @@ -71,14 +72,13 @@ void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) _layoutTarget = layoutTarget; } -void WidgetAdapter::doAlignOnce() +void WidgetAdapter::configLayoutNode() { if (_layoutTarget == nullptr) { _layoutTarget = _needAdaptNode->getParent(); } CCASSERT(_layoutTarget != nullptr, "layout target can't be null"); - _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE); _layoutNode->setContentSize(_layoutTarget->getContentSize()); _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); _layoutNode->setPosition(_layoutTarget->getPosition()); @@ -95,5 +95,26 @@ void WidgetAdapter::insertLayoutNode() _needAdaptNode->removeFromParentAndCleanup(false); _layoutNode->addChild(_needAdaptNode); parent->addChild(_layoutNode); + + _layoutNode->forceDoLayout(); +} + +void WidgetManager::update(float dt) +{ + for (auto& adapter:_needAdaptWidgets) { + auto layout = dynamic_cast(adapter->_needAdaptNode->getParent()); + if(!(adapter->_isAlignOnce) && layout != nullptr) + { + layout->setContentSize(adapter->_layoutTarget->getContentSize()); + } + } +} + +void WidgetManager::setupWidgets() +{ + for (auto& adapter:_needAdaptWidgets) { + adapter->configLayoutNode(); + } +// scheduleUpdate(); } NS_CCR_END diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h similarity index 85% rename from creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h rename to creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h index a3cdbbef..2394a3fd 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetAdapter.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h @@ -43,14 +43,16 @@ class WidgetAdapter : public cocos2d::Ref virtual ~WidgetAdapter(); bool init(); - + void setIsAlignOnce(bool isAlignOnce); void setAdaptNode(cocos2d::Node* needAdaptNode); - void setWidgetData(const creator::buffers::Widget *const widgetData); // set after known AdaptNode's parent void setLayoutTarget(cocos2d::Node* layoutTarget); // adapt layout depend and _layoutTarget - void doAlignOnce(); + void configLayoutNode(); private: + friend class WidgetManager; + // only do layout once if true + bool _isAlignOnce; // widget layout target, it's a Node cocos2d::Node* _layoutTarget; // _layoutTarget must existed, the default target is _needAdaptNode's parent @@ -60,4 +62,15 @@ class WidgetAdapter : public cocos2d::Ref // insert Layout to support widget component. void insertLayoutNode(); }; + +class WidgetManager : public cocos2d::Node +{ +public: + void update(float dt); +private: + friend class CreatorReader; + + void setupWidgets(); + cocos2d::Vector _needAdaptWidgets; +}; NS_CCR_END From dcc88d2521383a5d4da913b0f579248f69fe3a3a Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 3 Apr 2018 10:33:49 +0800 Subject: [PATCH 24/29] correct WidgetManager --- .../reader/CreatorReader.cpp | 5 +++ .../reader/CreatorReader.h | 6 +++ .../reader/ui/WidgetExport.cpp | 39 ++++++++++++++----- .../reader/ui/WidgetExport.h | 7 +++- 4 files changed, 46 insertions(+), 11 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 1f975482..efd63cd8 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -302,6 +302,11 @@ ColliderManager* CreatorReader::getColliderManager() const return _collisionManager; } +WidgetManager* CreatorReader::getWidgetManager() const +{ + return _widgetManager; +} + std::string CreatorReader::getVersion() const { return _version; diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h index 04d89920..29c6c9b7 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h @@ -63,6 +63,12 @@ class CreatorReader: public cocos2d::Ref */ ColliderManager* getColliderManager() const; + /** + Return the WidgetManager. It is added as a child of the Scene to make Creator Widget component take effect. + @return The `WidgetManager` of the scene + */ + WidgetManager* getWidgetManager() const; + /** Returns the FlatBuffers Schema version. @return a string containing the flatbuffer's schema version diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp index f8c2c14c..9a5ee3d5 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp @@ -72,7 +72,7 @@ void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) _layoutTarget = layoutTarget; } -void WidgetAdapter::configLayoutNode() +void WidgetAdapter::syncLayoutProperty() { if (_layoutTarget == nullptr) { _layoutTarget = _needAdaptNode->getParent(); @@ -82,9 +82,6 @@ void WidgetAdapter::configLayoutNode() _layoutNode->setContentSize(_layoutTarget->getContentSize()); _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); _layoutNode->setPosition(_layoutTarget->getPosition()); - _layoutNode->setName(PLUGIN_EXTRA_LAYOUT_NAME); - - insertLayoutNode(); } void WidgetAdapter::insertLayoutNode() @@ -93,28 +90,50 @@ void WidgetAdapter::insertLayoutNode() CCASSERT(parent != nullptr, "adaptNode's parent can't be null"); _needAdaptNode->removeFromParentAndCleanup(false); + _layoutNode->setName(PLUGIN_EXTRA_LAYOUT_NAME); _layoutNode->addChild(_needAdaptNode); parent->addChild(_layoutNode); +} + +WidgetManager::WidgetManager() +: _forceAlignDirty(false) +{ - _layoutNode->forceDoLayout(); +} + +WidgetManager::~WidgetManager() +{ + } void WidgetManager::update(float dt) +{ + doAlign(); +} + +void WidgetManager::forceDoAlign() +{ + _forceAlignDirty = true; + doAlign(); +} + +void WidgetManager::doAlign() { for (auto& adapter:_needAdaptWidgets) { - auto layout = dynamic_cast(adapter->_needAdaptNode->getParent()); - if(!(adapter->_isAlignOnce) && layout != nullptr) + if((_forceAlignDirty || !(adapter->_isAlignOnce))) { - layout->setContentSize(adapter->_layoutTarget->getContentSize()); + adapter->syncLayoutProperty(); } } + _forceAlignDirty = false; } void WidgetManager::setupWidgets() { for (auto& adapter:_needAdaptWidgets) { - adapter->configLayoutNode(); + adapter->syncLayoutProperty(); + adapter->insertLayoutNode(); } -// scheduleUpdate(); + scheduleUpdate(); } NS_CCR_END diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h index 2394a3fd..c9e0bb51 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h @@ -48,7 +48,7 @@ class WidgetAdapter : public cocos2d::Ref // set after known AdaptNode's parent void setLayoutTarget(cocos2d::Node* layoutTarget); // adapt layout depend and _layoutTarget - void configLayoutNode(); + void syncLayoutProperty(); private: friend class WidgetManager; // only do layout once if true @@ -67,10 +67,15 @@ class WidgetManager : public cocos2d::Node { public: void update(float dt); + void forceDoAlign(); private: friend class CreatorReader; + WidgetManager(); + virtual ~WidgetManager(); void setupWidgets(); + void doAlign(); + bool _forceAlignDirty; cocos2d::Vector _needAdaptWidgets; }; NS_CCR_END From 48c48305d3444e331c5165c8afc8bf0ccbefa9f2 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 3 Apr 2018 11:18:57 +0800 Subject: [PATCH 25/29] add comments --- .../reader/CreatorReader.cpp | 9 ++++--- .../reader/ui/WidgetExport.cpp | 15 ++++++------ .../reader/ui/WidgetExport.h | 24 ++++++++++++------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index efd63cd8..12b1c457 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -621,8 +621,6 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu const auto& info = nodeBuffer->widget(); auto widgetNode = dynamic_cast(node); if ((info != nullptr) && (widgetNode != nullptr)) { - // debug - CCLOG("%s", widgetNode->getName().c_str()); // the creator scene file didn't include the info about align which side bool isAlignLeft = fabs(info->left()) > MATH_EPSILON ? true : false; bool isAlignTop = fabs(info->top()) > MATH_EPSILON ? true : false; @@ -634,8 +632,6 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); auto parameter = ui::RelativeLayoutParameter::create(); parameter->setMargin(margin); - // TODO: imp Layout target, how to get the layout target? - // parameter->setRelativeToWidgetName(const std::string &name); if (isAlignLeft && isAlignTop) { parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT); } else if (isAlignTop && isAlignRight){ @@ -655,8 +651,11 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu } else if (isAlignHorizontalCenter && isAlignVerticalCenter){ parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); } - widgetNode->setLayoutParameter(parameter); auto widgetInfo = WidgetAdapter::create(); + // TODO: support Layout target, how to get the layout target? + // parameter->setRelativeToWidgetName(const std::string &name); + // widgetInfo->setLayoutTarget(cocos2d::Node *layoutTarget); + widgetNode->setLayoutParameter(parameter); widgetInfo->setAdaptNode(widgetNode); widgetInfo->setIsAlignOnce(info->isAlignOnce()); _widgetManager->_needAdaptWidgets.pushBack(widgetInfo); diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp index 9a5ee3d5..237e76ea 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp @@ -74,21 +74,22 @@ void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) void WidgetAdapter::syncLayoutProperty() { - if (_layoutTarget == nullptr) { - _layoutTarget = _needAdaptNode->getParent(); - } - CCASSERT(_layoutTarget != nullptr, "layout target can't be null"); + _layoutNode->setContentSize(_layoutTarget->getContentSize()); _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); _layoutNode->setPosition(_layoutTarget->getPosition()); } -void WidgetAdapter::insertLayoutNode() +void WidgetAdapter::setupLayout() { auto parent = _needAdaptNode->getParent(); CCASSERT(parent != nullptr, "adaptNode's parent can't be null"); + // set default layout target to parent node + if (_layoutTarget == nullptr) { + _layoutTarget = parent; + } _needAdaptNode->removeFromParentAndCleanup(false); _layoutNode->setName(PLUGIN_EXTRA_LAYOUT_NAME); _layoutNode->addChild(_needAdaptNode); @@ -120,7 +121,7 @@ void WidgetManager::forceDoAlign() void WidgetManager::doAlign() { for (auto& adapter:_needAdaptWidgets) { - if((_forceAlignDirty || !(adapter->_isAlignOnce))) + if(_forceAlignDirty || !(adapter->_isAlignOnce)) { adapter->syncLayoutProperty(); } @@ -131,8 +132,8 @@ void WidgetManager::doAlign() void WidgetManager::setupWidgets() { for (auto& adapter:_needAdaptWidgets) { + adapter->setupLayout(); adapter->syncLayoutProperty(); - adapter->insertLayoutNode(); } scheduleUpdate(); } diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h index c9e0bb51..28746b00 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h @@ -31,8 +31,10 @@ NS_CCR_BEGIN +// name of extra layout Node #define PLUGIN_EXTRA_LAYOUT_NAME "Creator Widget to Cocos2d-x Layout" +// support export the creator widget component to cocos2d-x layout class WidgetAdapter : public cocos2d::Ref { @@ -45,28 +47,32 @@ class WidgetAdapter : public cocos2d::Ref bool init(); void setIsAlignOnce(bool isAlignOnce); void setAdaptNode(cocos2d::Node* needAdaptNode); - // set after known AdaptNode's parent + + // TODO: support the align target of a widget component, default target is parent Node void setLayoutTarget(cocos2d::Node* layoutTarget); - // adapt layout depend and _layoutTarget - void syncLayoutProperty(); private: friend class WidgetManager; - // only do layout once if true + // only do layout align once if true bool _isAlignOnce; - // widget layout target, it's a Node + // widget layout target, it's a Node, default target is _needAdaptNode's parent cocos2d::Node* _layoutTarget; - // _layoutTarget must existed, the default target is _needAdaptNode's parent + // the node include a widget component, it must be a UI Widget? cocos2d::Node* _needAdaptNode; // insert the _layout between _nodeNeedWidget and its parent cocos2d::ui::Layout* _layoutNode; - // insert Layout to support widget component. - void insertLayoutNode(); + // insert Layout Node to support widget component. + void setupLayout(); + // adapt layout property depend on _layoutTarget + void syncLayoutProperty(); }; +// manager all the widget component align class WidgetManager : public cocos2d::Node { public: - void update(float dt); + // check widget component property AlignOnce every frame, update align if this property set to false + virtual void update(float dt); + // do layout align manually, you should call it when you make layout content size different from scene in Creator. void forceDoAlign(); private: friend class CreatorReader; From d60dd677f4474bd29295598828e82045b0505ec7 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 3 Apr 2018 11:48:13 +0800 Subject: [PATCH 26/29] add widget release --- .../packages/creator-luacpp-support/reader/CreatorReader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 12b1c457..9a8759c9 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -144,6 +144,7 @@ CreatorReader::~CreatorReader() { CC_SAFE_RELEASE_NULL(_collisionManager); CC_SAFE_RELEASE_NULL(_animationManager); + CC_SAFE_RELEASE_NULL(_widgetManager); } CreatorReader* CreatorReader::createWithFilename(const std::string& filename) From 2b0e0ace7c01fd21e480354889ffde9dbfd6c73f Mon Sep 17 00:00:00 2001 From: drelaptop Date: Tue, 3 Apr 2018 14:42:04 +0800 Subject: [PATCH 27/29] update comments --- .../packages/creator-luacpp-support/core/parser/Widget.js | 6 ++---- .../creator-luacpp-support/reader/ui/WidgetExport.cpp | 2 -- .../creator-luacpp-support/reader/ui/WidgetExport.h | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js index ef87b622..00be39fb 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js @@ -4,12 +4,9 @@ class Widget { static parse(data) { let result = {}; - Utils.log("parse widget init value:" + JSON.stringify(data)); - - // meaningful in cocos2d-x? result.isAlignOnce = data.isAlignOnce; - // margin value, pixel or percentage + // margin value, only support pixel, didn't support percentage result.left = data._left; result.right = data._right; result.top = data._top; @@ -18,6 +15,7 @@ class Widget { result.horizontalCenter = data._horizontalCenter; // If true, value is pixel, otherwise is percentage (0 - 1) + // invalid value in cocos2d-x result.isAbsLeft = data._isAbsLeft; result.isAbsRight = data._isAbsRight; result.isAbsTop = data._isAbsTop; diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp index 237e76ea..5a465be3 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp @@ -74,8 +74,6 @@ void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) void WidgetAdapter::syncLayoutProperty() { - - _layoutNode->setContentSize(_layoutTarget->getContentSize()); _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); _layoutNode->setPosition(_layoutTarget->getPosition()); diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h index 28746b00..81308166 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h @@ -71,7 +71,7 @@ class WidgetManager : public cocos2d::Node { public: // check widget component property AlignOnce every frame, update align if this property set to false - virtual void update(float dt); + virtual void update(float dt) override; // do layout align manually, you should call it when you make layout content size different from scene in Creator. void forceDoAlign(); private: From 1b1aee1fe1fa4972dc69a077e65c4e5ee46bb440 Mon Sep 17 00:00:00 2001 From: drelaptop Date: Wed, 4 Apr 2018 10:43:58 +0800 Subject: [PATCH 28/29] support 9 align size comb --- .../creator-luacpp-support/CreatorReader.fbs | 1 + .../core/parser/Widget.js | 1 + .../reader/CreatorReader.cpp | 62 +++++++++++-------- .../reader/CreatorReader_generated.h | 32 ++++++---- .../reader/ui/WidgetExport.h | 23 +++++++ 5 files changed, 80 insertions(+), 39 deletions(-) diff --git a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs index dac43a1e..6f7b6506 100644 --- a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs +++ b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs @@ -358,6 +358,7 @@ table Collider table Widget { isAlignOnce:bool; + alignFlags:int; left:float; right:float; top:float; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js index 00be39fb..7068fd8f 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js @@ -5,6 +5,7 @@ class Widget { let result = {}; result.isAlignOnce = data.isAlignOnce; + result.alignFlags = data._alignFlags; // margin value, only support pixel, didn't support percentage result.left = data._left; diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 9a8759c9..275e3289 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -622,36 +622,46 @@ void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBu const auto& info = nodeBuffer->widget(); auto widgetNode = dynamic_cast(node); if ((info != nullptr) && (widgetNode != nullptr)) { - // the creator scene file didn't include the info about align which side - bool isAlignLeft = fabs(info->left()) > MATH_EPSILON ? true : false; - bool isAlignTop = fabs(info->top()) > MATH_EPSILON ? true : false; - bool isAlignRight = fabs(info->right()) > MATH_EPSILON ? true : false; - bool isAlignBottom = fabs(info->bottom()) > MATH_EPSILON ? true : false; - bool isAlignVerticalCenter = fabs(info->verticalCenter()) > MATH_EPSILON ? true : false; - bool isAlignHorizontalCenter = fabs(info->horizontalCenter()) > MATH_EPSILON ? true : false; - // save the widget component info + // save the widget margin info const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); auto parameter = ui::RelativeLayoutParameter::create(); parameter->setMargin(margin); - if (isAlignLeft && isAlignTop) { - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT); - } else if (isAlignTop && isAlignRight){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT); - } else if (isAlignRight && isAlignBottom){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM); - } else if (isAlignBottom && isAlignLeft){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM); - } else if (isAlignVerticalCenter && isAlignLeft){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); - } else if (isAlignVerticalCenter && isAlignRight){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL); - } else if (isAlignHorizontalCenter && isAlignTop){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL); - } else if (isAlignHorizontalCenter && isAlignBottom){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL); - } else if (isAlignHorizontalCenter && isAlignVerticalCenter){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); + + WidgetAdapter::AlignComb alignComb = static_cast(info->alignFlags()); + switch (alignComb) { + case WidgetAdapter::AlignComb::TOP_LEFT : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT); + break; + case WidgetAdapter::AlignComb::TOP_RIGHT : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT); + break; + case WidgetAdapter::AlignComb::RIGHT_BOTTOM : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM); + break; + case WidgetAdapter::AlignComb::LEFT_BOTTOM : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM); + break; + case WidgetAdapter::AlignComb::LEFT_CENTER_VERTICAL : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); + break; + case WidgetAdapter::AlignComb::RIGHT_CENTER_VERTICAL : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL); + break; + case WidgetAdapter::AlignComb::TOP_CENTER_HORIZONTAL : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL); + break; + case WidgetAdapter::AlignComb::BOTTOM_CENTER_HORIZONTAL : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL); + break; + case WidgetAdapter::AlignComb::CENTER_IN_PARENT : + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); + break; + default: + CCLOG("align combination of UI Node: %s isn't supported", node->getName().c_str()); + CCASSERT(false, "Only 9 creator align combinations are supported by cocos2d-x"); + break; } + auto widgetInfo = WidgetAdapter::create(); // TODO: support Layout target, how to get the layout target? // parameter->setRelativeToWidgetName(const std::string &name); diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h index b0490f5a..5803b34e 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h @@ -2775,20 +2775,22 @@ inline flatbuffers::Offset CreateColliderDirect(flatbuffers::FlatBuffe struct Widget FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { enum { VT_ISALIGNONCE = 4, - VT_LEFT = 6, - VT_RIGHT = 8, - VT_TOP = 10, - VT_BOTTOM = 12, - VT_VERTICALCENTER = 14, - VT_HORIZONTALCENTER = 16, - VT_ISABSLEFT = 18, - VT_ISABSRIGHT = 20, - VT_ISABSTOP = 22, - VT_ISABSBOTTOM = 24, - VT_ISABSHORIZONTALCENTER = 26, - VT_ISABSVERTICALCENTER = 28 + VT_ALIGNFLAGS = 6, + VT_LEFT = 8, + VT_RIGHT = 10, + VT_TOP = 12, + VT_BOTTOM = 14, + VT_VERTICALCENTER = 16, + VT_HORIZONTALCENTER = 18, + VT_ISABSLEFT = 20, + VT_ISABSRIGHT = 22, + VT_ISABSTOP = 24, + VT_ISABSBOTTOM = 26, + VT_ISABSHORIZONTALCENTER = 28, + VT_ISABSVERTICALCENTER = 30 }; bool isAlignOnce() const { return GetField(VT_ISALIGNONCE, 0) != 0; } + int32_t alignFlags() const { return GetField(VT_ALIGNFLAGS, 0); } float left() const { return GetField(VT_LEFT, 0.0f); } float right() const { return GetField(VT_RIGHT, 0.0f); } float top() const { return GetField(VT_TOP, 0.0f); } @@ -2804,6 +2806,7 @@ struct Widget FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_ISALIGNONCE) && + VerifyField(verifier, VT_ALIGNFLAGS) && VerifyField(verifier, VT_LEFT) && VerifyField(verifier, VT_RIGHT) && VerifyField(verifier, VT_TOP) && @@ -2824,6 +2827,7 @@ struct WidgetBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_isAlignOnce(bool isAlignOnce) { fbb_.AddElement(Widget::VT_ISALIGNONCE, static_cast(isAlignOnce), 0); } + void add_alignFlags(int32_t alignFlags) { fbb_.AddElement(Widget::VT_ALIGNFLAGS, alignFlags, 0); } void add_left(float left) { fbb_.AddElement(Widget::VT_LEFT, left, 0.0f); } void add_right(float right) { fbb_.AddElement(Widget::VT_RIGHT, right, 0.0f); } void add_top(float top) { fbb_.AddElement(Widget::VT_TOP, top, 0.0f); } @@ -2839,13 +2843,14 @@ struct WidgetBuilder { WidgetBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } WidgetBuilder &operator=(const WidgetBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 13)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 14)); return o; } }; inline flatbuffers::Offset CreateWidget(flatbuffers::FlatBufferBuilder &_fbb, bool isAlignOnce = false, + int32_t alignFlags = 0, float left = 0.0f, float right = 0.0f, float top = 0.0f, @@ -2865,6 +2870,7 @@ inline flatbuffers::Offset CreateWidget(flatbuffers::FlatBufferBuilder & builder_.add_top(top); builder_.add_right(right); builder_.add_left(left); + builder_.add_alignFlags(alignFlags); builder_.add_isAbsVerticalCenter(isAbsVerticalCenter); builder_.add_isAbsHorizontalCenter(isAbsHorizontalCenter); builder_.add_isAbsBottom(isAbsBottom); diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h index 81308166..2608dce0 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h @@ -34,11 +34,34 @@ NS_CCR_BEGIN // name of extra layout Node #define PLUGIN_EXTRA_LAYOUT_NAME "Creator Widget to Cocos2d-x Layout" +// creator align flag, see: https://github.com/cocos-creator/engine/blob/master/cocos2d/core/base-ui/CCWidgetManager.js +#define CREATOR_ALIGN_TOP (1 << 0) +#define CREATOR_ALIGN_MID (1 << 1) +#define CREATOR_ALIGN_BOT (1 << 2) +#define CREATOR_ALIGN_LEFT (1 << 3) +#define CREATOR_ALIGN_CENTER (1 << 4) +#define CREATOR_ALIGN_RIGHT (1 << 5) + // support export the creator widget component to cocos2d-x layout class WidgetAdapter : public cocos2d::Ref { public: + // only 9 creator align combinations are supported by cocos2d-x + enum class AlignComb + { + TOP_LEFT = CREATOR_ALIGN_LEFT | CREATOR_ALIGN_TOP, + TOP_CENTER_HORIZONTAL = CREATOR_ALIGN_CENTER | CREATOR_ALIGN_TOP, + TOP_RIGHT = CREATOR_ALIGN_TOP | CREATOR_ALIGN_RIGHT, + LEFT_CENTER_VERTICAL = CREATOR_ALIGN_MID | CREATOR_ALIGN_LEFT, + + CENTER_IN_PARENT = CREATOR_ALIGN_CENTER | CREATOR_ALIGN_MID, + + RIGHT_CENTER_VERTICAL = CREATOR_ALIGN_MID | CREATOR_ALIGN_RIGHT, + LEFT_BOTTOM = CREATOR_ALIGN_BOT | CREATOR_ALIGN_LEFT, + BOTTOM_CENTER_HORIZONTAL = CREATOR_ALIGN_CENTER | CREATOR_ALIGN_BOT, + RIGHT_BOTTOM = CREATOR_ALIGN_RIGHT | CREATOR_ALIGN_BOT + }; static WidgetAdapter* create(); WidgetAdapter(); From 1ceed70302a0c919bcaaadd13689daed49d21888 Mon Sep 17 00:00:00 2001 From: KuovaneWu <811408414@qq.com> Date: Fri, 11 May 2018 10:57:24 +0800 Subject: [PATCH 29/29] support 9 auto align in node --- creator_project/assets/arial16.fnt.meta | 2 +- .../assets/scenes/Label/CreatorLabels.fire | 136 +++++- .../scenes/richtext/CreatorRichtext.fire | 400 ++++++++++------- .../scenes/toggle_group/toggle_group.fire | 402 +++++++++--------- .../creator-luacpp-support/CreatorReader.fbs | 4 +- .../core/parser/Node.js | 23 + .../core/parser/Utils.js | 2 +- .../core/parser/Widget.js | 7 +- .../creator-luacpp-support/package.json | 20 +- .../reader/CreatorReader.cpp | 107 +++-- .../reader/CreatorReader.h | 11 +- .../reader/CreatorReader_generated.h | 47 +- .../reader/animation/AnimateClip.cpp | 56 +-- .../reader/animation/AnimateClip.h | 3 +- .../reader/animation/AnimationClip.h | 4 +- .../reader/animation/AnimationManager.cpp | 2 +- .../reader/animation/AnimationManager.h | 2 +- .../reader/animation/Easing.cpp | 2 +- .../reader/collider/ColliderManager.cpp | 2 +- .../reader/ui/WidgetExport.cpp | 132 ++++-- .../reader/ui/WidgetExport.h | 60 ++- .../settings/creator-luacpp-support.json | 3 +- creator_project/settings/project.json | 7 +- 23 files changed, 908 insertions(+), 526 deletions(-) diff --git a/creator_project/assets/arial16.fnt.meta b/creator_project/assets/arial16.fnt.meta index bee66008..25d137bf 100644 --- a/creator_project/assets/arial16.fnt.meta +++ b/creator_project/assets/arial16.fnt.meta @@ -1,5 +1,5 @@ { - "ver": "2.0.0", + "ver": "2.1.0", "uuid": "bffc9dd6-8114-4c3d-a0a6-03a4927e026c", "textureUuid": "2c8df125-099b-4cc6-aa64-a27080e09ead", "fontSize": 16, diff --git a/creator_project/assets/scenes/Label/CreatorLabels.fire b/creator_project/assets/scenes/Label/CreatorLabels.fire index 2e02435e..43ba1c5c 100644 --- a/creator_project/assets/scenes/Label/CreatorLabels.fire +++ b/creator_project/assets/scenes/Label/CreatorLabels.fire @@ -42,6 +42,9 @@ }, { "__id__": 20 + }, + { + "__id__": 23 } ], "_tag": -1, @@ -175,7 +178,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 320.17, + "width": 320, "height": 40 }, "_rotationX": 0, @@ -325,7 +328,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 748.47, + "width": 748, "height": 64 }, "_rotationX": 0, @@ -401,7 +404,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 222.81, + "width": 223, "height": 144 }, "_rotationX": 0, @@ -477,7 +480,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 259.06, + "width": 259, "height": 192 }, "_rotationX": 0, @@ -553,7 +556,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 304.67, + "width": 305, "height": 100 }, "_rotationX": 0, @@ -586,7 +589,8 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", @@ -621,7 +625,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 194.92, + "width": 195, "height": 100 }, "_rotationX": 0, @@ -656,7 +660,8 @@ }, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", @@ -691,7 +696,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 217.93, + "width": 218, "height": 100 }, "_rotationX": 0, @@ -724,11 +729,12 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", - "_name": "label with outline", + "_name": "systemfont label with outline", "_objFlags": 0, "_parent": { "__id__": 1 @@ -762,7 +768,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 313.1, + "width": 830, "height": 40 }, "_rotationX": 0, @@ -771,8 +777,8 @@ "_scaleY": 1, "_position": { "__type__": "cc.Vec2", - "x": 179, - "y": 334 + "x": 433, + "y": 383 }, "_skewX": 0, "_skewY": 0, @@ -790,14 +796,14 @@ }, "_enabled": true, "_useOriginalSize": false, - "_actualFontSize": 40, - "_fontSize": 40, + "_actualFontSize": 30, + "_fontSize": 30, "_lineHeight": 40, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, "_spacingX": 0, - "_N$string": "Label with outline", + "_N$string": "SystemFont Label with outline, Supported on iOS and Android", "_N$horizontalAlign": 1, "_N$verticalAlign": 1, "_N$fontFamily": "Arial", @@ -819,5 +825,101 @@ "a": 255 }, "_width": 2 + }, + { + "__type__": "cc.Node", + "_name": "TTFFont label with outline", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 24 + }, + { + "__id__": 25 + } + ], + "_prefab": null, + "_id": "94BvN19+VHabRV4Z12zw8f", + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_cascadeOpacityEnabled": true, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 539, + "height": 40 + }, + "_rotationX": 0, + "_rotationY": 0, + "_scaleX": 1, + "_scaleY": 1, + "_position": { + "__type__": "cc.Vec2", + "x": 296, + "y": 296 + }, + "_skewX": 0, + "_skewY": 0, + "_localZOrder": 0, + "_globalZOrder": 0, + "_opacityModifyRGB": false, + "groupIndex": 0 + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 23 + }, + "_enabled": true, + "_useOriginalSize": false, + "_actualFontSize": 40, + "_fontSize": 40, + "_lineHeight": 40, + "_enableWrapText": true, + "_N$file": { + "__uuid__": "27d18d5e-feac-410d-a9f8-8a9ddb7213c2" + }, + "_isSystemFontUsed": false, + "_spacingX": 0, + "_N$string": "TTFFont Label with outline", + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 0 + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 23 + }, + "_enabled": true, + "_color": { + "__type__": "cc.Color", + "r": 233, + "g": 16, + "b": 16, + "a": 255 + }, + "_width": 2 } ] \ No newline at end of file diff --git a/creator_project/assets/scenes/richtext/CreatorRichtext.fire b/creator_project/assets/scenes/richtext/CreatorRichtext.fire index 761881ee..bd9703df 100644 --- a/creator_project/assets/scenes/richtext/CreatorRichtext.fire +++ b/creator_project/assets/scenes/richtext/CreatorRichtext.fire @@ -11,26 +11,7 @@ { "__type__": "cc.Scene", "_objFlags": 0, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_cascadeOpacityEnabled": true, "_parent": null, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0, - "y": 0 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 0, - "height": 0 - }, "_children": [ { "__id__": 2 @@ -58,19 +39,58 @@ }, { "__id__": 18 + }, + { + "__id__": 20 } ], + "_tag": -1, + "_active": true, + "_components": [], + "_prefab": null, + "_id": "0572189b-6aa5-4c09-9c8d-ff168ef75b07", + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_cascadeOpacityEnabled": true, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "0572189b-6aa5-4c09-9c8d-ff168ef75b07", + "groupIndex": 0, "autoReleaseAssets": false }, { "__type__": "cc.Node", "_name": "Canvas", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": null, + "_id": "ac5d91QpzZHMoW8PRhftyVy", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -80,9 +100,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -93,7 +110,6 @@ "width": 960, "height": 640 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -107,16 +123,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "ac5d91QpzZHMoW8PRhftyVy", - "_active": true, - "_components": [ - { - "__id__": 3 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -139,6 +146,19 @@ "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 5 + } + ], + "_prefab": null, + "_id": "c40c3ap52JCsLDSlvzFmCId", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -148,9 +168,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -158,10 +175,9 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 160.06, + "width": 160, "height": 50 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -175,16 +191,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "c40c3ap52JCsLDSlvzFmCId", - "_active": true, - "_components": [ - { - "__id__": 5 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -201,12 +208,26 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 7 + } + ], + "_prefab": null, + "_id": "f2d6dPDZW9GWqv2yl5CROR3", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -216,9 +237,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -226,10 +244,9 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 183.4, + "width": 183, "height": 50 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -243,16 +260,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "f2d6dPDZW9GWqv2yl5CROR3", - "_active": true, - "_components": [ - { - "__id__": 7 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -269,12 +277,26 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 9 + } + ], + "_prefab": null, + "_id": "fe4c6WSs9pFiIqa0y5hKPAX", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -284,9 +306,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -294,10 +313,9 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 166.66, + "width": 167, "height": 50 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -311,16 +329,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "fe4c6WSs9pFiIqa0y5hKPAX", - "_active": true, - "_components": [ - { - "__id__": 9 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -337,12 +346,26 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 11 + } + ], + "_prefab": null, + "_id": "2010aetGNJP+LdKN+fe3pXc", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -352,9 +375,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -362,10 +382,9 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 155.61, + "width": 156, "height": 50 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -379,16 +398,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "2010aetGNJP+LdKN+fe3pXc", - "_active": true, - "_components": [ - { - "__id__": 11 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -405,12 +415,26 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 13 + } + ], + "_prefab": null, + "_id": "a574c2wl1JJTq11trBYQdkE", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -420,9 +444,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -430,10 +451,9 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 240.16, + "width": 240, "height": 50 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -447,16 +467,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "a574c2wl1JJTq11trBYQdkE", - "_active": true, - "_components": [ - { - "__id__": 13 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -473,12 +484,26 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 15 + } + ], + "_prefab": null, + "_id": "a8002HYzV5JE4EY72E2yh9D", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -488,9 +513,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -498,10 +520,9 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 144.51, + "width": 145, "height": 100 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -515,16 +536,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "a8002HYzV5JE4EY72E2yh9D", - "_active": true, - "_components": [ - { - "__id__": 15 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -541,12 +553,26 @@ "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 17 + } + ], + "_prefab": null, + "_id": "fa93dexW3lC77/yKrJCM7SY", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -556,9 +582,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -566,33 +589,23 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 341.54, - "height": 50 + "width": 617, + "height": 100 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, "_scaleY": 1, "_position": { "__type__": "cc.Vec2", - "x": 523, - "y": 576 + "x": 630, + "y": 541 }, "_skewX": 0, "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "fa93dexW3lC77/yKrJCM7SY", - "_active": true, - "_components": [ - { - "__id__": 17 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -603,18 +616,32 @@ "__id__": 16 }, "_enabled": true, - "_N$string": "A label with outline", + "_N$string": "SystemFont RichText with outline,
Supported on iOS and Android
", "_N$horizontalAlign": 0, "_N$fontSize": 40, "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": null + "_N$imageAtlas": null, + "_N$handleTouchEvent": true }, { "__type__": "cc.Node", "_name": "richtext", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 19 + } + ], + "_prefab": null, + "_id": "f3ab6x2tnFDSK7Zc9G5yMhB", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -624,9 +651,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -634,33 +658,94 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 22, + "width": 50.00000000000001, "height": 50 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, "_scaleY": 1, "_position": { "__type__": "cc.Vec2", - "x": 500, - "y": 417 + "x": 342, + "y": 375 }, "_skewX": 0, "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "f3ab6x2tnFDSK7Zc9G5yMhB", + "groupIndex": 0 + }, + { + "__type__": "cc.RichText", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 18 + }, + "_enabled": true, + "_N$string": "", + "_N$horizontalAlign": 0, + "_N$fontSize": 40, + "_N$font": null, + "_N$maxWidth": 0, + "_N$lineHeight": 50, + "_N$imageAtlas": { + "__uuid__": "5ad0d74a-bf8c-454a-863d-dd0cc29a4989" + }, + "_N$handleTouchEvent": true + }, + { + "__type__": "cc.Node", + "_name": "point img tag", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, "_active": true, "_components": [ { - "__id__": 19 + "__id__": 21 } ], "_prefab": null, + "_id": "e6P6WErUdLb7TTHX+RqOsZ", + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_cascadeOpacityEnabled": true, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 509, + "height": 50 + }, + "_rotationX": 0, + "_rotationY": 0, + "_scaleX": 1, + "_scaleY": 1, + "_position": { + "__type__": "cc.Vec2", + "x": 641, + "y": 376 + }, + "_skewX": 0, + "_skewY": 0, + "_localZOrder": 0, + "_globalZOrder": 0, + "_opacityModifyRGB": false, "groupIndex": 0 }, { @@ -668,17 +753,16 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 18 + "__id__": 20 }, "_enabled": true, - "_N$string": "", + "_N$string": "img tag supported by cocos2d-x 3.16+", "_N$horizontalAlign": 0, "_N$fontSize": 40, "_N$font": null, "_N$maxWidth": 0, "_N$lineHeight": 50, - "_N$imageAtlas": { - "__uuid__": "5ad0d74a-bf8c-454a-863d-dd0cc29a4989" - } + "_N$imageAtlas": null, + "_N$handleTouchEvent": true } ] \ No newline at end of file diff --git a/creator_project/assets/scenes/toggle_group/toggle_group.fire b/creator_project/assets/scenes/toggle_group/toggle_group.fire index ee987740..deebfd5a 100644 --- a/creator_project/assets/scenes/toggle_group/toggle_group.fire +++ b/creator_project/assets/scenes/toggle_group/toggle_group.fire @@ -11,6 +11,20 @@ { "__type__": "cc.Scene", "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + }, + { + "__id__": 4 + } + ], + "_tag": -1, + "_active": true, + "_components": [], + "_prefab": null, + "_id": "160469fe-654a-4e3a-a0a3-66c250db8bcd", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -20,7 +34,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": null, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0, @@ -31,25 +44,29 @@ "width": 0, "height": 0 }, - "_children": [ - { - "__id__": 2 - }, - { - "__id__": 4 - } - ], "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "160469fe-654a-4e3a-a0a3-66c250db8bcd", + "groupIndex": 0, "autoReleaseAssets": false }, { "__type__": "cc.Node", "_name": "Canvas", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": null, + "_id": "62f4elGNwNLZpIbNegMhfzI", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -59,9 +76,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -72,7 +86,6 @@ "width": 960, "height": 640 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -86,16 +99,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "62f4elGNwNLZpIbNegMhfzI", - "_active": true, - "_components": [ - { - "__id__": 3 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -118,6 +122,29 @@ "__type__": "cc.Node", "_name": "toggleGroup", "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 5 + }, + { + "__id__": 12 + }, + { + "__id__": 18 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 11 + } + ], + "_prefab": null, + "_id": "2b63453uKtJup/dKKfPpHjS", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -127,9 +154,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 1 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -140,17 +164,6 @@ "width": 221, "height": 61 }, - "_children": [ - { - "__id__": 5 - }, - { - "__id__": 12 - }, - { - "__id__": 18 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -164,22 +177,30 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "2b63453uKtJup/dKKfPpHjS", - "_active": true, - "_components": [ - { - "__id__": 11 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "toggle1", "_objFlags": 0, + "_parent": { + "__id__": 4 + }, + "_children": [ + { + "__id__": 6 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 10 + } + ], + "_prefab": null, + "_id": "9fa5fySt8lJ9Y3cZKkrRrd+", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -189,9 +210,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 4 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -202,11 +220,6 @@ "width": 41, "height": 28 }, - "_children": [ - { - "__id__": 6 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -220,22 +233,30 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "9fa5fySt8lJ9Y3cZKkrRrd+", - "_active": true, - "_components": [ - { - "__id__": 10 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "Background", "_objFlags": 0, + "_parent": { + "__id__": 5 + }, + "_children": [ + { + "__id__": 7 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 9 + } + ], + "_prefab": null, + "_id": "1bc54pWAEVPK7MRrgy16ncx", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -245,9 +266,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 5 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -258,11 +276,6 @@ "width": 28, "height": 30 }, - "_children": [ - { - "__id__": 7 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -276,22 +289,26 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "1bc54pWAEVPK7MRrgy16ncx", - "_active": true, - "_components": [ - { - "__id__": 9 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "checkmark", "_objFlags": 0, + "_parent": { + "__id__": 6 + }, + "_children": [], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 8 + } + ], + "_prefab": null, + "_id": "173eaC82F9EypPiMAwHcHWh", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -301,9 +318,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 6 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -314,7 +328,6 @@ "width": 32, "height": 32 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -328,16 +341,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "173eaC82F9EypPiMAwHcHWh", - "_active": true, - "_components": [ - { - "__id__": 8 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -417,8 +421,6 @@ }, "duration": 0.1, "zoomScale": 1.2, - "pressedSprite": null, - "hoverSprite": null, "clickEvents": [], "_N$interactable": true, "_N$enableAutoGrayEffect": false, @@ -437,6 +439,10 @@ "a": 255 }, "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, "_N$disabledSprite": null, "_N$target": { "__id__": 6 @@ -464,6 +470,23 @@ "__type__": "cc.Node", "_name": "toggle2", "_objFlags": 0, + "_parent": { + "__id__": 4 + }, + "_children": [ + { + "__id__": 13 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 17 + } + ], + "_prefab": null, + "_id": "08261mPFEFCB4eVpKgAV9Sc", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -473,9 +496,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 4 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -486,11 +506,6 @@ "width": 42, "height": 28 }, - "_children": [ - { - "__id__": 13 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -504,22 +519,30 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "08261mPFEFCB4eVpKgAV9Sc", - "_active": true, - "_components": [ - { - "__id__": 17 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "Background", "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [ + { + "__id__": 14 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": null, + "_id": "ad1eeabQw1P6Jtq7ImJPf17", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -529,9 +552,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 12 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -542,11 +562,6 @@ "width": 28, "height": 30 }, - "_children": [ - { - "__id__": 14 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -560,22 +575,26 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "ad1eeabQw1P6Jtq7ImJPf17", - "_active": true, - "_components": [ - { - "__id__": 16 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "checkmark", "_objFlags": 0, + "_parent": { + "__id__": 13 + }, + "_children": [], + "_tag": -1, + "_active": false, + "_components": [ + { + "__id__": 15 + } + ], + "_prefab": null, + "_id": "3f08dDQ2a5CYabx7EqY3g7s", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -585,9 +604,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 13 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -598,7 +614,6 @@ "width": 32, "height": 32 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -612,16 +627,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "3f08dDQ2a5CYabx7EqY3g7s", - "_active": true, - "_components": [ - { - "__id__": 15 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -631,7 +637,7 @@ "node": { "__id__": 14 }, - "_enabled": false, + "_enabled": true, "_spriteFrame": { "__uuid__": "1a32fc76-f0bd-4f66-980f-56929c0ca0b3" }, @@ -701,8 +707,6 @@ }, "duration": 0.1, "zoomScale": 1.2, - "pressedSprite": null, - "hoverSprite": null, "clickEvents": [], "_N$interactable": true, "_N$enableAutoGrayEffect": false, @@ -721,6 +725,10 @@ "a": 255 }, "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, "_N$disabledSprite": null, "_N$target": { "__id__": 13 @@ -738,6 +746,23 @@ "__type__": "cc.Node", "_name": "toggle3", "_objFlags": 0, + "_parent": { + "__id__": 4 + }, + "_children": [ + { + "__id__": 19 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 23 + } + ], + "_prefab": null, + "_id": "f9af8XZLiVHvJqtv5ZOAatn", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -747,9 +772,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 4 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -760,11 +782,6 @@ "width": 37, "height": 28 }, - "_children": [ - { - "__id__": 19 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -778,22 +795,30 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "f9af8XZLiVHvJqtv5ZOAatn", - "_active": true, - "_components": [ - { - "__id__": 23 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "Background", "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [ + { + "__id__": 20 + } + ], + "_tag": -1, + "_active": true, + "_components": [ + { + "__id__": 22 + } + ], + "_prefab": null, + "_id": "d400f+W7tRHvI8/k0ZNbdky", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -803,9 +828,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 18 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -816,11 +838,6 @@ "width": 28, "height": 30 }, - "_children": [ - { - "__id__": 20 - } - ], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -834,22 +851,26 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "d400f+W7tRHvI8/k0ZNbdky", - "_active": true, - "_components": [ - { - "__id__": 22 - } - ], - "_prefab": null, "groupIndex": 0 }, { "__type__": "cc.Node", "_name": "checkmark", "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_tag": -1, + "_active": false, + "_components": [ + { + "__id__": 21 + } + ], + "_prefab": null, + "_id": "1d37d2QOxxKbbG9Yzaxmcas", "_opacity": 255, "_color": { "__type__": "cc.Color", @@ -859,9 +880,6 @@ "a": 255 }, "_cascadeOpacityEnabled": true, - "_parent": { - "__id__": 19 - }, "_anchorPoint": { "__type__": "cc.Vec2", "x": 0.5, @@ -872,7 +890,6 @@ "width": 32, "height": 32 }, - "_children": [], "_rotationX": 0, "_rotationY": 0, "_scaleX": 1, @@ -886,16 +903,7 @@ "_skewY": 0, "_localZOrder": 0, "_globalZOrder": 0, - "_tag": -1, "_opacityModifyRGB": false, - "_id": "1d37d2QOxxKbbG9Yzaxmcas", - "_active": true, - "_components": [ - { - "__id__": 21 - } - ], - "_prefab": null, "groupIndex": 0 }, { @@ -905,7 +913,7 @@ "node": { "__id__": 20 }, - "_enabled": false, + "_enabled": true, "_spriteFrame": { "__uuid__": "1a32fc76-f0bd-4f66-980f-56929c0ca0b3" }, @@ -975,8 +983,6 @@ }, "duration": 0.1, "zoomScale": 1.2, - "pressedSprite": null, - "hoverSprite": null, "clickEvents": [], "_N$interactable": true, "_N$enableAutoGrayEffect": false, @@ -995,6 +1001,10 @@ "a": 255 }, "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, "_N$disabledSprite": null, "_N$target": { "__id__": 19 diff --git a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs index dac43a1e..9df677b8 100644 --- a/creator_project/packages/creator-luacpp-support/CreatorReader.fbs +++ b/creator_project/packages/creator-luacpp-support/CreatorReader.fbs @@ -358,6 +358,7 @@ table Collider table Widget { isAlignOnce:bool; + alignFlags:int; left:float; right:float; top:float; @@ -391,7 +392,8 @@ table DragonBones // //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -enum AnimWrapMode:byte {Default, Normal, Loop, PingPong, Reverse, LoopReverse, PingPongReverse} +// refer to: https://github.com/cocos-creator/engine/blob/master/cocos2d/animation/types.js#L28 +enum AnimWrapMode:byte {Default = 0, Normal = 1, Loop = 2, PingPong = 22, Reverse = 36, LoopReverse = 38, PingPongReverse = 54} //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // Animation Clip diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Node.js b/creator_project/packages/creator-luacpp-support/core/parser/Node.js index 35634de4..01345fa9 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Node.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Node.js @@ -300,6 +300,29 @@ class Node { }); } + //scale + if (props.scale) { + result['scaleX'] = []; + result['scaleY'] = []; + + props.scale.forEach(function(scl) { + let valueX = { + frame: scl.frame, + value: scl.value['x'] + }; + parseCurveProperty(scl, valueX); + result['scaleX'].push(valueX) + + + let valueY = { + frame: scl.frame, + value: scl.value['y'] + }; + parseCurveProperty(scl, valueY); + result['scaleY'].push(valueY) + }); + } + // color if (props.color) { result.color = []; diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Utils.js b/creator_project/packages/creator-luacpp-support/core/parser/Utils.js index 10d464c1..ee98444e 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Utils.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Utils.js @@ -220,7 +220,7 @@ let get_tiledmap_path_by_uuid = function (uuid) { } } -let DEBUG = true; +let DEBUG = false; log = function(s) { if (DEBUG) Utils.log(s); diff --git a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js index ef87b622..7068fd8f 100644 --- a/creator_project/packages/creator-luacpp-support/core/parser/Widget.js +++ b/creator_project/packages/creator-luacpp-support/core/parser/Widget.js @@ -4,12 +4,10 @@ class Widget { static parse(data) { let result = {}; - Utils.log("parse widget init value:" + JSON.stringify(data)); - - // meaningful in cocos2d-x? result.isAlignOnce = data.isAlignOnce; + result.alignFlags = data._alignFlags; - // margin value, pixel or percentage + // margin value, only support pixel, didn't support percentage result.left = data._left; result.right = data._right; result.top = data._top; @@ -18,6 +16,7 @@ class Widget { result.horizontalCenter = data._horizontalCenter; // If true, value is pixel, otherwise is percentage (0 - 1) + // invalid value in cocos2d-x result.isAbsLeft = data._isAbsLeft; result.isAbsRight = data._isAbsRight; result.isAbsTop = data._isAbsTop; diff --git a/creator_project/packages/creator-luacpp-support/package.json b/creator_project/packages/creator-luacpp-support/package.json index a8f3eef6..77c61885 100644 --- a/creator_project/packages/creator-luacpp-support/package.json +++ b/creator_project/packages/creator-luacpp-support/package.json @@ -1,6 +1,6 @@ { "name": "creator-luacpp-support", - "version": "0.3", + "version": "0.4", "description": "Creator Legact Support for cocos2d-x cpp and Lua", "author": "Cocos Creator", "main": "main.js", @@ -19,15 +19,15 @@ "width": 640, "min-width": 320, "height": 480, - "min-height": 330, - "profiles": { - "project": { - "setup": false, - "path": "", - "autoBuild": false, - "exportResourceOnly": false, - "exportResourceDynamicallyLoaded": false - } + "min-height": 330 + }, + "profiles": { + "project": { + "setup": false, + "path": "", + "autoBuild": false, + "exportResourceOnly": false, + "exportResourceDynamicallyLoaded": false } } } diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp index 1f975482..35ddd250 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.cpp @@ -132,18 +132,22 @@ CreatorReader::CreatorReader() _animationManager = new AnimationManager(); _collisionManager = new ColliderManager(); _widgetManager = new WidgetManager(); + _animationManager->autorelease(); _collisionManager->autorelease(); _widgetManager->autorelease(); + CC_SAFE_RETAIN(_animationManager); CC_SAFE_RETAIN(_collisionManager); CC_SAFE_RETAIN(_widgetManager); + } CreatorReader::~CreatorReader() { CC_SAFE_RELEASE_NULL(_collisionManager); CC_SAFE_RELEASE_NULL(_animationManager); + CC_SAFE_RELEASE_NULL(_widgetManager); } CreatorReader* CreatorReader::createWithFilename(const std::string& filename) @@ -302,6 +306,11 @@ ColliderManager* CreatorReader::getColliderManager() const return _collisionManager; } +WidgetManager* CreatorReader::getWidgetManager() const +{ + return _widgetManager; +} + std::string CreatorReader::getVersion() const { return _version; @@ -613,49 +622,61 @@ void CreatorReader::parseColliders(cocos2d::Node* node, const buffers::Node* nod void CreatorReader::parseWidget(cocos2d::Node *node, const buffers::Node *nodeBuffer) const { - const auto& info = nodeBuffer->widget(); - auto widgetNode = dynamic_cast(node); - if ((info != nullptr) && (widgetNode != nullptr)) { - // debug - CCLOG("%s", widgetNode->getName().c_str()); - // the creator scene file didn't include the info about align which side - bool isAlignLeft = fabs(info->left()) > MATH_EPSILON ? true : false; - bool isAlignTop = fabs(info->top()) > MATH_EPSILON ? true : false; - bool isAlignRight = fabs(info->right()) > MATH_EPSILON ? true : false; - bool isAlignBottom = fabs(info->bottom()) > MATH_EPSILON ? true : false; - bool isAlignVerticalCenter = fabs(info->verticalCenter()) > MATH_EPSILON ? true : false; - bool isAlignHorizontalCenter = fabs(info->horizontalCenter()) > MATH_EPSILON ? true : false; - // save the widget component info - const auto& margin = ui::Margin(info->left(),info->top(),info->right(), info->bottom()); - auto parameter = ui::RelativeLayoutParameter::create(); - parameter->setMargin(margin); - // TODO: imp Layout target, how to get the layout target? - // parameter->setRelativeToWidgetName(const std::string &name); - if (isAlignLeft && isAlignTop) { - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT); - } else if (isAlignTop && isAlignRight){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT); - } else if (isAlignRight && isAlignBottom){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM); - } else if (isAlignBottom && isAlignLeft){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM); - } else if (isAlignVerticalCenter && isAlignLeft){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); - } else if (isAlignVerticalCenter && isAlignRight){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL); - } else if (isAlignHorizontalCenter && isAlignTop){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL); - } else if (isAlignHorizontalCenter && isAlignBottom){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL); - } else if (isAlignHorizontalCenter && isAlignVerticalCenter){ - parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); - } - widgetNode->setLayoutParameter(parameter); - auto widgetInfo = WidgetAdapter::create(); - widgetInfo->setAdaptNode(widgetNode); - widgetInfo->setIsAlignOnce(info->isAlignOnce()); - _widgetManager->_needAdaptWidgets.pushBack(widgetInfo); - } + const auto& info = nodeBuffer->widget(); + //auto pNode = dynamic_cast(node); + auto pNode = dynamic_cast(node); + if ((info != nullptr) && (pNode != nullptr)) { + // save the widget margin info + const auto& margin = ui::Margin(info->left(), info->top(), info->right(), info->bottom()); + auto parameter = ui::RelativeLayoutParameter::create(); + parameter->setMargin(margin); + + WidgetAdapter::AlignComb alignComb = static_cast(info->alignFlags()); + switch (alignComb) { + case WidgetAdapter::AlignComb::TOP_LEFT: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT); + break; + case WidgetAdapter::AlignComb::TOP_RIGHT: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT); + break; + case WidgetAdapter::AlignComb::RIGHT_BOTTOM: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM); + break; + case WidgetAdapter::AlignComb::LEFT_BOTTOM: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM); + break; + case WidgetAdapter::AlignComb::LEFT_CENTER_VERTICAL: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL); + break; + case WidgetAdapter::AlignComb::RIGHT_CENTER_VERTICAL: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL); + break; + case WidgetAdapter::AlignComb::TOP_CENTER_HORIZONTAL: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL); + break; + case WidgetAdapter::AlignComb::BOTTOM_CENTER_HORIZONTAL: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL); + break; + case WidgetAdapter::AlignComb::CENTER_IN_PARENT: + parameter->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT); + break; + default: + CCLOG("align combination of UI Node: %s isn't supported", node->getName().c_str()); + CCASSERT(false, "Only 9 creator align combinations are supported by cocos2d-x"); + break; + } + + + + auto widgetInfo = WidgetAdapter::create(); + // TODO: support Layout target, how to get the layout target? + // parameter->setRelativeToWidgetName(const std::string &name); + // widgetInfo->setLayoutTarget(cocos2d::Node *layoutTarget); + widgetInfo->setLayoutParameter(parameter); + widgetInfo->setAdaptNode(pNode); + widgetInfo->setIsAlignOnce(info->isAlignOnce()); + _widgetManager->_needAdaptWidgets.pushBack(widgetInfo); + } } cocos2d::Sprite* CreatorReader::createSprite(const buffers::Sprite* spriteBuffer) const diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h index 04d89920..d14d20e3 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader.h @@ -35,6 +35,7 @@ #include "dragonbones/DragonBonesHeaders.h" #include "dragonbones/cocos2dx/CCDragonBonesHeaders.h" #include "ui/WidgetExport.h" +//#include "ui/NodeExport.h" @@ -52,7 +53,7 @@ class CreatorReader: public cocos2d::Ref cocos2d::Scene* getSceneGraph() const; /** - Return the CollisionManager. It is added as a child of the Scene to simplify the codes. + Return the AnimationManager. It is added as a child of the Scene to simplify the codes. @return The `AnimationManager` of the scene */ AnimationManager* getAnimationManager() const; @@ -63,6 +64,12 @@ class CreatorReader: public cocos2d::Ref */ ColliderManager* getColliderManager() const; + /** + Return the WidgetManager. It is added as a child of the Scene to make Creator Widget component take effect. + @return The `WidgetManager` of the scene + */ + WidgetManager* getWidgetManager() const; + /** Returns the FlatBuffers Schema version. @return a string containing the flatbuffer's schema version @@ -168,6 +175,8 @@ class CreatorReader: public cocos2d::Ref // Widget in creator is a component used to do Layout WidgetManager *_widgetManager; + +// NodeLayoutManager *_nodeLayoutManager; // creator will make scene at the center of screen when apply design solution strategy, cocos2d-x doesn't do it like this // this value record the diff diff --git a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h index b0490f5a..3a14f668 100644 --- a/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h +++ b/creator_project/packages/creator-luacpp-support/reader/CreatorReader_generated.h @@ -448,21 +448,14 @@ enum AnimWrapMode { AnimWrapMode_Default = 0, AnimWrapMode_Normal = 1, AnimWrapMode_Loop = 2, - AnimWrapMode_PingPong = 3, - AnimWrapMode_Reverse = 4, - AnimWrapMode_LoopReverse = 5, - AnimWrapMode_PingPongReverse = 6, + AnimWrapMode_PingPong = 22, + AnimWrapMode_Reverse = 36, + AnimWrapMode_LoopReverse = 38, + AnimWrapMode_PingPongReverse = 54, AnimWrapMode_MIN = AnimWrapMode_Default, AnimWrapMode_MAX = AnimWrapMode_PingPongReverse }; -inline const char **EnumNamesAnimWrapMode() { - static const char *names[] = { "Default", "Normal", "Loop", "PingPong", "Reverse", "LoopReverse", "PingPongReverse", nullptr }; - return names; -} - -inline const char *EnumNameAnimWrapMode(AnimWrapMode e) { return EnumNamesAnimWrapMode()[static_cast(e)]; } - MANUALLY_ALIGNED_STRUCT(4) Vec2 FLATBUFFERS_FINAL_CLASS { private: float x_; @@ -2775,20 +2768,22 @@ inline flatbuffers::Offset CreateColliderDirect(flatbuffers::FlatBuffe struct Widget FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { enum { VT_ISALIGNONCE = 4, - VT_LEFT = 6, - VT_RIGHT = 8, - VT_TOP = 10, - VT_BOTTOM = 12, - VT_VERTICALCENTER = 14, - VT_HORIZONTALCENTER = 16, - VT_ISABSLEFT = 18, - VT_ISABSRIGHT = 20, - VT_ISABSTOP = 22, - VT_ISABSBOTTOM = 24, - VT_ISABSHORIZONTALCENTER = 26, - VT_ISABSVERTICALCENTER = 28 + VT_ALIGNFLAGS = 6, + VT_LEFT = 8, + VT_RIGHT = 10, + VT_TOP = 12, + VT_BOTTOM = 14, + VT_VERTICALCENTER = 16, + VT_HORIZONTALCENTER = 18, + VT_ISABSLEFT = 20, + VT_ISABSRIGHT = 22, + VT_ISABSTOP = 24, + VT_ISABSBOTTOM = 26, + VT_ISABSHORIZONTALCENTER = 28, + VT_ISABSVERTICALCENTER = 30 }; bool isAlignOnce() const { return GetField(VT_ISALIGNONCE, 0) != 0; } + int32_t alignFlags() const { return GetField(VT_ALIGNFLAGS, 0); } float left() const { return GetField(VT_LEFT, 0.0f); } float right() const { return GetField(VT_RIGHT, 0.0f); } float top() const { return GetField(VT_TOP, 0.0f); } @@ -2804,6 +2799,7 @@ struct Widget FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_ISALIGNONCE) && + VerifyField(verifier, VT_ALIGNFLAGS) && VerifyField(verifier, VT_LEFT) && VerifyField(verifier, VT_RIGHT) && VerifyField(verifier, VT_TOP) && @@ -2824,6 +2820,7 @@ struct WidgetBuilder { flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_isAlignOnce(bool isAlignOnce) { fbb_.AddElement(Widget::VT_ISALIGNONCE, static_cast(isAlignOnce), 0); } + void add_alignFlags(int32_t alignFlags) { fbb_.AddElement(Widget::VT_ALIGNFLAGS, alignFlags, 0); } void add_left(float left) { fbb_.AddElement(Widget::VT_LEFT, left, 0.0f); } void add_right(float right) { fbb_.AddElement(Widget::VT_RIGHT, right, 0.0f); } void add_top(float top) { fbb_.AddElement(Widget::VT_TOP, top, 0.0f); } @@ -2839,13 +2836,14 @@ struct WidgetBuilder { WidgetBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } WidgetBuilder &operator=(const WidgetBuilder &); flatbuffers::Offset Finish() { - auto o = flatbuffers::Offset(fbb_.EndTable(start_, 13)); + auto o = flatbuffers::Offset(fbb_.EndTable(start_, 14)); return o; } }; inline flatbuffers::Offset CreateWidget(flatbuffers::FlatBufferBuilder &_fbb, bool isAlignOnce = false, + int32_t alignFlags = 0, float left = 0.0f, float right = 0.0f, float top = 0.0f, @@ -2865,6 +2863,7 @@ inline flatbuffers::Offset CreateWidget(flatbuffers::FlatBufferBuilder & builder_.add_top(top); builder_.add_right(right); builder_.add_left(left); + builder_.add_alignFlags(alignFlags); builder_.add_isAbsVerticalCenter(isAbsVerticalCenter); builder_.add_isAbsHorizontalCenter(isAbsHorizontalCenter); builder_.add_isAbsBottom(isAbsBottom); diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp index 6ec2313a..dbc4cf3c 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.cpp @@ -32,9 +32,9 @@ #include namespace { - + creator::AnimationClip* g_clip = nullptr; - + // -1: invalid index // -2: haven't reached first frame, so it should be the same as first frame template @@ -42,30 +42,30 @@ namespace { { if (properties.empty()) return -1; - + if (properties.front().frame > elapsed) return -2; if (properties.back().frame <= elapsed) return properties.size() - 1; - + for (int i = 0, len = properties.size(); i < len; ++i) { const auto& prop = properties[i]; if (prop.frame > elapsed) return i - 1; } - + return -1; } - + template float getPercent(const P& p1, const P& p2, float elapsed) { const auto& curveType = p1.curveType; const auto& curveData = p1.curveData; auto ratio = (elapsed - p1.frame) / (p2.frame - p1.frame); - + if (!curveType.empty()) { const auto& easingFunc = creator::Easing::getFunction(curveType); @@ -73,71 +73,71 @@ namespace { } if (curveData.size() > 0) ratio = creator::Bazier::computeBezier(curveData, ratio); - + return ratio; } - + void assignValue(float src, float& dst) { dst = src; } - + void assignValue(const cocos2d::Color3B& src, cocos2d::Color3B& dst) { dst.r = src.r; dst.g = src.g; dst.b = src.b; } - + void assignValue(const cocos2d::Vec2& src, cocos2d::Vec2& dst) { dst.x = src.x; dst.y = src.y; } - + template void computeNextValue(T start, T end, float percent, T &out) { out = start + percent * (end - start); } - + void computeNextValue(const cocos2d::Color3B& start, const cocos2d::Color3B& end, float percent, cocos2d::Color3B& out) { computeNextValue(start.r, end.r, percent, out.r); computeNextValue(start.g, end.g, percent, out.g); computeNextValue(start.b, end.b, percent, out.b); } - + void computeNextValue(const cocos2d::Vec2& start, const cocos2d::Vec2& end, float percent, cocos2d::Vec2& out) { computeNextValue(start.x, end.x, percent, out.x); computeNextValue(start.y, end.y, percent, out.y); } - + template bool getNextValue(const P & properties, float elapsed, T &out) { int index = getValidIndex(properties, elapsed); if (index == -1) return false; - + if (index == -2) { assignValue(properties.front().value, out); return true; } - + if (index == properties.size() -1) { assignValue(properties.back().value, out); return true; } - + const auto& prop = properties[index]; const auto& nextProp = properties[index+1]; float percent = getPercent(prop, nextProp, elapsed); computeNextValue(prop.value, nextProp.value, percent, out); - + return true; } } @@ -212,7 +212,7 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip _clip = clip; _rootTarget = rootTarget; CC_SAFE_RETAIN(_rootTarget); - + if (_clip) { _clip->retain(); @@ -234,13 +234,14 @@ bool AnimateClip::initWithAnimationClip(cocos2d::Node* rootTarget, AnimationClip void AnimateClip::update(float dt) { _elapsed += dt; - + if (_needStop && _elapsed >= _durationToStop) { stopAnimate(); + return; } - + const auto& allAnimProperties = _clip->getAnimProperties(); for (const auto& animProperties : allAnimProperties) doUpdate(animProperties); @@ -252,7 +253,7 @@ void AnimateClip::doUpdate(const AnimProperties& animProperties) const if (target) { auto elapsed = computeElapse(); - + // update position cocos2d::Vec2 nextPos; if (getNextValue(animProperties.animPosition, elapsed, nextPos)) @@ -299,7 +300,7 @@ void AnimateClip::doUpdate(const AnimProperties& animProperties) const // positoin x if (getNextValue(animProperties.animPositionX, elapsed, nextValue)) target->setPositionX(nextValue); - + // position y if (getNextValue(animProperties.animPositionY, elapsed, nextValue)) target->setPositionY(nextValue); @@ -310,7 +311,7 @@ cocos2d::Node* AnimateClip::getTarget(const std::string &path) const { if (path.empty()) return _rootTarget; - + cocos2d::Node *ret = nullptr; _rootTarget->enumerateChildren(path, [&ret](cocos2d::Node* result) -> bool { ret = result; @@ -332,9 +333,10 @@ float AnimateClip::computeElapse() const if (wrapMode == AnimationClip::WrapMode::Reverse // reverse mode || (wrapMode == AnimationClip::WrapMode::PingPong && !oddRound) // pingpong mode and it is the second round || (wrapMode == AnimationClip::WrapMode::PingPongReverse && oddRound) // pingpongreverse mode and it is the first round - || (wrapMode == AnimationClip::WrapMode::LoopReverse && oddRound) + || (wrapMode == AnimationClip::WrapMode::LoopReverse) // loop reverse mode, reverse again and again ) elapsed = duration - elapsed; - + return elapsed; } + diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h index e0fe2d83..da974f1b 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimateClip.h @@ -60,7 +60,8 @@ class AnimateClip : public cocos2d::Node { float computeElapse() const; AnimationClip* _clip; - + + // the time elapsed since the animation start float _elapsed; cocos2d::Node *_rootTarget; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h index 89754dfc..ee12c3f2 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationClip.h @@ -33,7 +33,9 @@ NS_CCR_BEGIN class AnimationClip: public cocos2d::Ref { public: - enum class WrapMode {Default, Normal, Loop, PingPong, Reverse, LoopReverse, PingPongReverse}; + + // refer to: https://github.com/cocos-creator/engine/blob/master/cocos2d/animation/types.js#L28 + enum class WrapMode {Default = 0, Normal = 1, Loop = 2, PingPong = 22, Reverse = 36, LoopReverse = 38, PingPongReverse = 54}; static AnimationClip* create(); virtual ~AnimationClip(); diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp index ccac1f8f..cb53d326 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.cpp @@ -27,7 +27,7 @@ void AnimationManager::playOnLoad() } } -void AnimationManager::stopPlayOnLoad() +void AnimationManager::stopAnimationClipsRunByPlayOnLoad() { for (auto& animationInfo : _animations) { diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h index fe741089..5fa3aa57 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h +++ b/creator_project/packages/creator-luacpp-support/reader/animation/AnimationManager.h @@ -51,7 +51,7 @@ class AnimationManager : public cocos2d::Node void pauseAnimationClip(cocos2d::Node *target, const std::string &animationClipName); void resumeAnimationClip(cocos2d::Node *target, const std::string &animationClipName); // if a "Play On Load" animation is a loop animation, please stop it manually. - void stopPlayOnLoad(); + void stopAnimationClipsRunByPlayOnLoad(); private: friend class CreatorReader; diff --git a/creator_project/packages/creator-luacpp-support/reader/animation/Easing.cpp b/creator_project/packages/creator-luacpp-support/reader/animation/Easing.cpp index b4b635ae..f5d0b528 100644 --- a/creator_project/packages/creator-luacpp-support/reader/animation/Easing.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/animation/Easing.cpp @@ -70,7 +70,7 @@ namespace Easing // Easing equation function for a cubic (t^3) float cubicIn(float k) { - return k * k * 3; + return k * k * k; } float cubicOut(float k) { diff --git a/creator_project/packages/creator-luacpp-support/reader/collider/ColliderManager.cpp b/creator_project/packages/creator-luacpp-support/reader/collider/ColliderManager.cpp index 2f587869..edb7ca03 100644 --- a/creator_project/packages/creator-luacpp-support/reader/collider/ColliderManager.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/collider/ColliderManager.cpp @@ -150,7 +150,7 @@ void ColliderManager::removeCollider(creator::Collider *collider) _colliders.erase(found); // don't emit exit event as creator since the collider is not running scene - for (auto iter = _contracts.begin(), end = _contracts.end(); iter != end;) + for (auto iter = _contracts.begin() ; iter != _contracts.end();) { if ((*iter)->getCollider1() == collider || (*iter)->getCollider2() == collider) iter = _contracts.erase(iter); diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp index f8c2c14c..3c14e1f9 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.cpp @@ -38,10 +38,10 @@ WidgetAdapter* WidgetAdapter::create() bool WidgetAdapter::init() { - _layoutNode = cocos2d::ui::Layout::create(); - _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE); + //_layoutNode = cocos2d::ui::Layout::create(); + // _layoutNode->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE); - CC_SAFE_RETAIN(_layoutNode); + //CC_SAFE_RETAIN(_layoutNode); return true; } @@ -55,7 +55,8 @@ WidgetAdapter::WidgetAdapter() WidgetAdapter::~WidgetAdapter() { - CC_SAFE_RELEASE(_layoutNode); + // CC_SAFE_RELEASE(_layoutNode); + CC_SAFE_RELEASE(_parameter); } void WidgetAdapter::setIsAlignOnce(bool isAlignOnce) @@ -72,49 +73,130 @@ void WidgetAdapter::setLayoutTarget(cocos2d::Node* layoutTarget) _layoutTarget = layoutTarget; } -void WidgetAdapter::configLayoutNode() +void WidgetAdapter::setLayoutParameter(cocos2d::ui::RelativeLayoutParameter *parameter) { - if (_layoutTarget == nullptr) { - _layoutTarget = _needAdaptNode->getParent(); - } - CCASSERT(_layoutTarget != nullptr, "layout target can't be null"); - - _layoutNode->setContentSize(_layoutTarget->getContentSize()); - _layoutNode->setAnchorPoint(_layoutTarget->getAnchorPoint()); - _layoutNode->setPosition(_layoutTarget->getPosition()); - _layoutNode->setName(PLUGIN_EXTRA_LAYOUT_NAME); + CC_SAFE_RETAIN(parameter); + _parameter = parameter; +} - insertLayoutNode(); +void WidgetAdapter::syncLayoutProperty() +{ + auto sDesignSize = cocos2d::Director::getInstance()->getOpenGLView()->getDesignResolutionSize(); + auto adaptSize = _needAdaptNode->getContentSize(); + auto anchorPoint = _needAdaptNode->getAnchorPoint(); + auto targetSize = _layoutTarget->getContentSize(); + + + if (_needAdaptNode->getName().compare("root") == 0){ + _needAdaptNode->setContentSize(sDesignSize); + return; + } + + float x = 0.0f, y = 0.0f; + + const auto& margin = _parameter->getMargin(); + auto alignComb = _parameter->getAlign(); + + switch (alignComb) { + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_LEFT: + x = margin.left + adaptSize.width*anchorPoint.x; + y = targetSize.height - (margin.top + adaptSize.height*(1.0 - anchorPoint.y)); + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_RIGHT: + x = targetSize.width - (margin.right + adaptSize.width*(1.0 - anchorPoint.x)); + y = targetSize.height - (margin.top + adaptSize.height*(1.0 - anchorPoint.y)); + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_BOTTOM: + x = targetSize.width - (margin.right + adaptSize.width*(1.0 - anchorPoint.x)); + y = margin.bottom + adaptSize.height*anchorPoint.y; + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_BOTTOM: + x = margin.left + adaptSize.width*anchorPoint.x; + y = margin.bottom + adaptSize.height*anchorPoint.y; + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL: + x = margin.left + adaptSize.width*anchorPoint.x; + y = targetSize.height*0.5 + ((anchorPoint.y - 0.5)*adaptSize.height); + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL: + x = targetSize.width - (margin.right + adaptSize.width*(1.0 - anchorPoint.x)); + y = targetSize.height*0.5 + ((anchorPoint.y - 0.5)*adaptSize.height); + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_TOP_CENTER_HORIZONTAL: + + x = targetSize.width*0.5 + ((anchorPoint.x - 0.5)*adaptSize.width); + y = targetSize.height - (margin.top + adaptSize.height*(1.0 - anchorPoint.y)); + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_BOTTOM_CENTER_HORIZONTAL: + x = targetSize.width*0.5 + ((anchorPoint.x - 0.5)*adaptSize.width); + y = margin.bottom + adaptSize.height*anchorPoint.y; + break; + case cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT: + x = targetSize.width*0.5 + ((anchorPoint.x - 0.5)*adaptSize.width); + y = targetSize.height*0.5+ ((anchorPoint.y - 0.5)*adaptSize.height); + break; + default: + + break; + } + + _needAdaptNode->setPosition(x, y); } -void WidgetAdapter::insertLayoutNode() +void WidgetAdapter::setupLayout() { auto parent = _needAdaptNode->getParent(); CCASSERT(parent != nullptr, "adaptNode's parent can't be null"); - _needAdaptNode->removeFromParentAndCleanup(false); - _layoutNode->addChild(_needAdaptNode); - parent->addChild(_layoutNode); + // set default layout target to parent node + if (_layoutTarget == nullptr) { + _layoutTarget = parent; + } + // _needAdaptNode->removeFromParentAndCleanup(false); + // _layoutNode->setName(PLUGIN_EXTRA_LAYOUT_NAME); + // _layoutNode->addChild(_needAdaptNode); + // parent->addChild(_layoutNode); +} + +WidgetManager::WidgetManager() +: _forceAlignDirty(false) +{ - _layoutNode->forceDoLayout(); +} + +WidgetManager::~WidgetManager() +{ + } void WidgetManager::update(float dt) +{ + doAlign(); +} + +void WidgetManager::forceDoAlign() +{ + _forceAlignDirty = true; + doAlign(); +} + +void WidgetManager::doAlign() { for (auto& adapter:_needAdaptWidgets) { - auto layout = dynamic_cast(adapter->_needAdaptNode->getParent()); - if(!(adapter->_isAlignOnce) && layout != nullptr) + if(_forceAlignDirty || !(adapter->_isAlignOnce)) { - layout->setContentSize(adapter->_layoutTarget->getContentSize()); + adapter->syncLayoutProperty(); } } + _forceAlignDirty = false; } void WidgetManager::setupWidgets() { for (auto& adapter:_needAdaptWidgets) { - adapter->configLayoutNode(); + adapter->setupLayout(); + adapter->syncLayoutProperty(); } -// scheduleUpdate(); + scheduleUpdate(); } NS_CCR_END diff --git a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h index 2394a3fd..c4ac5050 100644 --- a/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h +++ b/creator_project/packages/creator-luacpp-support/reader/ui/WidgetExport.h @@ -31,12 +31,37 @@ NS_CCR_BEGIN +// name of extra layout Node #define PLUGIN_EXTRA_LAYOUT_NAME "Creator Widget to Cocos2d-x Layout" +// creator align flag, see: https://github.com/cocos-creator/engine/blob/master/cocos2d/core/base-ui/CCWidgetManager.js +#define CREATOR_ALIGN_TOP (1 << 0) +#define CREATOR_ALIGN_MID (1 << 1) +#define CREATOR_ALIGN_BOT (1 << 2) +#define CREATOR_ALIGN_LEFT (1 << 3) +#define CREATOR_ALIGN_CENTER (1 << 4) +#define CREATOR_ALIGN_RIGHT (1 << 5) + +// support export the creator widget component to cocos2d-x layout class WidgetAdapter : public cocos2d::Ref { public: + // only 9 creator align combinations are supported by cocos2d-x + enum class AlignComb + { + TOP_LEFT = CREATOR_ALIGN_LEFT | CREATOR_ALIGN_TOP, + TOP_CENTER_HORIZONTAL = CREATOR_ALIGN_CENTER | CREATOR_ALIGN_TOP, + TOP_RIGHT = CREATOR_ALIGN_TOP | CREATOR_ALIGN_RIGHT, + LEFT_CENTER_VERTICAL = CREATOR_ALIGN_MID | CREATOR_ALIGN_LEFT, + + CENTER_IN_PARENT = CREATOR_ALIGN_CENTER | CREATOR_ALIGN_MID, + + RIGHT_CENTER_VERTICAL = CREATOR_ALIGN_MID | CREATOR_ALIGN_RIGHT, + LEFT_BOTTOM = CREATOR_ALIGN_BOT | CREATOR_ALIGN_LEFT, + BOTTOM_CENTER_HORIZONTAL = CREATOR_ALIGN_CENTER | CREATOR_ALIGN_BOT, + RIGHT_BOTTOM = CREATOR_ALIGN_RIGHT | CREATOR_ALIGN_BOT + }; static WidgetAdapter* create(); WidgetAdapter(); @@ -45,32 +70,47 @@ class WidgetAdapter : public cocos2d::Ref bool init(); void setIsAlignOnce(bool isAlignOnce); void setAdaptNode(cocos2d::Node* needAdaptNode); - // set after known AdaptNode's parent + + + void setLayoutParameter(cocos2d::ui::RelativeLayoutParameter *parameter); + + // TODO: support the align target of a widget component, default target is parent Node void setLayoutTarget(cocos2d::Node* layoutTarget); - // adapt layout depend and _layoutTarget - void configLayoutNode(); private: friend class WidgetManager; - // only do layout once if true + // only do layout align once if true bool _isAlignOnce; - // widget layout target, it's a Node + // widget layout target, it's a Node, default target is _needAdaptNode's parent cocos2d::Node* _layoutTarget; - // _layoutTarget must existed, the default target is _needAdaptNode's parent + // the node include a widget component, it must be a UI Widget? cocos2d::Node* _needAdaptNode; // insert the _layout between _nodeNeedWidget and its parent - cocos2d::ui::Layout* _layoutNode; - // insert Layout to support widget component. - void insertLayoutNode(); + // cocos2d::ui::Layout* _layoutNode; + + cocos2d::ui::RelativeLayoutParameter *_parameter; + + // insert Layout Node to support widget component. + void setupLayout(); + // adapt layout property depend on _layoutTarget + void syncLayoutProperty(); }; +// manager all the widget component align class WidgetManager : public cocos2d::Node { public: - void update(float dt); + // check widget component property AlignOnce every frame, update align if this property set to false + virtual void update(float dt) override; + // do layout align manually, you should call it when you make layout content size different from scene in Creator. + void forceDoAlign(); private: friend class CreatorReader; + WidgetManager(); + virtual ~WidgetManager(); void setupWidgets(); + void doAlign(); + bool _forceAlignDirty; cocos2d::Vector _needAdaptWidgets; }; NS_CCR_END diff --git a/creator_project/settings/creator-luacpp-support.json b/creator_project/settings/creator-luacpp-support.json index 30fdd6fc..711db103 100644 --- a/creator_project/settings/creator-luacpp-support.json +++ b/creator_project/settings/creator-luacpp-support.json @@ -1,6 +1,7 @@ { "autoBuild": false, + "exportResourceDynamicallyLoaded": false, "exportResourceOnly": false, - "path": "/Users/minggo/SourceCode/cocos2d-x/tests/lua-empty-test", + "path": "", "setup": false } \ No newline at end of file diff --git a/creator_project/settings/project.json b/creator_project/settings/project.json index 65f255bc..1969cec3 100644 --- a/creator_project/settings/project.json +++ b/creator_project/settings/project.json @@ -25,5 +25,10 @@ }, "start-scene": "current", "use-customize-simulator": false, - "use-project-simulator-setting": false + "use-project-simulator-setting": false, + "cocos-analytics": { + "enable": false, + "appID": "13798", + "appSecret": "959b3ac0037d0f3c2fdce94f8421a9b2" + } } \ No newline at end of file