部落战争数据破解教程

一、解压资源
1.下载部落战争的apk, 解压apk,可以下载7z压缩软件,或者后缀名改成rar解压
2.解密资源 csv logic sc 三个目录的文件是 使用修改过的 LZMA 算法压缩的。
下载 LZMA 库 因为库内容比较多,我提取出我们需要的源文件(我这边已经整理好了LZMA.zip)
你可以创建一个控制台或者直接写到cocos工程里面
添加基础函数
/----------------------LZMA Utility 范例的函数--------------------------/
static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
static void SzFree(void *p, void *address) { p = p; MyFree(address); }
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
#define IN_BUF_SIZE (1 << 16)
#define OUT_BUF_SIZE (1 << 16)
static SRes Decode2(CLzmaDec *state, ISeqOutStream *outStream, ISeqInStream *inStream,
UInt64 unpackSize)
{
int thereIsSize = (unpackSize != (UInt64)(Int64)-1);
Byte inBuf;
Byte outBuf;
size_t inPos = 0, inSize = 0, outPos = 0;
LzmaDec_Init(state);
for (;:wink:
{
if (inPos == inSize)
{
inSize = IN_BUF_SIZE;
RINOK(inStream->Read(inStream, inBuf, &inSize));
inPos = 0;
}
{
SRes res;
SizeT inProcessed = inSize - inPos;
SizeT outProcessed = OUT_BUF_SIZE - outPos;
ELzmaFinishMode finishMode = LZMA_FINISH_ANY;
ELzmaStatus status;
if (thereIsSize && outProcessed > unpackSize)
{
outProcessed = (SizeT)unpackSize;
finishMode = LZMA_FINISH_END;
}

  res = LzmaDec_DecodeToBuf(state, outBuf + outPos, &outProcessed,
    inBuf + inPos, &inProcessed, finishMode, &status);
  inPos += inProcessed;
  outPos += outProcessed;
  unpackSize -= outProcessed;
  
  if (outStream)
    if (outStream->Write(outStream, outBuf, outPos) != outPos)
      return SZ_ERROR_WRITE;
    
  outPos = 0;
  
  if (res != SZ_OK || (thereIsSize && unpackSize == 0))
    return res;
  
  if (inProcessed == 0 && outProcessed == 0)
  {
    if (thereIsSize || status != LZMA_STATUS_FINISHED_WITH_MARK)
      return SZ_ERROR_DATA;
    return res;
  }
}

}
}
static SRes Decode(ISeqOutStream outStream, ISeqInStream inStream)
{
UInt64 unpackSize;
int i;
SRes res = 0;
CLzmaDec state;
/
header: 5 bytes of LZMA properties and 8 bytes of uncompressed size /
// 这边原来是 8个字节 CoC的改掉了 变成 4 个字节
unsigned char header;
/
Read and parse header /
RINOK(SeqInStream_Read(inStream, header, sizeof(header)));
unpackSize = 0;
for (i = 0; i < 8; i++)
unpackSize += (UInt64)header << (i * 8);
LzmaDec_Construct(&state);
RINOK(LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc));
res = Decode2(&state, outStream, inStream, unpackSize);
LzmaDec_Free(&state, &g_Alloc);
return res;
}
添加解压函数进行解压
/
----------------------解压指定的coc资源函数--------------------------
/
void Export(std::string &strFileName)
{
std::string strName = strFileName.substr(m_strFromDir.size()+1);
std::string strOutName = m_strToDir + “/” + strName;

int nIndex = strName.rfind("/");
if(nIndex != -1)
{
std::string strTemp = strName.substr(nIndex+1);
strTemp = strFileName.substr(m_strFromDir.size()+1, strFileName.size()-strTemp.size()-m_strFromDir.size()-2);
strTemp = m_strToDir + “/” + strTemp;
_mkdir(strTemp.c_str());
}
CFileSeqInStream inStream;
CFileOutStream outStream;
FileSeqInStream_CreateVTable(&inStream);
File_Construct(&inStream.file);
FileOutStream_CreateVTable(&outStream);
File_Construct(&outStream.file);

InFile_Open(&inStream.file, strFileName.c_str());
OutFile_Open(&outStream.file, strOutName.c_str());
Decode(&outStream.s, &inStream.s);
File_Close(&outStream.file);
File_Close(&inStream.file);
cout << strName << endl;
}
std::string m_strToDir; // 导出的目录
std::string m_strFromDir; // CoC的资源目录
Export(“sc/building.sc”);
这边你可以写个遍历函数 遍历sc 和 csv 然后批量解压

二、文件解析
首先 sc 文件是 CoC的动画UI数据。
其中包含了 整张的图片信息,TextField,Image,Shape,MoveClip, Matrix, Color
csv表格里面有很多的ExportName SWF指的就是对应SWF(sc文件)里面的MovieClip。
TextFiled这个没去详细分析了,对我没啥用处。
Image 表示的是大图里面的一张小图。
Shape 表示的是多张小图组成的一个图片集合(后续MovieClip都是操作它)
MovieClip 是影片剪辑,包含了动画信息
Color 是颜色信息(动画用)
Matrix 是矩阵信息,仿射矩阵(动画用)
下面我们开始解析
创建好CoCSWF类 添加好元素类型枚举
// 元素类型
enum CoCSWFTagType
{
CCTT_NONE,
CCTT_Texture = 1,
CCTT_Shape = 18,
CCTT_TextField = 7,
CCTT_TextField2 = 15,
CCTT_Matrix= 8,
CCTT_ColorTransform = 9,
CCTT_MovieClip= 12,
};
class CoCSWF
{
public:
CoCSWF(void);
~CoCSWF(void);
void Reset();
virtual bool LoadFromFile(const char *pFileName)
{
std::string strName = pFileName;
int nPos = strName.find_last_of("/");
m_strFileName = strName.substr(nPos+1);
unsigned long nSize;
unsigned char *pData = CCFileUtils::sharedFileUtils()->getFileData(pFileName, “rb”, &nSize);
bool bRet = LoadFromMemory(pData);
delete ] pData;
return bRet;
}
bool LoadFromMemory(void *data)
{
Reset();
// 这边是里面每个元素的数量信息,后面可以直接获得了,所以这边我就不取出来了
int nReadPos = 0;
nReadPos += 12;
nReadPos += 5;

    unsigned short nExportCount; // 导出符号的数量
    Utility_ReadValue(&nExportCount, data, &nReadPos);
    unsigned short *nIDs = new unsigned short; // 导出符号的ID数组
    Utility_ReadData(nIDs, data, nExportCount*2, &nReadPos);
    char *pName = new char;
    m_ExportIDs.resize(nExportCount);
    m_ExportNames.resize(nExportCount);
    m_ExportMovieClip.resize(nExportCount);
    // 导出符号的名字 数组
    for(short i = 0; i < nExportCount; i++)
    {
        Utility_ReadNameChar(&pName, data, &nReadPos);
        m_ExportNames* = pName;
        m_ExportIDs* = nIDs*;
        m_mapExportIndex] = i;
    }
    delete ] pName;
    
    char cTag; // 元素ID
    unsigned int nLength; // 元素的数据长度
    int nID = -1;
    // 下面是解析sc文件里面的所有元素
    std::map<int, int> mapTag;
    do
    {
        Utility_ReadValue(&cTag, data, &nReadPos); // 读取类型
        Utility_ReadValue(&nLength, data, &nReadPos); // 读取长度
        // 表示结尾后面没有元素了
        if(cTag == 0)
            break;
        
        int nDataPos = nReadPos;
        // 跳过总长度
        nReadPos+=nLength;
        // 针对不同格式解析
        switch(cTag)
        {
        case CCTT_Texture:
            {
                CoCElementTexture *pElement = new CoCElementTexture();
                pElement->Parse((char*)data+nDataPos, this);
                m_vecTextures.push_back(pElement);
                break;
            }
        case CCTT_Matrix:
            {
                CoCElementMatrix *pElement = new CoCElementMatrix();
                pElement->Parse((char*)data+nDataPos, this);
                m_vecMatrix.push_back(pElement);
                break;
            }
        case CCTT_ColorTransform:
            {
                CoCElementColorTransform *pElement = new CoCElementColorTransform();
                pElement->Parse((char*)data+nDataPos, this);
                m_vecColorTransform.push_back(pElement);
                break;
            }
        case CCTT_Shape:
            {
                CoCElementShape *pElement = new CoCElementShape();
                pElement->Parse((char*)data+nDataPos, this);
                m_vecShap.push_back(pElement);
                m_mapShapIndex = m_vecShap.size()-1;
                break;
            }
        case CCTT_MovieClip:
            {
                CoCElementMovieClip *pElement = new CoCElementMovieClip();
                pElement->Parse((char*)data+nDataPos, this);
                m_vecMovieClip.push_back(pElement);
                unsigned nIndex = GetMovieClipIndexByID(pElement->GetID());
                if(nIndex != (unsigned short)-1)
                {
                    m_ExportMovieClip = pElement;
                }
                break;
            }
        }
        mapTag++;
    }while(1);
    return true;
}

private:
std::vector<CoCElementTexture*> m_vecTextures;
std::vector<CoCElementMatrix*> m_vecMatrix;
std::vector<CoCElementColorTransform*> m_vecColorTransform;
std::vector<CoCElementShape*> m_vecShap;
std::vector<CoCElementMovieClip*> m_vecMovieClip;
std::vector m_ExportIDs;
std::vectorstd::string m_ExportNames;
std::vector<CoCElementMovieClip*> m_ExportMovieClip;
std::map<unsigned short, unsigned short> m_mapExportIndex;
std::map<unsigned short, unsigned short> m_mapShapIndex;
std::map<unsigned short, unsigned short> m_mapTextFiledIndex;
std::string m_strFileName;
};

// 创建对应元素的解析类
// 基础元素类
class CoCElement
{
public:
CoCElement(void){};
~CoCElement(void){};
virtual bool Parse(void *data, CoCSWF *pSWF) = 0;
};
派生出各个元素的类(这边解析好的数据,后面cocos渲染的时候要共享数据的,这样节省内存空间)
纹理解析类 CoCElementTexture
#define TextureFormat_ARGB8888 0
#define TextureFormat_ARGB4444 2
#define TextureFormat_BGR565 4
class CoCElementTexture :
public CoCElement
{
public:
CoCElementTexture(void);
~CoCElementTexture(void);

virtual bool Parse(void *data, CoCSWF pSWF)
{
int nDataPos = 0;
Utility_ReadValue(&m_cTextureFormat, data, &nDataPos);
Utility_ReadValue(&m_nWidth, data, &nDataPos);
Utility_ReadValue(&m_nHeight, data, &nDataPos);
m_pTexture = new CCTexture2D();
m_pTexture->initWithData((char
)data + nDataPos, GetTextureFormat(), m_nWidth, m_nHeight, CCSizeMake(m_nWidth, m_nHeight));
return true;
}
int GetTextureBpp()
{
switch(m_cTextureFormat)
{
case TextureFormat_ARGB8888:
return 32;
case TextureFormat_ARGB4444:
case TextureFormat_BGR565:
return 16;
}
return -1;
}
CCTexture2DPixelFormat GetTextureFormat()
{
switch(m_cTextureFormat)
{
case TextureFormat_ARGB8888:
return kTexture2DPixelFormat_RGBA8888;
case TextureFormat_ARGB4444:
return kTexture2DPixelFormat_RGBA4444;
case TextureFormat_BGR565:
return kTexture2DPixelFormat_RGB565;
}
return kCCTexture2DPixelFormat_Default;
}
int GetDataSize()
{
return m_nWidth * m_nHeight * GetTextureBpp() / 8;
}
unsigned short GetWidth()
{
return m_nWidth;
}
unsigned short GetHeight()
{
return m_nHeight;
}
CCTexture2D *getTexture() { return *m_pTexture; }
private:
char m_cTextureFormat; // 纹理格式
unsigned short m_nWidth;
unsigned short m_nHeight;
CCTexture2D *m_pTexture;
};
颜色矩阵解析类 CoCElementColorTransform
struct ColorTransform {
char rm, gm, bm, am;
char ra, ga, ba;
};
class CoCElementColorTransform :
public CoCElement
{
public:
CoCElementColorTransform(void);
~CoCElementColorTransform(void);

bool CoCElementColorTransform::Parse(void *data, CoCSWF *pSWF)
{  
    int nDataPos = 0;
    ColorTransform colorTrans;
    Utility_ReadValue(&colorTrans, data, &nDataPos);
    m_Color.r = colorTrans.ra;
    m_Color.g = colorTrans.ga;
    m_Color.b = colorTrans.ba;
    m_Color.a = colorTrans.am;
    return true;
}
// 这边返回的是指针,共享的时候使用
ccColor4B *CoCElementColorTransform::GetColor()
{
    return &m_Color;
}

private:
ccColor4B m_Color;
};
// 矩阵解析类
class CoCElementMatrix :
public CoCElement
{
public:
CoCElementMatrix(void);
~CoCElementMatrix(void);

bool Parse(void *data, CoCSWF *pSWF)
{  
    int nDataPos = 0;
    MATRIX trans;
    Utility_ReadValue(&trans, data, &nDataPos);
    
    m_trans.a = trans.a / 1024.0f;
    m_trans.b = trans.b / 1024.0f;
    m_trans.c = trans.c / 1024.0f;
    m_trans.d = trans.d / 1024.0f;
    m_trans.tx = trans.tx / 20.0f;
    m_trans.ty = trans.ty / -20.0f;
    return true;
}
CCAffineTransform *GetMatrix()
{
    return &m_trans;
}

private:
CCAffineTransform m_trans;
};
// 图元解析类
struct ShapInfo
{
char textureID; // 此图元的纹理ID号
char count; // 顶点的数量
ccV3F_C4B_T2F *vertex;
};
class CoCElementShape :
public CoCElement
{
public:
CoCElementShape(void);
~CoCElementShape(void);

bool Parse(void *data, CoCSWF *pSWF)
{  
    int nDataPos = 0;
    unsigned short m_nCommandCount;
    Utility_ReadValue(&m_nID, data, &nDataPos);
    Utility_ReadValue(&m_nCommandCount, data, &nDataPos);
        
    unsigned short nVertxtCount;
    Utility_ReadValue(&nVertxtCount, data, &nDataPos);
    m_pVertex = new ccV3F_C4B_T2F;
    ccV3F_C4B_T2F *pVertex = m_pVertex;
    m_vecShaps.resize(m_nCommandCount);
    
    int nTotalCount = 0;
    for(unsigned short i = 0; i < m_nCommandCount; i++)
    {
        char cType;
        Utility_ReadValue(&cType, data, &nDataPos);
        int nLength;
        Utility_ReadValue(&nLength, data, &nDataPos);
        ShapInfo &shaps = m_vecShaps*;
        Utility_ReadValue(&shaps.textureID, data, &nDataPos);
        char cPointCount;
        Utility_ReadValue(&cPointCount, data, &nDataPos);
        shaps.vertex = pVertex;
        shaps.count = cPointCount;
        nTotalCount += cPointCount;
        CoCElementTexture *pTexture = pSWF->GetTexture(shaps.textureID);
        unsigned short nWidth = pTexture->GetWidth();
        unsigned short nHeight = pTexture->GetHeight();
        
        for(int j = 0; j < cPointCount; j++)
        {
            pVertex.vertices.x = *((int*)((char*)data+nDataPos)) / 20.0f;
            pVertex.vertices.y = *((int*)((char*)data+nDataPos)+1) / -20.0f;
            pVertex.vertices.z = 0.0f;
            nDataPos += 8;
            pVertex.colors.a = 255;
            pVertex.colors.r = 255;
            pVertex.colors.g = 255;
            pVertex.colors.b = 255;
        }
        for(int j = 0; j < cPointCount; j++)
        {
            pVertex.texCoords.u = *((short*)((char*)data+nDataPos)) / (nWidth*1.0f);
            pVertex.texCoords.v = *((short*)((char*)data+nDataPos)+1) / (nHeight*1.0f);
            nDataPos += 4;
        }
        pVertex = pVertex + cPointCount;
    }
    assert(nTotalCount == nVertxtCount);
    return true;
}
ShapInfo GetShapInfo(int nIndex)
{
    if(nIndex >= m_vecShaps.size())
    {
        return NULL;
    }
    return &m_vecShaps;
}
int GetShapsCount()
{
    return m_vecShaps.size();
}
unsigned short GetID()
{
    return m_nID;
}

private:
unsigned short m_nID;
std::vector m_vecShaps;
ccV3F_C4B_T2F *m_pVertex;
};
// 影片剪辑 解析类
// 帧信息结构体
struct FrameInfo
{
int nFrameIndex;
int Zorder;
unsigned short nShapeIndex; // 图元索引
CCAffineTransform *trans; // 矩阵
ccColor4B *color; // 颜色
};
class CoCElementMovieClip :
public CoCElement
{
public:
CoCElementMovieClip(void);
~CoCElementMovieClip(void);

bool Parse(void *data, CoCSWF *pSWF)
{  
    int nDataPos = 0;
    Utility_ReadValue(&m_nID, data, &nDataPos); 
    Utility_ReadValue(&m_cFrameRate, data, &nDataPos);
    Utility_ReadValue(&m_nFrameCount, data, &nDataPos); 
    unsigned short nFrameInfoCount;
    Utility_ReadValue(&nFrameInfoCount, data, &nDataPos);
    nDataPos+=2;
    m_vecFrameInfo.resize(nFrameInfoCount);
    // 解析帧信息
    for(int i = 0; i < nFrameInfoCount; i++)
    {
        FrameInfo &info = m_vecFrameInfo*; 
        Utility_ReadValue(&info.nShapeIndex, data, &nDataPos);
        
        unsigned short nIndex;
        Utility_ReadValue(&nIndex, data, &nDataPos);
        if(pSWF->GetTrans(nIndex))
            info.trans = pSWF->GetTrans(nIndex)->GetMatrix();
        else
            info.trans = NULL;  
        Utility_ReadValue(&nIndex, data, &nDataPos);
        if(pSWF->GetColor(nIndex))
            info.color = pSWF->GetColor(nIndex)->GetColor();
        else
            info.color = NULL;
    }
    // 解析使用到的图元数组
    unsigned short nCount;
    Utility_ReadValue(&nCount, data, &nDataPos);
    if(nCount > 0)
    {
        m_vecShapeID.resize(nCount);
        Utility_ReadData(&m_vecShapeID, data, nCount*sizeof(unsigned short), &nDataPos);
        for(int i = 0; i < nCount; i++)
        {
            int nID = m_vecShapeID*;;
            nID = nID;
        }
    }
    nDataPos+=nCount;
    // 这一段跟文字相关暂时用不到,但是也要解析过去
    for(int i = 0; i < nCount; i++)
    {
        char cNameLength;
        Utility_ReadValue(&cNameLength, data, &nDataPos);
        if(cNameLength != -1)
        {
            nDataPos+=cNameLength;
        }
    }
    // 动画数据,第几针使用哪些 关键帧
    for(int i = 0; i < m_nFrameCount; i++)
    {
        nDataPos += 1;
        int nLength;
        Utility_ReadValue(&nLength, data, &nDataPos);
        unsigned short nNum;
        Utility_ReadValue(&nNum, data, &nDataPos);
        m_vecAnimationInfo.push_back(nNum);
        nDataPos -= 2;
        nDataPos += nLength;
    }
        
    return true;
}
unsigned short GetID()
{
    return m_nID;
}
std::vector<unsigned short> &GetShapes()
{
    return m_vecShapeID;
}
char GetFrameRate()
{
    return m_cFrameRate;
}
unsigned short GetFrameCount()
{
    return m_nFrameCount;
}
std::vector<FrameInfo> &GetFrameInfo()
{
    return m_vecFrameInfo;
}
std::vector<unsigned short> &GetAnimationInfo()
{
    return m_vecAnimationInfo;
}

private:
unsigned short m_nID;
char m_cFrameRate;
unsigned short m_nFrameCount;
std::vector m_vecShapeID;
std::vector m_vecFrameInfo;
std::vector m_vecAnimationInfo;
};

三、Image实现*****
图片类的实现
我们前面已经把所有的格式都解析好
现在需要实现cocos的动画
首先最终要的是图片的实现,他这边采用的是,直接绘制顶点的方式来实现的,所以我们需要自己实现这个类
这个类是参考了一下 CCSprite 的实现写的, 关键代码是 draw 函数
class CoCImageNode : public CCNode
{
protected:
GLuint m_uVao;
GLuint m_uVbo;

    GLsizei         m_nBufferCount;
    ccV3F_C4B_T2F   *m_pBuffer;
    
    ccBlendFunc     m_sBlendFunc;
    
public:
CoCImageNode* create(int count, ccV3F_C4B_T2F* vertex, CCTexture2D *pTexture)
{
    CoCImageNode* pRet = new CoCImageNode();
    if (pRet && pRet->initWithData(count, vertex, pTexture))
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    
    return pRet;
}

// 创建的时候把 对应的 顶点数据,还有纹理传递进去
bool initWithData(int count, ccV3F_C4B_T2F *vertex, CCTexture2D *pTexture)
{    
    setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor));
    m_nBufferCount = count;
    m_pBuffer = vertex;
    m_pobTexture = pTexture;
    m_colors = ccc4(255, 255, 255, 255);
    updateBlendFunc();
    return true;
}
// 渲染三角形
void draw()
{
    if(!m_bVisible)
        return ;
    
    CC_NODE_DRAW_SETUP();
    ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst );
    ccGLBindTexture2D( m_pobTexture->getName() );
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );
    for(int i = 0; i < m_nBufferCount; i++)
    {
        m_pBuffer*.colors = m_colors;
    }
    
    long offset = (long)m_pBuffer;
    // vertex
    int diff = offsetof( ccV3F_C4B_T2F, vertices);
    glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (void*) (offset + diff));
    // texCoods
    diff = offsetof( ccV3F_C4B_T2F, texCoords);
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (void*)(offset + diff));
    // color
    diff = offsetof( ccV3F_C4B_T2F, colors);
    glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (void*)(offset + diff));
    // 采用三角形扇的方式渲染
    glDrawArrays(GL_TRIANGLE_FAN, 0, m_nBufferCount);
}
ccBlendFunc getBlendFunc()
{
    return m_sBlendFunc;
}
void setBlendFunc(ccBlendFunc blendFunc)
{
    m_sBlendFunc = blendFunc;
}
void setColor(ccColor4B color)
{
    m_colors = color;
}
void setTexture(CCTexture2D *texture)
{
    m_pobTexture = texture;
    updateBlendFunc();
}
CCTexture2D* getTexture(void)
{
    return m_pobTexture;
}
void updateBlendFunc(void)
{
    m_sBlendFunc.src = GL_SRC_ALPHA;
    m_sBlendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
}

private:
ccColor4B m_colors;
private:
CCTexture2D *m_pobTexture;
};
// 一般我们自己写扩展的时候,需要对cocos的一些渲染机制熟练一些。我们就可以好扩展这些东西了

四、Shape实现*
这边我们需要实现 Shape 节点,主要是 作为拼好的图片,
我们后续的动画都是通过操作这个的,这个相对简单一些,
只要把 对应的图片加载进来就好了
class CoCImageNode;
class CoCShapeNode : public CCNode
{
public:
virtual ~CoCShapeNode();
CoCShapeNode();
CoCShapeNode* create()
{
CoCShapeNode* pRet = new CoCShapeNode();
if (pRet && pRet->init())
{
pRet->autorelease();
}
else
{
CC_SAFE_DELETE(pRet);
}

    return pRet;
}
// 设置图元颜色值
void setColor(ccColor4B color)
{
    m_colors = color;
    for(int i = 0; i < m_vecImage.size(); i++)
    {
        m_vecImage*->setColor(m_colors);
    }
}*
// 添加散图
void addImage(CoCImageNode *pImage)
{
    addChild(pImage);
    m_vecImage.push_back(pImage);
}

private:
ccColor4B m_colors;
std::vector<CoCImageNode*> m_vecImage;
};

五、MovieClip实现
影片剪辑类的实现,主要是处理 动画的播放(矩阵刷新和颜色值变化)图片的显示隐藏
class CoCMovieClipNode : public CCNode
{
public:
static CoCMovieClipNode* create(char cFrameRate, unsigned short nFrameCount);
virtual ~CoCMovieClipNode();
CoCMovieClipNode();

// 创建一个空白影片剪辑
static CoCMovieClipNode* create(char cFrameRate, unsigned short nFrameCount)
{
    CoCMovieClipNode* pRet = new CoCMovieClipNode();
    if (pRet && pRet->initWithData(cFrameRate, nFrameCount))
    {
        pRet->autorelease();
    }
    else
    {
        CC_SAFE_DELETE(pRet);
    }
    
    return pRet;
}
bool initWithData(char nFrameRate, unsigned short nFrameCount)
{    
    //CCSprite::initWithTexture(pTexture);
    // shader program
    m_pShapeRoot = CCNode::create();
    addChild(m_pShapeRoot);
    m_nFrameCount = nFrameCount;
    m_cFrameRate = nFrameRate;
    m_vecFrameInfo.resize(nFrameCount);
    m_nCurrentFrame = 0;
    // 启动刷新帧
    schedule(schedule_selector(updateFrame), 1.0f / nFrameRate);
    return true;
}

// 添加图元
void AddShapdeNode(CoCShapeNode *pNode)
{
    if(pNode)
        m_pShapeRoot->addChild(pNode);
    m_vecShapNode.push_back(pNode);
}

// 添加关键帧
void AddFrameInfo(int nFrameIndex, FrameInfo *pInfo)
{
    m_vecFrameInfo.push_back(pInfo);
}
// 刷新帧
void updateFrame(float ft)
{
    if(m_nCurrentFrame >= m_nFrameCount)
        m_nCurrentFrame = 0;
    for(int i = 0; i < m_vecShapNode.size(); i++)
    {
        if(m_vecShapNode*)
            m_vecShapNode*->setVisible(false);
    }**
    if(m_nCurrentFrame >= m_vecFrameInfo.size())
        return ;
    
    std::vector<FrameInfo*> &FrameInfo = m_vecFrameInfo;
    for(int i = 0; i < FrameInfo.size(); i++)
    {
        CoCShapeNode *pShapeNode = m_vecShapNode->nShapeIndex];
        if(pShapeNode)
        {
            pShapeNode->setVisible(true);
            // 设置额外仿射矩阵
            if(FrameInfo*->trans != NULL)
                pShapeNode->setAdditionalTransform(*FrameInfo*->trans);
            else
                pShapeNode->setAdditionalTransform(CCAffineTransformIdentity);
            // 设置颜色值变化
            if(FrameInfo*->color != NULL)
                pShapeNode->setColor(*FrameInfo*->color);
            else
                pShapeNode->setColor(ccc4(255, 255, 255, 255));
        }
        else
        {
            pShapeNode = pShapeNode;
        }
    }
    m_nCurrentFrame++;
}****

private:
CCNode m_pShapeRoot;
private:
char m_cFrameRate;
unsigned short m_nFrameCount;
unsigned short m_nCurrentFrame;
std::vector<CoCShapeNode
> m_vecShapNode;
std::vector<std::vector<FrameInfo*>> m_vecFrameInfo;
};

六、SWF实现创建影片剪辑
这边我们需要使用CoCSWF 来调度影片剪辑
我们需要提供接口给外部使用
创建影片剪辑的接口,还有创建图元的接口
只需要加到第2章节的代码里面就可以了,我贴上关键代码
CoCShapeNode *CoCSWF::CreateShapeNodeByIndex(int nIndex)
{
CoCShapeNode *pRoot = CoCShapeNode::create();
if(nIndex >= m_vecShap.size())
return NULL;
CoCElementShape *pShap = m_vecShap;
for(int i = 0; i < pShap->GetShapsCount(); i++)
{
ShapInfo &info = *pShap->GetShapInfo(i);
CoCImageNode *pNode = CoCImageNode::create(info.count, info.vertex, GetTexture(info.textureID)->getTexture());
pRoot->addImage(pNode);
}
return pRoot;
}
CoCMovieClipNode *CoCSWF::CreateMovieClipByIndex(int nIndex)
{
CoCElementMovieClip *pMovieClip = m_ExportMovieClip;
if(!pMovieClip)
return NULL;
CoCMovieClipNode *pNode = CoCMovieClipNode::create(pMovieClip->GetFrameRate(), pMovieClip->GetFrameCount());

if(pMovieClip == NULL)
return pNode;

std::vector &vecFrameInfo = pMovieClip->GetFrameInfo();
std::vector &vecAnimation = pMovieClip->GetAnimationInfo();
int nFrameIndex = 0;
for(int i = 0; i < vecAnimation.size(); i++)
{
for(int j = 0; j < vecAnimation*; j++)
{
pNode->AddFrameInfo(i, &vecFrameInfo);
}
}
std::vector &vecShapeID = pMovieClip->GetShapes();
for(int i = 0; i < vecShapeID.size(); i++)
{
int nID = vecShapeID*;
CoCShapeNode *pShapeNode = (CoCShapeNode *)CreateShapeNodeByID(nID);
pNode->AddShapdeNode(pShapeNode);
}
pNode->updateFrame(0.0f);
return pNode;

根据以上资料就可以写出 对应的东西了,下面我提供一下我的,查看器截图
查看器下载地址:http://pan.baidu.com/s/1mgGDXhA**
补丁地址:http://pan.baidu.com/s/1wF9l8 // 修复导出没有设置锚点问题
如果无法打开自行下载 vs2010的动态库。

友情连接:http://www.cocoachina.com/bbs/read.php?tid-219173.html 刀塔传奇帖子

:8::8:

很好 J神我偶像啊

遗憾 沙发没有占到啊 J神 我是卖呆 支持一下了

求收徒弟啊。:8:

smart!!!

:12:只有我的关注点是加班审批嘛

我后续会送上cocos实现的,代码详解,敬请期待

好帖,mark

代码到时候会在官网主页上的。呵呵==、 有个coc专栏

你代码中的解析方法是不是只针对sc文件的?csv文件不用解析吗?还是只要解析所有的SC文件就ok了?求大神指导。