LevelOutputWriter.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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(
  34. const LevelInputData& indata,
  35. const LevelExtInputData& extdata,
  36. vector<PlateFillResult>& plateFillResults,
  37. vector<ContourData::Point>& plateCenterPointArr,
  38. string outfilename)
  39. {
  40. auto fgc = FillGlobalConfig::getInstance() ;
  41. int totalJewelCnt = 0 ;
  42. for(auto itp = plateFillResults.begin();itp!=plateFillResults.end();++itp) {
  43. int plateId = itp->_plateTypeId ;
  44. vector<vector<FillResult>>& frArr = itp->_layersFillResults ;
  45. for(auto itfr = frArr.begin(); itfr!=frArr.end();++itfr ) {
  46. totalJewelCnt+=itfr->size() ;
  47. }
  48. }
  49. DynamicJsonBuffer jsonBufferTiled;
  50. DynamicJsonBuffer jsonBuffer;
  51. JsonObject& tiledRoot = jsonBufferTiled.createObject();
  52. JsonObject& root = jsonBuffer.createObject();
  53. tiledRoot["height"] = 18;
  54. JsonArray& jLayerArr = tiledRoot.createNestedArray("layers");
  55. JsonObject& lyrObj = jLayerArr.createNestedObject();
  56. lyrObj["draworder"] = "topdown";
  57. lyrObj["height"] = 18;
  58. lyrObj["name"] = "Layer";
  59. JsonArray& jObjArr = lyrObj.createNestedArray("objects"); //盘子信息
  60. lyrObj["opacity"] = 1;
  61. lyrObj["type"] = "objectgroup";
  62. lyrObj["visible"] = true;
  63. lyrObj["width"] = 16;
  64. lyrObj["x"] = 0;
  65. lyrObj["y"] = 0;
  66. tiledRoot["nextobjectid"] = 4;
  67. tiledRoot["orientation"] = "orthogonal";
  68. tiledRoot.createNestedArray("properties");
  69. tiledRoot["renderorder"] = "right-down";
  70. tiledRoot["tileheight"] = 40;
  71. JsonArray& jTileSets = tiledRoot.createNestedArray("tilesets"); //盘子纹理图
  72. tiledRoot["tilewidth"] = 40;
  73. tiledRoot["version"] = 1;
  74. tiledRoot["width"] = 16;
  75. root.createNestedObject("target");//not used.
  76. root["bgtem"] = "no"; //背景redream文件
  77. root["jewel_count"] = totalJewelCnt ;
  78. root["time"] = indata._time ;
  79. root["first_move_direction"] = extdata._firstMoveDirection ;
  80. root["second_move_direction"] = extdata._secondMoveDirection ;
  81. JsonArray& jplatesArr = root.createNestedArray("plates");
  82. int ids = 1;
  83. for (int i = 0; i < plateFillResults.size(); i ++){
  84. auto itp = plateFillResults.begin() ;
  85. std::advance(itp, i) ;
  86. int plateId = itp->_plateTypeId ;
  87. JsonObject& tiledPlateObj = jObjArr.createNestedObject();
  88. tiledPlateObj["gid"] = getGidByFileName(jTileSets, fgc->getPlateItemById(plateId));
  89. tiledPlateObj["height"] = 0;
  90. tiledPlateObj["id"] = ids;
  91. tiledPlateObj["name"] = "plate";
  92. tiledPlateObj.createNestedObject("properties");
  93. tiledPlateObj["rotation"] = 0;
  94. tiledPlateObj["type"] = "";
  95. tiledPlateObj["visible"] = true;
  96. tiledPlateObj["width"] = 0;
  97. float platex = plateCenterPointArr[i].x;
  98. float platey = plateCenterPointArr[i].y;
  99. tiledPlateObj["x"] = platex - fgc->getPlateItemById(plateId)->_bbwid / 2;
  100. tiledPlateObj["y"] = 720 - platey + fgc->getPlateItemById(plateId)->_bbhei / 2;
  101. vector<vector<FillResult>>& frArr = itp->_layersFillResults ;
  102. JsonObject& plateObj = jplatesArr.createNestedObject();
  103. plateObj["typeId"] = plateId ;
  104. plateObj["plateId"] = ids++;
  105. plateObj["x"] = platex;
  106. plateObj["y"] = platey;
  107. plateObj["sprite_frame_name"] = fgc->getPlateItemById(plateId)->_pngName;
  108. plateObj["sizeX"] = fgc->getPlateItemById(plateId)->_bbwid;
  109. plateObj["sizeY"] = fgc->getPlateItemById(plateId)->_bbhei;
  110. plateObj["move"] = itp->_moveId ;
  111. JsonArray& layerArr = plateObj.createNestedArray("layers");
  112. for(int il = 0 ; il < frArr.size() ; ++il ) {
  113. vector<FillResult>& frs = frArr[il];
  114. JsonObject& lyrObj = layerArr.createNestedObject();
  115. lyrObj["rotate"] = 0.0;
  116. lyrObj["scale_x"] = 1.0;
  117. lyrObj["scale_y"] = 1.0;
  118. lyrObj["scale"] = 1.0;
  119. lyrObj["sprite_frame_name"] = fgc->getPlateItemById(plateId)->_pngName;
  120. lyrObj["lyrId"] = ids++;
  121. lyrObj["zorder"] = il+1;
  122. JsonArray& posArr = lyrObj.createNestedArray("position");
  123. posArr.add(platex);
  124. posArr.add(platey);
  125. JsonArray& screwArr = lyrObj.createNestedArray("screws");
  126. for(int ij = 0 ;ij < frs.size();++ ij ) {
  127. FillResult& fr = frs[ij];
  128. FillGlobalConfig::JewelItem* jewPtr = fgc->getJewelItemById(fr._jewelTypeId);
  129. if( fr._jewelTypeId>=0 ) { // -1 is removed.
  130. JsonObject& jobj = screwArr.createNestedObject();
  131. jobj["rotate"] = fr._rotdeg;
  132. jobj["scale_x"] = jewPtr->_scale;
  133. jobj["scale_y"] = jewPtr->_scale;
  134. jobj["csx"] = 0;
  135. jobj["csy"] = 0;
  136. jobj["scale"] = jewPtr->_scale;
  137. jobj["sprite_frame_name"] = jewPtr->_pngName;
  138. jobj["screwId"] = ids++;
  139. jobj["typeId"] = fr._jewelTypeId ;
  140. JsonArray& posArr2 = jobj.createNestedArray("position");
  141. posArr2.add( fr._x ); // 钉子中心在游戏区域的坐标(原点左下角)
  142. posArr2.add( fr._y );
  143. }
  144. }
  145. }
  146. }
  147. string jsonText ;
  148. root.printTo(jsonText);
  149. ofstream ofs( outfilename.c_str() );
  150. if( ofs.good()==false ) return false;
  151. ofs<<jsonText;
  152. jsonText.clear();
  153. tiledRoot.printTo(jsonText);
  154. outfilename.insert(outfilename.size() - 5, "Tiled");
  155. ofstream ofsTiled( outfilename.c_str() );
  156. if( ofsTiled.good()==false ) return false;
  157. ofsTiled<<jsonText;
  158. return true;
  159. }