mirror of https://github.com/axmolengine/axmol.git
commit
e1095c4f09
|
@ -192,6 +192,10 @@ void DataReaderHelper::loadData()
|
||||||
{
|
{
|
||||||
DataReaderHelper::addDataFromJsonCache(pAsyncStruct->fileContent.c_str(), pDataInfo);
|
DataReaderHelper::addDataFromJsonCache(pAsyncStruct->fileContent.c_str(), pDataInfo);
|
||||||
}
|
}
|
||||||
|
else if(pAsyncStruct->configType == CocoStudio_Binary)
|
||||||
|
{
|
||||||
|
DataReaderHelper::addDataFromBinaryCache(pAsyncStruct->fileContent.c_str(),pDataInfo);
|
||||||
|
}
|
||||||
|
|
||||||
// put the image info into the queue
|
// put the image info into the queue
|
||||||
_dataInfoMutex.lock();
|
_dataInfoMutex.lock();
|
||||||
|
@ -294,7 +298,16 @@ void DataReaderHelper::addDataFromFile(const std::string& filePath)
|
||||||
|
|
||||||
// Read content from file
|
// Read content from file
|
||||||
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath);
|
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath);
|
||||||
std::string contentStr = FileUtils::getInstance()->getStringFromFile(fullPath);
|
bool isbinarysrc = str==".csb";
|
||||||
|
std::string filemode("r");
|
||||||
|
if(isbinarysrc)
|
||||||
|
filemode += "b";
|
||||||
|
ssize_t filesize;
|
||||||
|
|
||||||
|
_dataReaderHelper->_getFileMutex.lock();
|
||||||
|
unsigned char *pBytes = FileUtils::getInstance()->getFileData(filePath, filemode.c_str(), &filesize);
|
||||||
|
std::string contentStr((const char*)pBytes,filesize);
|
||||||
|
_dataReaderHelper->_getFileMutex.unlock();
|
||||||
|
|
||||||
DataInfo dataInfo;
|
DataInfo dataInfo;
|
||||||
dataInfo.filename = filePathStr;
|
dataInfo.filename = filePathStr;
|
||||||
|
@ -308,6 +321,12 @@ void DataReaderHelper::addDataFromFile(const std::string& filePath)
|
||||||
{
|
{
|
||||||
DataReaderHelper::addDataFromJsonCache(contentStr, &dataInfo);
|
DataReaderHelper::addDataFromJsonCache(contentStr, &dataInfo);
|
||||||
}
|
}
|
||||||
|
else if(str == ".csb")
|
||||||
|
{
|
||||||
|
DataReaderHelper::addDataFromBinaryCache(contentStr.c_str(),&dataInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
CC_SAFE_DELETE_ARRAY(pBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const std::string& plistPath, const std::string& filePath, Ref *target, SEL_SCHEDULE selector)
|
void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const std::string& plistPath, const std::string& filePath, Ref *target, SEL_SCHEDULE selector)
|
||||||
|
@ -391,8 +410,22 @@ void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const
|
||||||
|
|
||||||
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath);
|
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filePath);
|
||||||
|
|
||||||
|
bool isbinaryfilesrc = str==".csb";
|
||||||
|
std::string filereadmode("r");
|
||||||
|
if (isbinaryfilesrc) {
|
||||||
|
filereadmode += "b";
|
||||||
|
}
|
||||||
|
ssize_t size;
|
||||||
// XXX fileContent is being leaked
|
// XXX fileContent is being leaked
|
||||||
data->fileContent = FileUtils::getInstance()->getStringFromFile(fullPath);
|
|
||||||
|
_dataReaderHelper->_getFileMutex.lock();
|
||||||
|
unsigned char *pBytes = FileUtils::getInstance()->getFileData(fullPath.c_str() , filereadmode.c_str(), &size);
|
||||||
|
_dataReaderHelper->_getFileMutex.unlock();
|
||||||
|
|
||||||
|
Data bytecpy;
|
||||||
|
bytecpy.copy(pBytes, size);
|
||||||
|
data->fileContent = std::string((const char*)bytecpy.getBytes(), size);
|
||||||
|
CC_SAFE_DELETE_ARRAY(pBytes);
|
||||||
|
|
||||||
if (str == ".xml")
|
if (str == ".xml")
|
||||||
{
|
{
|
||||||
|
@ -402,6 +435,10 @@ void DataReaderHelper::addDataFromFileAsync(const std::string& imagePath, const
|
||||||
{
|
{
|
||||||
data->configType = CocoStudio_JSON;
|
data->configType = CocoStudio_JSON;
|
||||||
}
|
}
|
||||||
|
else if(str == ".csb")
|
||||||
|
{
|
||||||
|
data->configType = CocoStudio_Binary;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// add async struct into queue
|
// add async struct into queue
|
||||||
|
@ -1687,4 +1724,843 @@ void DataReaderHelper::decodeNode(BaseData *node, const rapidjson::Value& json,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DataReaderHelper::addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
CocoLoader tCocoLoader;
|
||||||
|
if (tCocoLoader.ReadCocoBinBuff((char*)fileContent))
|
||||||
|
{
|
||||||
|
stExpCocoNode *tpRootCocoNode = tCocoLoader.GetRootCocoNode();
|
||||||
|
rapidjson::Type tType = tpRootCocoNode->GetType(&tCocoLoader);
|
||||||
|
if (rapidjson::kObjectType == tType)
|
||||||
|
{
|
||||||
|
stExpCocoNode *tpChildArray = tpRootCocoNode->GetChildArray();
|
||||||
|
int nCount = tpRootCocoNode->GetChildNum();
|
||||||
|
|
||||||
|
dataInfo->contentScale = 1.0f;
|
||||||
|
int length = 0;
|
||||||
|
std::string key;
|
||||||
|
stExpCocoNode* pDataArray;
|
||||||
|
for (int i = 0; i < nCount; ++i)
|
||||||
|
{
|
||||||
|
key = tpChildArray[i].GetName(&tCocoLoader);
|
||||||
|
if (key.compare(CONTENT_SCALE) == 0)
|
||||||
|
{
|
||||||
|
std::string value = tpChildArray[i].GetValue();
|
||||||
|
dataInfo->contentScale = atof(value.c_str());
|
||||||
|
}
|
||||||
|
else if ( 0 == key.compare(ARMATURE_DATA))
|
||||||
|
{
|
||||||
|
pDataArray = tpChildArray[i].GetChildArray();
|
||||||
|
length = tpChildArray[i].GetChildNum();
|
||||||
|
ArmatureData * armatureData;
|
||||||
|
for (int ii = 0; ii < length; ++ii)
|
||||||
|
{
|
||||||
|
armatureData = decodeArmature(&tCocoLoader, &pDataArray[ii], dataInfo);
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
_dataReaderHelper->_addDataMutex.lock();
|
||||||
|
}
|
||||||
|
ArmatureDataManager::getInstance()->addArmatureData(armatureData->name.c_str(), armatureData, dataInfo->filename.c_str());
|
||||||
|
armatureData->release();
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
_dataReaderHelper->_addDataMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( 0 == key.compare(ANIMATION_DATA))
|
||||||
|
{
|
||||||
|
pDataArray = tpChildArray[i].GetChildArray();
|
||||||
|
length = tpChildArray[i].GetChildNum();
|
||||||
|
AnimationData *animationData;
|
||||||
|
for (int ii = 0; ii < length; ++ii)
|
||||||
|
{
|
||||||
|
animationData = decodeAnimation(&tCocoLoader, &pDataArray[ii], dataInfo);
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
_dataReaderHelper->_addDataMutex.lock();
|
||||||
|
}
|
||||||
|
ArmatureDataManager::getInstance()->addAnimationData(animationData->name.c_str(), animationData, dataInfo->filename.c_str());
|
||||||
|
animationData->release();
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
_dataReaderHelper->_addDataMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(TEXTURE_DATA) == 0)
|
||||||
|
{
|
||||||
|
pDataArray = tpChildArray[i].GetChildArray();
|
||||||
|
length = tpChildArray[i].GetChildNum();
|
||||||
|
for (int ii = 0; ii < length; ++ii)
|
||||||
|
{
|
||||||
|
TextureData *textureData = decodeTexture(&tCocoLoader, &pDataArray[ii]);
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
_dataReaderHelper->_addDataMutex.lock();
|
||||||
|
}
|
||||||
|
ArmatureDataManager::getInstance()->addTextureData(textureData->name.c_str(), textureData, dataInfo->filename.c_str());
|
||||||
|
textureData->release();
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
_dataReaderHelper->_addDataMutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Auto losprite file
|
||||||
|
bool autoLoad = dataInfo->asyncStruct == NULL ? ArmatureDataManager::getInstance()->isAutoLoadSpriteFile() : dataInfo->asyncStruct->autoLoadSpriteFile;
|
||||||
|
if (autoLoad)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < nCount; ++i)
|
||||||
|
{
|
||||||
|
key = tpChildArray[i].GetName(&tCocoLoader);
|
||||||
|
if( 0 != key.compare(CONFIG_FILE_PATH))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
length = tpChildArray[i].GetChildNum();
|
||||||
|
stExpCocoNode *pConfigFilePath = tpChildArray[i].GetChildArray();
|
||||||
|
for (int ii = 0; ii < length; ii++)
|
||||||
|
{
|
||||||
|
const char *path = pConfigFilePath[ii].GetValue();
|
||||||
|
if (path == NULL)
|
||||||
|
{
|
||||||
|
CCLOG("load CONFIG_FILE_PATH error.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string filePath = path;
|
||||||
|
filePath = filePath.erase(filePath.find_last_of("."));
|
||||||
|
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
dataInfo->configFileQueue.push(filePath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string plistPath = filePath + ".plist";
|
||||||
|
std::string pngPath = filePath + ".png";
|
||||||
|
|
||||||
|
ArmatureDataManager::getInstance()->addSpriteFrameFromFile((dataInfo->baseFilePath + plistPath).c_str(), (dataInfo->baseFilePath + pngPath).c_str(), dataInfo->filename.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ArmatureData* DataReaderHelper::decodeArmature(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
ArmatureData *armatureData = new ArmatureData();
|
||||||
|
armatureData->init();
|
||||||
|
stExpCocoNode *pAramtureDataArray = pCocoNode->GetChildArray();
|
||||||
|
const char *name = pAramtureDataArray[2].GetValue(); //DICTOOL->getStringValue_json(json, A_NAME);
|
||||||
|
if(name != NULL)
|
||||||
|
{
|
||||||
|
armatureData->name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
float version = atof(pAramtureDataArray[1].GetValue());
|
||||||
|
dataInfo->cocoStudioVersion = armatureData->dataVersion = version; //DICTOOL->getFloatValue_json(json, VERSION, 0.1f);
|
||||||
|
|
||||||
|
int length = pAramtureDataArray[3].GetChildNum(); //DICTOOL->getArrayCount_json(json, BONE_DATA, 0);
|
||||||
|
stExpCocoNode *pBoneChildren = pAramtureDataArray[3].GetChildArray();
|
||||||
|
stExpCocoNode* child;
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
//const rapidjson::Value &dic = DICTOOL->getSubDictionary_json(json, BONE_DATA, i); //json[BONE_DATA][i];
|
||||||
|
child = &pBoneChildren[i];
|
||||||
|
BoneData *boneData = decodeBone(pCocoLoader, child, dataInfo);
|
||||||
|
armatureData->addBoneData(boneData);
|
||||||
|
boneData->release();
|
||||||
|
}
|
||||||
|
|
||||||
|
return armatureData;
|
||||||
|
}
|
||||||
|
|
||||||
|
BoneData* DataReaderHelper::decodeBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
BoneData *boneData = new BoneData();
|
||||||
|
boneData->init();
|
||||||
|
|
||||||
|
decodeNode(boneData, pCocoLoader, pCocoNode, dataInfo);
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pBoneChildren = pCocoNode->GetChildArray();
|
||||||
|
stExpCocoNode* child;
|
||||||
|
const char *str = NULL;
|
||||||
|
std::string key;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
child = &pBoneChildren[i];
|
||||||
|
key = child->GetName(pCocoLoader);
|
||||||
|
str = child->GetValue();
|
||||||
|
if (key.compare(A_NAME) == 0)
|
||||||
|
{
|
||||||
|
//DICTOOL->getStringValue_json(json, A_NAME);
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
boneData->name = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_PARENT) == 0)
|
||||||
|
{
|
||||||
|
//DICTOOL->getStringValue_json(json, A_PARENT);
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
boneData->parentName = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(DISPLAY_DATA) == 0)
|
||||||
|
{
|
||||||
|
int count = child->GetChildNum();
|
||||||
|
stExpCocoNode *pDisplayData = child->GetChildArray();
|
||||||
|
for (int ii = 0; ii < count; ++ii)
|
||||||
|
{
|
||||||
|
DisplayData *displayData = decodeBoneDisplay(pCocoLoader, &pDisplayData[ii], dataInfo);
|
||||||
|
if(displayData == NULL)
|
||||||
|
continue;
|
||||||
|
boneData->addDisplayData(displayData);
|
||||||
|
displayData->release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return boneData;
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplayData* DataReaderHelper::decodeBoneDisplay(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
stExpCocoNode* children = pCocoNode->GetChildArray();
|
||||||
|
stExpCocoNode* child = &children[1];
|
||||||
|
const char *str = NULL;
|
||||||
|
|
||||||
|
std::string key = child->GetName(pCocoLoader);
|
||||||
|
str = child->GetValue();
|
||||||
|
DisplayData *displayData = NULL;
|
||||||
|
if (key.compare(A_DISPLAY_TYPE) == 0)
|
||||||
|
{
|
||||||
|
str = child->GetValue();
|
||||||
|
DisplayType displayType = (DisplayType)(atoi(str));
|
||||||
|
|
||||||
|
int length = 0;
|
||||||
|
switch (displayType)
|
||||||
|
{
|
||||||
|
case CS_DISPLAY_SPRITE:
|
||||||
|
{
|
||||||
|
displayData = new SpriteDisplayData();
|
||||||
|
|
||||||
|
const char *name = children[0].GetValue();
|
||||||
|
if(name != NULL)
|
||||||
|
{
|
||||||
|
((SpriteDisplayData *)displayData)->displayName = name;
|
||||||
|
}
|
||||||
|
stExpCocoNode *pSkinDataArray = children[2].GetChildArray();
|
||||||
|
if (pSkinDataArray != NULL)
|
||||||
|
{
|
||||||
|
stExpCocoNode *pSkinData = &pSkinDataArray[0];
|
||||||
|
if (pSkinData != NULL)
|
||||||
|
{
|
||||||
|
SpriteDisplayData *sdd = (SpriteDisplayData *)displayData;
|
||||||
|
length = pSkinData->GetChildNum();
|
||||||
|
stExpCocoNode *SkinDataValue = pSkinData->GetChildArray();
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
key = SkinDataValue[i].GetName(pCocoLoader);
|
||||||
|
str = SkinDataValue[i].GetValue();
|
||||||
|
if (key.compare(A_X) == 0)
|
||||||
|
{
|
||||||
|
sdd->skinData.x = atof(str) * s_PositionReadScale;
|
||||||
|
}
|
||||||
|
else if (key.compare(A_Y) == 0)
|
||||||
|
{
|
||||||
|
sdd->skinData.y = atof(str) * s_PositionReadScale;
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SCALE_X) == 0)
|
||||||
|
{
|
||||||
|
sdd->skinData.scaleX = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SCALE_Y) == 0)
|
||||||
|
{
|
||||||
|
sdd->skinData.scaleY = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SKEW_X) == 0)
|
||||||
|
{
|
||||||
|
sdd->skinData.skewX = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SKEW_Y) == 0)
|
||||||
|
{
|
||||||
|
sdd->skinData.skewY = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sdd->skinData.x *= dataInfo->contentScale;
|
||||||
|
sdd->skinData.y *= dataInfo->contentScale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case CS_DISPLAY_ARMATURE:
|
||||||
|
{
|
||||||
|
displayData = new ArmatureDisplayData();
|
||||||
|
|
||||||
|
const char *name = pCocoNode[0].GetValue();
|
||||||
|
if(name != NULL)
|
||||||
|
{
|
||||||
|
((ArmatureDisplayData *)displayData)->displayName = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CS_DISPLAY_PARTICLE:
|
||||||
|
{
|
||||||
|
displayData = new ParticleDisplayData();
|
||||||
|
length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pDisplayData = pCocoNode->GetChildArray();
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
key = pDisplayData[i].GetName(pCocoLoader);
|
||||||
|
str = pDisplayData[i].GetValue();
|
||||||
|
if (key.compare(A_PLIST) == 0)
|
||||||
|
{
|
||||||
|
const char *plist = str;
|
||||||
|
if(plist != NULL)
|
||||||
|
{
|
||||||
|
if (dataInfo->asyncStruct)
|
||||||
|
{
|
||||||
|
((ParticleDisplayData *)displayData)->displayName = dataInfo->asyncStruct->baseFilePath + plist;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
((ParticleDisplayData *)displayData)->displayName = dataInfo->baseFilePath + plist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
displayData = new SpriteDisplayData();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
displayData->displayType = displayType;
|
||||||
|
}
|
||||||
|
return displayData;
|
||||||
|
}
|
||||||
|
|
||||||
|
AnimationData* DataReaderHelper::decodeAnimation(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
AnimationData *aniData = new AnimationData();
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pAnimationData = pCocoNode->GetChildArray();
|
||||||
|
const char *str = NULL;
|
||||||
|
std::string key;
|
||||||
|
stExpCocoNode* child;
|
||||||
|
MovementData *movementData;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
child = &pAnimationData[i];
|
||||||
|
key = child->GetName(pCocoLoader);
|
||||||
|
str = child->GetValue();
|
||||||
|
if (key.compare(A_NAME) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
aniData->name = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(MOVEMENT_DATA) == 0)
|
||||||
|
{
|
||||||
|
int movcount = child->GetChildNum();
|
||||||
|
stExpCocoNode* movArray = child->GetChildArray();
|
||||||
|
for( int movnum =0; movnum <movcount; movnum++)
|
||||||
|
{
|
||||||
|
movementData = decodeMovement(pCocoLoader, &movArray[movnum], dataInfo);
|
||||||
|
aniData->addMovement(movementData);
|
||||||
|
movementData->release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aniData;
|
||||||
|
}
|
||||||
|
|
||||||
|
MovementData* DataReaderHelper::decodeMovement(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
MovementData *movementData = new MovementData();
|
||||||
|
movementData->scale = 1.0f;
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pMoveDataArray = pCocoNode->GetChildArray();
|
||||||
|
|
||||||
|
const char *str = NULL;
|
||||||
|
std::string key;
|
||||||
|
stExpCocoNode* child;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
child = &pMoveDataArray[i];
|
||||||
|
key = child->GetName(pCocoLoader);
|
||||||
|
str = child->GetValue();
|
||||||
|
if (key.compare(A_NAME) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementData->name = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_LOOP) == 0)
|
||||||
|
{
|
||||||
|
movementData->loop = true;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
if (strcmp("1", str) != 0)
|
||||||
|
{
|
||||||
|
movementData->loop = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_DURATION_TWEEN) == 0)
|
||||||
|
{
|
||||||
|
movementData->durationTween = 0;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementData->durationTween = atoi(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_DURATION_TO) == 0)
|
||||||
|
{
|
||||||
|
movementData->durationTo = 0;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementData->durationTo = atoi(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_DURATION) == 0)
|
||||||
|
{
|
||||||
|
movementData->duration = 0;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementData->duration = atoi(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_MOVEMENT_SCALE) == 0)
|
||||||
|
{
|
||||||
|
movementData->scale = 1.0;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementData->scale = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_TWEEN_EASING) == 0)
|
||||||
|
{
|
||||||
|
movementData->tweenEasing = cocos2d::tweenfunc::Linear;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementData->tweenEasing = (TweenType)(atoi(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(MOVEMENT_BONE_DATA) == 0)
|
||||||
|
{
|
||||||
|
int count = child->GetChildNum();
|
||||||
|
stExpCocoNode *pMoveBoneData = child->GetChildArray();
|
||||||
|
MovementBoneData *movementBoneData;
|
||||||
|
for (int ii = 0; ii < count; ++ii)
|
||||||
|
{
|
||||||
|
movementBoneData = decodeMovementBone(pCocoLoader, &pMoveBoneData[ii],dataInfo);
|
||||||
|
movementData->addMovementBoneData(movementBoneData);
|
||||||
|
movementBoneData->release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return movementData;
|
||||||
|
}
|
||||||
|
|
||||||
|
MovementBoneData* DataReaderHelper::decodeMovementBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
MovementBoneData *movementBoneData = new MovementBoneData();
|
||||||
|
movementBoneData->init();
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pMovementBoneDataArray = pCocoNode->GetChildArray();
|
||||||
|
stExpCocoNode* movebonechild;
|
||||||
|
const char *str = NULL;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
movebonechild = &pMovementBoneDataArray[i];
|
||||||
|
std::string key = movebonechild->GetName(pCocoLoader);
|
||||||
|
str = movebonechild->GetValue();
|
||||||
|
if (key.compare(A_NAME) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementBoneData->name = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_MOVEMENT_DELAY) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
movementBoneData->delay = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(FRAME_DATA) == 0)
|
||||||
|
{
|
||||||
|
int count =movebonechild->GetChildNum();
|
||||||
|
stExpCocoNode *pFrameDataArray = movebonechild->GetChildArray();
|
||||||
|
for (int ii = 0; ii < count; ++ii)
|
||||||
|
{
|
||||||
|
FrameData *frameData = decodeFrame(pCocoLoader, &pFrameDataArray[ii], dataInfo);
|
||||||
|
movementBoneData->addFrameData(frameData);
|
||||||
|
frameData->release();
|
||||||
|
|
||||||
|
if (dataInfo->cocoStudioVersion < VERSION_COMBINED)
|
||||||
|
{
|
||||||
|
frameData->frameID = movementBoneData->duration;
|
||||||
|
movementBoneData->duration += frameData->duration;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const ssize_t framesizemusone = movementBoneData->frameList.size()-1;
|
||||||
|
if (dataInfo->cocoStudioVersion < VERSION_CHANGE_ROTATION_RANGE)
|
||||||
|
{
|
||||||
|
//! Change rotation range from (-180 -- 180) to (-infinity -- infinity)
|
||||||
|
cocos2d::Vector<FrameData*> frames =movementBoneData->frameList;
|
||||||
|
|
||||||
|
ssize_t imusone =0;
|
||||||
|
ssize_t i =0;
|
||||||
|
for (i = framesizemusone; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
imusone = i-1;
|
||||||
|
float difSkewX = frames.at(i)->skewX - frames.at(imusone)->skewX;
|
||||||
|
float difSkewY = frames.at(i)->skewY - frames.at(imusone)->skewY;
|
||||||
|
|
||||||
|
if (difSkewX < -M_PI || difSkewX > M_PI)
|
||||||
|
{
|
||||||
|
frames.at(imusone)->skewX = difSkewX < 0 ? frames.at(imusone)->skewX - 2 * M_PI : frames.at(imusone)->skewX + 2 * M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (difSkewY < -M_PI || difSkewY > M_PI)
|
||||||
|
{
|
||||||
|
frames.at(imusone)->skewY = difSkewY < 0 ? frames.at(imusone)->skewY - 2 * M_PI : frames.at(imusone)->skewY + 2 * M_PI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (dataInfo->cocoStudioVersion < VERSION_COMBINED)
|
||||||
|
{
|
||||||
|
if (movementBoneData->frameList.size() > 0)
|
||||||
|
{
|
||||||
|
FrameData *frameData = new FrameData();
|
||||||
|
frameData = movementBoneData->frameList.at(framesizemusone);
|
||||||
|
movementBoneData->addFrameData(frameData);
|
||||||
|
frameData->release();
|
||||||
|
frameData->frameID = movementBoneData->duration;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return movementBoneData;
|
||||||
|
}
|
||||||
|
|
||||||
|
FrameData* DataReaderHelper::decodeFrame(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
FrameData *frameData = new FrameData();
|
||||||
|
|
||||||
|
decodeNode(frameData, pCocoLoader, pCocoNode, dataInfo);
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pFrameDataArray = pCocoNode->GetChildArray();
|
||||||
|
const char *str = NULL;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
std::string key = pFrameDataArray[i].GetName(pCocoLoader);
|
||||||
|
str = pFrameDataArray[i].GetValue();
|
||||||
|
if (key.compare(A_TWEEN_EASING) == 0)
|
||||||
|
{
|
||||||
|
frameData->tweenEasing = cocos2d::tweenfunc::Linear;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->tweenEasing = (TweenType)(atoi(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_DISPLAY_INDEX) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->displayIndex = atoi(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_BLEND_SRC) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->blendFunc.src = (GLenum)(atoi(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_BLEND_DST) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->blendFunc.dst = (GLenum)(atoi(str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_TWEEN_FRAME) == 0)
|
||||||
|
{
|
||||||
|
frameData->isTween = true;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
if (strcmp("1", str) != 0)
|
||||||
|
{
|
||||||
|
frameData->isTween = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_EVENT) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->strEvent = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_DURATION) == 0)
|
||||||
|
{
|
||||||
|
if (dataInfo->cocoStudioVersion < VERSION_COMBINED)
|
||||||
|
{
|
||||||
|
frameData->duration = 1;
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->duration = atoi(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_FRAME_INDEX) == 0)
|
||||||
|
{
|
||||||
|
if (dataInfo->cocoStudioVersion >= VERSION_COMBINED)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
frameData->frameID = atoi(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_EASING_PARAM) == 0)
|
||||||
|
{
|
||||||
|
int count = pFrameDataArray[i].GetChildNum();
|
||||||
|
if (count != 0 )
|
||||||
|
{
|
||||||
|
frameData->easingParams = new float[count];
|
||||||
|
stExpCocoNode *pFrameData = pFrameDataArray[i].GetChildArray();
|
||||||
|
for (int ii = 0; ii < count; ++ii)
|
||||||
|
{
|
||||||
|
str = pFrameData[ii].GetValue();
|
||||||
|
if (str != NULL)
|
||||||
|
{
|
||||||
|
frameData->easingParams[ii] = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return frameData;
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureData* DataReaderHelper::decodeTexture(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode)
|
||||||
|
{
|
||||||
|
TextureData *textureData = new TextureData();
|
||||||
|
textureData->init();
|
||||||
|
|
||||||
|
if(pCocoNode == NULL)
|
||||||
|
{
|
||||||
|
return textureData;
|
||||||
|
}
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *pTextureDataArray = pCocoNode->GetChildArray();
|
||||||
|
const char *str = NULL;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
std::string key = pTextureDataArray[i].GetName(pCocoLoader);
|
||||||
|
str = pTextureDataArray[i].GetValue();
|
||||||
|
if (key.compare(A_NAME) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
textureData->name = str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_WIDTH) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
textureData->width = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_HEIGHT) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
textureData->height = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_PIVOT_X) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
textureData->pivotX = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(A_PIVOT_Y) == 0)
|
||||||
|
{
|
||||||
|
if(str != NULL)
|
||||||
|
{
|
||||||
|
textureData->pivotY = atof(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (key.compare(CONTOUR_DATA) == 0)
|
||||||
|
{
|
||||||
|
int count = pTextureDataArray[i].GetChildNum();
|
||||||
|
stExpCocoNode *pContourArray = pTextureDataArray[i].GetChildArray();
|
||||||
|
for (int ii = 0; ii < count; ++ii)
|
||||||
|
{
|
||||||
|
ContourData *contourData = decodeContour(pCocoLoader, &pContourArray[ii]);
|
||||||
|
textureData->contourDataList.pushBack(contourData);
|
||||||
|
contourData->release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return textureData;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContourData* DataReaderHelper::decodeContour(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode)
|
||||||
|
{
|
||||||
|
ContourData *contourData = new ContourData();
|
||||||
|
contourData->init();
|
||||||
|
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *verTexPointArray = pCocoNode->GetChildArray();
|
||||||
|
const char *str = NULL;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
std::string key = verTexPointArray[i].GetName(pCocoLoader);
|
||||||
|
str = verTexPointArray[i].GetValue();
|
||||||
|
if (key.compare(VERTEX_POINT) == 0)
|
||||||
|
{
|
||||||
|
int count = verTexPointArray[i].GetChildNum();
|
||||||
|
stExpCocoNode *pVerTexPointArray = verTexPointArray[i].GetChildArray();
|
||||||
|
stExpCocoNode *pVerTexPoint;
|
||||||
|
for (int ii = count - 1; ii >= 0; --ii)
|
||||||
|
{
|
||||||
|
pVerTexPoint = pVerTexPointArray[ii].GetChildArray();
|
||||||
|
Vec2 vertex;
|
||||||
|
vertex.x = atof(pVerTexPoint[0].GetValue());
|
||||||
|
vertex.y = atof(pVerTexPoint[1].GetValue());
|
||||||
|
contourData->vertexList.push_back(vertex); }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return contourData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataReaderHelper::decodeNode(BaseData *node, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo)
|
||||||
|
{
|
||||||
|
int length = pCocoNode->GetChildNum();
|
||||||
|
stExpCocoNode *NodeArray = pCocoNode->GetChildArray();
|
||||||
|
const char *str = NULL;
|
||||||
|
|
||||||
|
bool isVersionL = dataInfo->cocoStudioVersion < VERSION_COLOR_READING;
|
||||||
|
stExpCocoNode* child;
|
||||||
|
for (int i = 0; i < length; ++i)
|
||||||
|
{
|
||||||
|
child = &NodeArray[i];
|
||||||
|
std::string key = child->GetName(pCocoLoader);
|
||||||
|
str = child->GetValue();
|
||||||
|
if (key.compare(A_X) == 0)
|
||||||
|
{
|
||||||
|
node->x = atof(str) * dataInfo->contentScale;
|
||||||
|
}
|
||||||
|
else if (key.compare(A_Y) == 0)
|
||||||
|
{
|
||||||
|
node->y = atof(str) * dataInfo->contentScale;
|
||||||
|
}
|
||||||
|
else if (key.compare(A_Z) == 0)
|
||||||
|
{
|
||||||
|
node->zOrder = atoi(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SKEW_X) == 0)
|
||||||
|
{
|
||||||
|
node->skewX = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SKEW_Y) == 0)
|
||||||
|
{
|
||||||
|
node->skewY = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SCALE_X) == 0)
|
||||||
|
{
|
||||||
|
node->scaleX = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(A_SCALE_Y) == 0)
|
||||||
|
{
|
||||||
|
node->scaleY = atof(str);
|
||||||
|
}
|
||||||
|
else if (key.compare(COLOR_INFO) == 0)
|
||||||
|
{
|
||||||
|
if (!isVersionL)
|
||||||
|
{
|
||||||
|
if (child->GetType(pCocoLoader) == rapidjson::kObjectType)
|
||||||
|
{
|
||||||
|
if(child->GetChildNum() == 4)
|
||||||
|
{
|
||||||
|
stExpCocoNode *ChildArray = child->GetChildArray();
|
||||||
|
|
||||||
|
node->a = atoi(ChildArray[0].GetValue());
|
||||||
|
node->r = atoi(ChildArray[1].GetValue());
|
||||||
|
node->g = atoi(ChildArray[2].GetValue());
|
||||||
|
node->b = atoi(ChildArray[3].GetValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
node->isUseColorInfo = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVersionL)
|
||||||
|
{
|
||||||
|
int colorcoount = NodeArray[0].GetChildNum();
|
||||||
|
if(colorcoount>0)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (NodeArray[0].GetType(pCocoLoader) == rapidjson::kObjectType)
|
||||||
|
{
|
||||||
|
if(NodeArray[0].GetChildNum() == 4)
|
||||||
|
{
|
||||||
|
stExpCocoNode *ChildArray = NodeArray[0].GetChildArray();
|
||||||
|
|
||||||
|
node->a = atoi(ChildArray[0].GetValue());
|
||||||
|
node->r = atoi(ChildArray[1].GetValue());
|
||||||
|
node->g = atoi(ChildArray[2].GetValue());
|
||||||
|
node->b = atoi(ChildArray[3].GetValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node->isUseColorInfo = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,10 @@ THE SOFTWARE.
|
||||||
#include "cocostudio/CCArmature.h"
|
#include "cocostudio/CCArmature.h"
|
||||||
#include "cocostudio/DictionaryHelper.h"
|
#include "cocostudio/DictionaryHelper.h"
|
||||||
|
|
||||||
|
#include "json/document.h"
|
||||||
|
#include "Cocoloader.h"
|
||||||
|
#include "DictionaryHelper.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
@ -55,7 +59,8 @@ protected:
|
||||||
enum ConfigType
|
enum ConfigType
|
||||||
{
|
{
|
||||||
DragonBone_XML,
|
DragonBone_XML,
|
||||||
CocoStudio_JSON
|
CocoStudio_JSON,
|
||||||
|
CocoStudio_Binary
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _AsyncStruct
|
typedef struct _AsyncStruct
|
||||||
|
@ -172,6 +177,23 @@ public:
|
||||||
|
|
||||||
static void decodeNode(BaseData *node, const rapidjson::Value& json, DataInfo *dataInfo);
|
static void decodeNode(BaseData *node, const rapidjson::Value& json, DataInfo *dataInfo);
|
||||||
|
|
||||||
|
// for binary decode
|
||||||
|
public:
|
||||||
|
static void addDataFromBinaryCache(const char *fileContent, DataInfo *dataInfo = NULL);
|
||||||
|
static ArmatureData *decodeArmature(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
static BoneData *decodeBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
static DisplayData *decodeBoneDisplay(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
static AnimationData *decodeAnimation(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
static MovementData *decodeMovement(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
|
||||||
|
static MovementBoneData *decodeMovementBone(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
static FrameData *decodeFrame(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
|
||||||
|
static TextureData *decodeTexture(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode);
|
||||||
|
static ContourData *decodeContour(CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode);
|
||||||
|
|
||||||
|
static void decodeNode(BaseData *node, CocoLoader *pCocoLoader, stExpCocoNode *pCocoNode, DataInfo *dataInfo);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void loadData();
|
void loadData();
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,9 @@ Layer *CreateLayer(int index)
|
||||||
case TEST_CHANGE_ANIMATION_INTERNAL:
|
case TEST_CHANGE_ANIMATION_INTERNAL:
|
||||||
pLayer = new TestChangeAnimationInternal();
|
pLayer = new TestChangeAnimationInternal();
|
||||||
break;
|
break;
|
||||||
|
case TEST_DIRECT_FROM_BINARY:
|
||||||
|
pLayer = new TestLoadFromBinary();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1487,3 +1490,101 @@ void TestChangeAnimationInternal::onTouchesEnded(const std::vector<Touch*>& touc
|
||||||
Director::getInstance()->setAnimationInterval(1/30.0f);
|
Director::getInstance()->setAnimationInterval(1/30.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//TestDirectFromBinay
|
||||||
|
|
||||||
|
const char* TestLoadFromBinary::m_binaryFilesNames[BINARYFILECOUNT] ={"armature/bear.csb","armature/horse.csb",
|
||||||
|
"armature/Cowboy.csb","armature/hero.csb",
|
||||||
|
"armature/HeroAnimation.csb","armature/testEasing.csb"};
|
||||||
|
const char* TestLoadFromBinary::m_armatureNames[BINARYFILECOUNT] ={"bear","horse",
|
||||||
|
"Cowboy","hero",
|
||||||
|
"HeroAnimation","testEasing"};
|
||||||
|
|
||||||
|
|
||||||
|
void TestLoadFromBinary::onEnter()
|
||||||
|
{
|
||||||
|
ArmatureTestLayer::onEnter();
|
||||||
|
|
||||||
|
auto listener = EventListenerTouchAllAtOnce::create();
|
||||||
|
listener->onTouchesEnded = CC_CALLBACK_2(TestLoadFromBinary::onTouchesEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
|
||||||
|
|
||||||
|
m_armatureIndex = -1; // none
|
||||||
|
|
||||||
|
// remove json created
|
||||||
|
// remove sync resource
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/bear.ExportJson");
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo(m_binaryFilesNames[0]);
|
||||||
|
// load from binary
|
||||||
|
ArmatureDataManager::getInstance()->addArmatureFileInfo(m_binaryFilesNames[0]);
|
||||||
|
|
||||||
|
m_armature = Armature::create(m_armatureNames[0]);
|
||||||
|
m_armature->getAnimation()->playWithIndex(0);
|
||||||
|
m_armature->setScale(1.0f);
|
||||||
|
|
||||||
|
m_armature->setPosition(Vec2(VisibleRect::center().x, VisibleRect::center().y));
|
||||||
|
addChild(m_armature);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string TestLoadFromBinary::title() const
|
||||||
|
{
|
||||||
|
return "Test load from binary file";
|
||||||
|
}
|
||||||
|
std::string TestLoadFromBinary::subtitle() const
|
||||||
|
{
|
||||||
|
return "direct load.Touch to change to Asynchronous load.";
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestLoadFromBinary::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
|
||||||
|
{
|
||||||
|
// remove json created
|
||||||
|
// remove sync resource
|
||||||
|
if(-1 == m_armatureIndex )
|
||||||
|
{
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo(m_binaryFilesNames[0]);
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/Cowboy.ExportJson");
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/hero.ExportJson");
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/horse.ExportJson");
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/HeroAnimation.ExportJson");
|
||||||
|
ArmatureDataManager::getInstance()->removeArmatureFileInfo("armature/testEasing.ExportJson");
|
||||||
|
|
||||||
|
for( int i = 0; i < BINARYFILECOUNT; i++)
|
||||||
|
{
|
||||||
|
ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(m_binaryFilesNames[i], this, schedule_selector(TestLoadFromBinary::dataLoaded));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_armatureIndex = -2; // is loading
|
||||||
|
}
|
||||||
|
else if(m_armatureIndex>=0 && m_armature != NULL)
|
||||||
|
{
|
||||||
|
this->removeChild(m_armature);
|
||||||
|
m_armatureIndex = m_armatureIndex==BINARYFILECOUNT-1 ? 0 : m_armatureIndex+1;
|
||||||
|
m_armature = Armature::create(m_armatureNames[m_armatureIndex]);
|
||||||
|
m_armature->setPosition(Vec2(VisibleRect::center().x, VisibleRect::center().y));
|
||||||
|
if(m_armatureIndex == 2 ) // cowboy is 0.2
|
||||||
|
m_armature->setScale(0.2f);
|
||||||
|
m_armature->getAnimation()->playWithIndex(0);
|
||||||
|
addChild(m_armature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TestLoadFromBinary::dataLoaded( float percent )
|
||||||
|
{
|
||||||
|
Label *label = (Label *)getChildByTag(10001);
|
||||||
|
if (label)
|
||||||
|
{
|
||||||
|
char pszPercent[255];
|
||||||
|
sprintf(pszPercent, "%s %f", "Asynchronous loading: ", percent * 100);
|
||||||
|
label->setString(pszPercent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (percent >= 1)
|
||||||
|
{
|
||||||
|
label->setString("Touch to change armature");
|
||||||
|
m_armatureIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ enum {
|
||||||
TEST_PLAY_SEVERAL_MOVEMENT,
|
TEST_PLAY_SEVERAL_MOVEMENT,
|
||||||
TEST_EASING,
|
TEST_EASING,
|
||||||
TEST_CHANGE_ANIMATION_INTERNAL,
|
TEST_CHANGE_ANIMATION_INTERNAL,
|
||||||
|
TEST_DIRECT_FROM_BINARY,
|
||||||
|
|
||||||
TEST_LAYER_COUNT
|
TEST_LAYER_COUNT
|
||||||
};
|
};
|
||||||
|
@ -393,4 +394,25 @@ public:
|
||||||
void onTouchesEnded(const std::vector<Touch*>& touches, Event* event);
|
void onTouchesEnded(const std::vector<Touch*>& touches, Event* event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define BINARYFILECOUNT 6
|
||||||
|
class TestLoadFromBinary : public ArmatureTestLayer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void onEnter();
|
||||||
|
virtual std::string title() const override;
|
||||||
|
virtual std::string subtitle() const override;
|
||||||
|
|
||||||
|
void onTouchesEnded(const std::vector<Touch*>& touches, Event* event);
|
||||||
|
|
||||||
|
|
||||||
|
void dataLoaded(float percent);
|
||||||
|
|
||||||
|
private:
|
||||||
|
cocostudio::Armature *m_armature; // current armature
|
||||||
|
static const char* m_binaryFilesNames[BINARYFILECOUNT];
|
||||||
|
static const char* m_armatureNames[BINARYFILECOUNT];
|
||||||
|
int m_armatureIndex; // index of sync loaded armature, default -1 is none
|
||||||
|
};
|
||||||
|
|
||||||
#endif // __HELLOWORLD_SCENE_H__
|
#endif // __HELLOWORLD_SCENE_H__
|
||||||
|
|
Loading…
Reference in New Issue