123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- #include "plisthpp/redream.h"
- #include <QFile>
- #include <QDebug>
- #include <QDir>
- #include "plisthpp/Plist.hpp"
- #include <array>
- //#include "projectcfg.h"
- //#include "Bll/roominfo.h"
- //#include "Bll/roominfomgr.h"
- static Redream *s_redream = nullptr;
- Redream* Redream::getInstance()
- {
- if (s_redream == nullptr)
- {
- s_redream = new (std::nothrow) Redream;
- }
- return s_redream;
- }
- // 创建房间时创建一个red模版
- bool Redream::createRedream(QString filePath)
- {
- PlistDict dict;
- QString templateFilename(":/template.red");
- if (!QFile::exists(templateFilename)) {
- qDebug() << "无法找到ccb模版文件";
- return false;
- }
- QString generatedTemplate = filePath;
- if (!QFile::copy(templateFilename, generatedTemplate)) {
- qDebug() << "未正确生成ccb文件";
- return false;
- }
- return true;
- }
- // 创建物件时导入red文件
- void Redream::addObjectToRedream(std::string filePath, std::vector<std::string> object)
- {
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- QDir().remove(QString(filePath.c_str()));
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- for (int i = 0; i < object.size(); i++) {
- PlistDict furnitureDict = _addChildren(object.at(i));
- ret.push_back(furnitureDict);
- }
- dictNodeGraph["children"] = ret;
- dict["nodeGraph"] = dictNodeGraph;
- Plist::writePlistXML(filePath.c_str(), dict);
- }
- // 创建家具时导入red文件
- void Redream::addFurnitureToRedream(std::string filePath, std::string furnitureId)
- {
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- QDir().remove(QString(filePath.c_str()));
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- PlistDict furnitureDict = _addChildren(furnitureId);
- ret.push_back(furnitureDict);
- dictNodeGraph["children"] = ret;
- dict["nodeGraph"] = dictNodeGraph;
- Plist::writePlistXML(filePath.c_str(), dict);
- }
- // 从red文件中删除一个物件
- void Redream::deleteObjectFromRedream(std::string filePath, std::vector<std::string> object)
- {
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- QDir().remove(QString(filePath.c_str()));
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- for (auto it = ret.begin(); it != ret.end(); it++) {
- for (std::string furnitureId : object) {
- PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
- ret.erase(it);
- }
- }
- }
- dictNodeGraph["children"] = ret;
- dict["nodeGraph"] = dictNodeGraph;
- Plist::writePlistXML(filePath.c_str(), dict);
- }
- //从red文件中获取时间线列表
- QList<QString> Redream::getTimelineFromRedream(std::string filePath)
- {
- PlistDict dict;
- QList<QString> timelineList;
- Plist::readPlist(filePath.c_str(), dict);
- PlistArray dictSeq = boost::any_cast<PlistArray&>(dict["sequences"]);
- for(auto it = dictSeq.begin();it != dictSeq.end();it++){
- PlistDict seqDict = boost::any_cast<PlistDict&>(*it);
- std::string timeline = boost::any_cast<std::string&>(seqDict["name"]);
- timelineList.push_back(QString::fromStdString(timeline));
- }
- return timelineList;
- }
- // 从red文件中删除一个家具
- void Redream::deleteFurnitureFromRedream(std::string filePath, std::string furnitureId)
- {
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- QDir().remove(QString(filePath.c_str()));
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- for (auto it = ret.begin(); it != ret.end(); it++) {
- PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
- ret.erase(it);
- break;
- }
- }
- dictNodeGraph["children"] = ret;
- dict["nodeGraph"] = dictNodeGraph;
- Plist::writePlistXML(filePath.c_str(), dict);
- }
- std::array<qreal, 2> Redream::getFurniturePos(std::string filePath, std::string furnitureId)
- {
- std::array<qreal, 2> pos = {0.0, 0.0};
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- for (auto it = ret.begin(); it != ret.end(); it++) {
- PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
- PlistArray properties = boost::any_cast<PlistArray&>(furnitureDict["properties"]);
- for (auto it_pro = properties.begin(); it_pro != properties.end(); it_pro++) {
- PlistDict dict = boost::any_cast<PlistDict&>(*it_pro);
- if (boost::any_cast<std::string&>(dict["name"]) == "position") {
- PlistArray posArr = boost::any_cast<PlistArray&>(dict["value"]);
- qreal x = boost::any_cast<qreal>(posArr.at(0));
- qreal y = boost::any_cast<qreal>(posArr.at(1));
- pos = {x, y};
- break;
- }
- }
- }
- }
- return pos;
- }
- PlistDict Redream::_addChildren(std::string furnitureId)
- {
- PlistDict furnitureDict;
- furnitureDict["animatedProperties"] = PlistDict();
- furnitureDict["baseClass"] = std::string("CCSprite");
- furnitureDict["children"] = PlistArray();
- furnitureDict["customClass"] = std::string("");
- furnitureDict["customProperties"] = PlistArray();
- furnitureDict["displayName"] = furnitureId;
- furnitureDict["expand"] = false;
- furnitureDict["hidden"] = false;
- furnitureDict["locked"] = false;
- furnitureDict["memberVarAssignmentName"] = std::string("");
- furnitureDict["memberVarAssignmentType"] = 0;
- furnitureDict["properties"] = _addProperties(furnitureId);
- furnitureDict["seqExpanded"] = false;
- return furnitureDict;
- }
- PlistArray Redream::_addProperties(std::string furnitureId)
- {
- PlistArray properties;
- PlistDict position;
- position["name"] = std::string("position");
- position["type"] = std::string("Position");
- position["value"] = PlistArray({0.0f, 0.0f, 0, 0, 0});
- properties.push_back(position);
- PlistDict anchorPoint;
- anchorPoint["name"] = std::string("anchorPoint");
- anchorPoint["type"] = std::string("Point");
- anchorPoint["value"] = PlistArray({0.5f, 0.5f});
- properties.push_back(anchorPoint);
- PlistDict tag;
- tag["name"] = std::string("tag");
- tag["type"] = std::string("Integer");
- tag["value"] = 0;
- properties.push_back(tag);
- PlistDict ignoreAnchor;
- ignoreAnchor["name"] = std::string("ignoreAnchorPointForPosition");
- ignoreAnchor["type"] = std::string("Check");
- ignoreAnchor["value"] = false;
- properties.push_back(ignoreAnchor);
- PlistDict opacity;
- opacity["name"] = std::string("opacity");
- opacity["type"] = std::string("Byte");
- opacity["value"] = 255;
- properties.push_back(opacity);
- PlistDict color;
- color["name"] = std::string("color");
- color["type"] = std::string("Color3");
- color["value"] = PlistArray({255, 255, 255});
- properties.push_back(color);
- PlistDict displayFrame;
- displayFrame["name"] = std::string("displayFrame");
- displayFrame["type"] = std::string("SpriteFrame");
- displayFrame["value"] = PlistArray({std::string(""), "full_preview_" + furnitureId + ".png"});
- properties.push_back(displayFrame);
- return properties;
- }
- void Redream::checkFurnitureIsLost(std::string filePath, std::string furnitureId)
- {
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- QDir().remove(QString(filePath.c_str()));
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- for (auto it = ret.begin(); it != ret.end(); it++) {
- PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
- qDebug() << "find node in redream";
- return;
- }
- }
- PlistDict furnitureDict = _addChildren(furnitureId);
- ret.push_back(furnitureDict);
- dictNodeGraph["children"] = ret;
- dict["nodeGraph"] = dictNodeGraph;
- Plist::writePlistXML(filePath.c_str(), dict);
- }
- //void Redream::syncAllFurnitureRedreamNodes(QString roomId)
- //{
- // RoomInfo* room = RoomInfoMgr::getInstance()->getRoomInfoById(roomId);
- // QString path = ProjectCfg::getInstance()->getCCBDirPath() + "/" + room->getRoomId() + "/ccb/" + room->getRoomId() + ".red";
- // PlistDict dict;
- // Plist::readPlist(path.toStdString().c_str(), dict);
- //// QDir().remove(QString(path.toStdString().c_str()));
- // PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- // PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- // for(int i = 0; i < room->getObjectInfoList().size(); i++)
- // {
- // ObjectInfo* object = room->getObjectInfoList().at(i);
- // if (object->getObjectStatus() == OBJECT_STATUS_DELETED)
- // continue;
- // foreach (FurnitureInfo* info, object->getFurnitureInfoList()) {
- // bool found = false;
- // for (auto it = ret.begin(); it != ret.end(); it++) {
- // PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- // if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == info->getFurnitureId().toStdString()) {
- // found = true;
- // break;
- // }
- // }
- // if (!found)
- // {
- // PlistDict furnitureDict = _addChildren(info->getFurnitureId().toStdString());
- // ret.push_back(furnitureDict);
- // }
- // foreach (FurnitureInfo* adInfo, info->getAdjunctFurnitureList()) {
- // bool found = false;
- // for (auto it = ret.begin(); it != ret.end(); it++) {
- // PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- // if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == adInfo->getFurnitureId().toStdString()) {
- // found = true;
- // break;
- // }
- // }
- // if (!found)
- // {
- // PlistDict adfurnitureDict = _addChildren(adInfo->getFurnitureId().toStdString());
- // ret.push_back(adfurnitureDict);
- // }
- // }
- // }
- // }
- // dictNodeGraph["children"] = ret;
- // dict["nodeGraph"] = dictNodeGraph;
- // Plist::writePlistXML(path.toStdString().c_str(), dict);
- //}
- int Redream::getFurnitureLocalZOrder(std::string filePath, std::string furnitureId)
- {
- PlistDict dict;
- Plist::readPlist(filePath.c_str(), dict);
- PlistDict dictNodeGraph = boost::any_cast<PlistDict&>(dict["nodeGraph"]);
- PlistArray ret = boost::any_cast<PlistArray&>(dictNodeGraph["children"]);
- for (auto it = ret.begin(); it != ret.end(); it++) {
- PlistDict furnitureDict = boost::any_cast<PlistDict&>(*it);
- if (boost::any_cast<std::string&>(furnitureDict["displayName"]) == furnitureId) {
- int index = it - ret.begin();
- return index;
- }
- }
- }
|