LevelOutputWriter.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //
  2. // LevelOutputWriter.cpp
  3. // auto_fill_jewel_v3
  4. //
  5. // Created by Red on 2024/12/10.
  6. //
  7. #include "LevelOutputWriter.hpp"
  8. #include <fstream>
  9. using std::ofstream;
  10. using namespace ArduinoJson;
  11. int LevelOutputWriter::getGidByFileName(JsonArray &jTileSets, FillGlobalConfig::PlateItem* plate) {
  12. static int gid = 0;
  13. for (int i = 0; i < jTileSets.size(); i++){
  14. string jsonImgName = jTileSets[i]["image"].as<char*>() ;
  15. if ( jsonImgName.compare( plate->_pngName ) == 0 ){
  16. return static_cast<int>(jTileSets[i]["firstgid"]);
  17. }
  18. }
  19. gid ++;
  20. JsonObject& obj = jTileSets.createNestedObject();
  21. obj["firstgid"] = gid;
  22. obj["image"] = plate->_pngName;
  23. obj["imageheight"] = plate->_bbhei;
  24. obj["imagewidth"] = plate->_bbwid;
  25. obj["margin"] = 0;
  26. obj["name"] = plate->_name;
  27. obj.createNestedObject("properties");
  28. obj["spacing"] = 0;
  29. obj["tileheight"] = plate->_bbhei;
  30. obj["tilewidth"] = plate->_bbwid;
  31. return gid;
  32. }
  33. bool LevelOutputWriter::writeLevelJson(vector<PlateFillResult>& plateFillResults,
  34. vector<ContourData::Point>& plateCenterPointArr,
  35. string outfilename)
  36. {
  37. auto fgc = FillGlobalConfig::getInstance() ;
  38. int totalJewelCnt = 0 ;
  39. for(auto itp = plateFillResults.begin();itp!=plateFillResults.end();++itp) {
  40. int plateId = itp->_plateTypeId ;
  41. vector<vector<FillResult>>& frArr = itp->_layersFillResults ;
  42. for(auto itfr = frArr.begin(); itfr!=frArr.end();++itfr ) {
  43. totalJewelCnt+=itfr->size() ;
  44. }
  45. }
  46. DynamicJsonBuffer jsonBufferTiled;
  47. DynamicJsonBuffer jsonBuffer;
  48. JsonObject& tiledRoot = jsonBufferTiled.createObject();
  49. JsonObject& root = jsonBuffer.createObject();
  50. tiledRoot["height"] = 18;
  51. JsonArray& jLayerArr = tiledRoot.createNestedArray("layers");
  52. JsonObject& lyrObj = jLayerArr.createNestedObject();
  53. lyrObj["draworder"] = "topdown";
  54. lyrObj["height"] = 18;
  55. lyrObj["name"] = "Layer";
  56. JsonArray& jObjArr = lyrObj.createNestedArray("objects"); //盘子信息
  57. lyrObj["opacity"] = 1;
  58. lyrObj["type"] = "objectgroup";
  59. lyrObj["visible"] = true;
  60. lyrObj["width"] = 16;
  61. lyrObj["x"] = 0;
  62. lyrObj["y"] = 0;
  63. tiledRoot["nextobjectid"] = 4;
  64. tiledRoot["orientation"] = "orthogonal";
  65. tiledRoot.createNestedArray("properties");
  66. tiledRoot["renderorder"] = "right-down";
  67. tiledRoot["tileheight"] = 40;
  68. JsonArray& jTileSets = tiledRoot.createNestedArray("tilesets"); //盘子纹理图
  69. tiledRoot["tilewidth"] = 40;
  70. tiledRoot["version"] = 1;
  71. tiledRoot["width"] = 16;
  72. root.createNestedObject("target");//not used.
  73. root["bgtem"] = "no"; //背景redream文件
  74. root["jewel_count"] = totalJewelCnt ;
  75. JsonArray& jplatesArr = root.createNestedArray("plates");
  76. int ids = 1;
  77. for (int i = 0; i < plateFillResults.size(); i ++){
  78. auto itp = plateFillResults.begin() ;
  79. std::advance(itp, i) ;
  80. int plateId = itp->_plateTypeId ;
  81. JsonObject& tiledPlateObj = jObjArr.createNestedObject();
  82. tiledPlateObj["gid"] = getGidByFileName(jTileSets, fgc->getPlateItemById(plateId));
  83. tiledPlateObj["height"] = 0;
  84. tiledPlateObj["id"] = ids;
  85. tiledPlateObj["name"] = "plate";
  86. tiledPlateObj.createNestedObject("properties");
  87. tiledPlateObj["rotation"] = 0;
  88. tiledPlateObj["type"] = "";
  89. tiledPlateObj["visible"] = true;
  90. tiledPlateObj["width"] = 0;
  91. float platex = plateCenterPointArr[i].x;
  92. float platey = plateCenterPointArr[i].y;
  93. tiledPlateObj["x"] = platex - fgc->getPlateItemById(plateId)->_bbwid / 2;
  94. tiledPlateObj["y"] = platey - fgc->getPlateItemById(plateId)->_bbhei / 2;
  95. vector<vector<FillResult>>& frArr = itp->_layersFillResults ;
  96. JsonObject& plateObj = jplatesArr.createNestedObject();
  97. plateObj["typeId"] = plateId ;
  98. plateObj["plateId"] = ids++;
  99. plateObj["x"] = platex;
  100. plateObj["y"] = platey;
  101. plateObj["sprite_frame_name"] = fgc->getPlateItemById(plateId)->_pngName;
  102. plateObj["sizeX"] = fgc->getPlateItemById(plateId)->_bbwid;
  103. plateObj["sizeY"] = fgc->getPlateItemById(plateId)->_bbhei;
  104. plateObj["move"] = itp->_moveId ;
  105. JsonArray& layerArr = plateObj.createNestedArray("layers");
  106. for(int il = 0 ; il < frArr.size() ; ++il ) {
  107. vector<FillResult>& frs = frArr[il];
  108. JsonObject& lyrObj = layerArr.createNestedObject();
  109. lyrObj["rotate"] = 0.0;
  110. lyrObj["scale_x"] = 1.0;
  111. lyrObj["scale_y"] = 1.0;
  112. lyrObj["scale"] = 1.0;
  113. lyrObj["sprite_frame_name"] = fgc->getPlateItemById(plateId)->_pngName;
  114. lyrObj["lyrId"] = ids++;
  115. lyrObj["zorder"] = il+1;
  116. JsonArray& posArr = lyrObj.createNestedArray("position");
  117. posArr.add(platex);
  118. posArr.add(platey);
  119. JsonArray& screwArr = lyrObj.createNestedArray("screws");
  120. for(int ij = 0 ;ij < frs.size();++ ij ) {
  121. FillResult& fr = frs[ij];
  122. FillGlobalConfig::JewelItem* jewPtr = fgc->getJewelItemById(fr._jewelTypeId);
  123. if( fr._jewelTypeId>=0 ) { // -1 is removed.
  124. JsonObject& jobj = screwArr.createNestedObject();
  125. jobj["rotate"] = fr._rotdeg;
  126. jobj["scale_x"] = jewPtr->_scale;
  127. jobj["scale_y"] = jewPtr->_scale;
  128. jobj["csx"] = 0;
  129. jobj["csy"] = 0;
  130. jobj["scale"] = jewPtr->_scale;
  131. jobj["sprite_frame_name"] = jewPtr->_pngName;
  132. jobj["screwId"] = ids++;
  133. jobj["typeId"] = fr._jewelTypeId ;
  134. JsonArray& posArr2 = jobj.createNestedArray("position");
  135. posArr2.add( fr._x ); // 钉子中心在游戏区域的坐标(原点左下角)
  136. posArr2.add( fr._y );
  137. }
  138. }
  139. }
  140. }
  141. string jsonText ;
  142. root.printTo(jsonText);
  143. ofstream ofs( outfilename.c_str() );
  144. if( ofs.good()==false ) return false;
  145. ofs<<jsonText;
  146. jsonText.clear();
  147. tiledRoot.printTo(jsonText);
  148. outfilename.insert(outfilename.size() - 5, "Tiled");
  149. ofstream ofsTiled( outfilename.c_str() );
  150. if( ofsTiled.good()==false ) return false;
  151. ofsTiled<<jsonText;
  152. return true;
  153. }