void Cocos2dxView::saveObjectData(JsonX &data, BaseObject *object) { std::string tmp = object->getTypeName(); const char *type_name = tmp.c_str(); ObjectType type = object->getObjectType(); if (!data.has(type_name)) data.insertArray(type_name); //存储同一类型对象的通用属性到数组对象 rapidjson::Value &arr = data[type_name]; if (type == ObjectType::COMMON_OBJECT) { if (!getObjectAttr(type_name, object->getFileName())) return; rapidjson::StringBuffer buf; rapidjson::Writer<rapidjson::StringBuffer> writer(buf); getObjectAttr(type_name, object->getFileName())->getDocument().Accept(writer); rapidjson::Document attr(&data.getAllocator()); attr.Parse<0>(buf.GetString()); rapidjson::Value v(object->getFileName().c_str(), data.getAllocator()); attr.AddMember("filename", v, data.getAllocator()); arr.PushBack((rapidjson::Value&)attr, data.getAllocator()); } else if (type == ObjectType::CIRCLE_OBJECT) { CircleObject *circle = (CircleObject *)object; rapidjson::Document attr(&data.getAllocator()); attr.SetObject(); rapidjson::Value point(rapidjson::kObjectType); point.AddMember("x", circle->getCenterPoint().x, data.getAllocator()); point.AddMember("y", circle->getCenterPoint().y, data.getAllocator()); attr.AddMember("center", point, data.getAllocator()); attr.AddMember("radius", circle->getRadius(), data.getAllocator()); arr.PushBack((rapidjson::Value&)attr, data.getAllocator()); } else if (type == ObjectType::POLYGON_OBJECT) { PolygonObject *polygon = (PolygonObject*)object; rapidjson::Document attr(&data.getAllocator()); attr.SetObject(); //存储形状点集 rapidjson::Value shape_arr(rapidjson::kArrayType);//shape_arr.SetArray() for (auto pos : polygon->getPolyPoints()) { rapidjson::Value point(rapidjson::kObjectType); point.AddMember("x", pos.x, data.getAllocator()); point.AddMember("y", pos.y, data.getAllocator()); shape_arr.PushBack(point, data.getAllocator()); } attr.AddMember("shape", shape_arr, data.getAllocator()); arr.PushBack((rapidjson::Value&)attr, data.getAllocator()); } //保存对象的特定属性 rapidjson::Value &attr = (rapidjson::Value&)object->getObjectAttribute(); for (auto iter = attr.MemberonBegin(); iter != attr.MemberonEnd(); iter++) { rapidjson::Value k(iter->name.GetString(), data.getAllocator()); rapidjson::Value v(iter->value.GetString(), data.getAllocator()); arr[arr.Size() - 1].AddMember(k, v, data.getAllocator()); } //保存对象常规属性 //rapidjson::Value &arr = data[type_name]; rapidjson::Value v(rapidjson::kObjectType); v.AddMember("x", object->getPositionX(), data.getAllocator()); v.AddMember("y", object->getPositionY(), data.getAllocator()); arr[arr.Size() - 1].AddMember("position", v, data.getAllocator()); rapidjson::Value sv(rapidjson::kObjectType); sv.AddMember("width", object->getSprite()->getContentSize().width, data.getAllocator()); sv.AddMember("height", object->getSprite()->getContentSize().height, data.getAllocator()); arr[arr.Size() - 1].AddMember("size", sv, data.getAllocator()); arr[arr.Size() - 1].AddMember("rotate", object->getRotation(), data.getAllocator()); arr[arr.Size() - 1].AddMember("scale", object->getScale(), data.getAllocator()); }