#include "plisthpp/redream.h" #include #include #include #include "plisthpp/Plist.hpp" #include //#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 object) { PlistDict dict; Plist::readPlist(filePath.c_str(), dict); QDir().remove(QString(filePath.c_str())); PlistDict dictNodeGraph = boost::any_cast(dict["nodeGraph"]); PlistArray ret = boost::any_cast(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(dict["nodeGraph"]); PlistArray ret = boost::any_cast(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 object) { PlistDict dict; Plist::readPlist(filePath.c_str(), dict); QDir().remove(QString(filePath.c_str())); PlistDict dictNodeGraph = boost::any_cast(dict["nodeGraph"]); PlistArray ret = boost::any_cast(dictNodeGraph["children"]); for (auto it = ret.begin(); it != ret.end(); it++) { for (std::string furnitureId : object) { PlistDict furnitureDict = boost::any_cast(*it); if (boost::any_cast(furnitureDict["displayName"]) == furnitureId) { ret.erase(it); } } } dictNodeGraph["children"] = ret; dict["nodeGraph"] = dictNodeGraph; Plist::writePlistXML(filePath.c_str(), dict); } //从red文件中获取时间线列表 QList Redream::getTimelineFromRedream(std::string filePath) { PlistDict dict; QList timelineList; Plist::readPlist(filePath.c_str(), dict); PlistArray dictSeq = boost::any_cast(dict["sequences"]); for(auto it = dictSeq.begin();it != dictSeq.end();it++){ PlistDict seqDict = boost::any_cast(*it); std::string timeline = boost::any_cast(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(dict["nodeGraph"]); PlistArray ret = boost::any_cast(dictNodeGraph["children"]); for (auto it = ret.begin(); it != ret.end(); it++) { PlistDict furnitureDict = boost::any_cast(*it); if (boost::any_cast(furnitureDict["displayName"]) == furnitureId) { ret.erase(it); break; } } dictNodeGraph["children"] = ret; dict["nodeGraph"] = dictNodeGraph; Plist::writePlistXML(filePath.c_str(), dict); } std::array Redream::getFurniturePos(std::string filePath, std::string furnitureId) { std::array pos = {0.0, 0.0}; PlistDict dict; Plist::readPlist(filePath.c_str(), dict); PlistDict dictNodeGraph = boost::any_cast(dict["nodeGraph"]); PlistArray ret = boost::any_cast(dictNodeGraph["children"]); for (auto it = ret.begin(); it != ret.end(); it++) { PlistDict furnitureDict = boost::any_cast(*it); if (boost::any_cast(furnitureDict["displayName"]) == furnitureId) { PlistArray properties = boost::any_cast(furnitureDict["properties"]); for (auto it_pro = properties.begin(); it_pro != properties.end(); it_pro++) { PlistDict dict = boost::any_cast(*it_pro); if (boost::any_cast(dict["name"]) == "position") { PlistArray posArr = boost::any_cast(dict["value"]); qreal x = boost::any_cast(posArr.at(0)); qreal y = boost::any_cast(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(dict["nodeGraph"]); PlistArray ret = boost::any_cast(dictNodeGraph["children"]); for (auto it = ret.begin(); it != ret.end(); it++) { PlistDict furnitureDict = boost::any_cast(*it); if (boost::any_cast(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(dict["nodeGraph"]); // PlistArray ret = boost::any_cast(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(*it); // if (boost::any_cast(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(*it); // if (boost::any_cast(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(dict["nodeGraph"]); PlistArray ret = boost::any_cast(dictNodeGraph["children"]); for (auto it = ret.begin(); it != ret.end(); it++) { PlistDict furnitureDict = boost::any_cast(*it); if (boost::any_cast(furnitureDict["displayName"]) == furnitureId) { int index = it - ret.begin(); return index; } } }