一、解压资源
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 (;
{
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 刀塔传奇帖子

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