这个getAllFile可以返回所有的文件目录
std::vector<std::string>ZipFile::getAllFile(){
std::vector<std::string>vec
ZipFilePrivate::FileListContainer::iterator it1
for(it1=_dataThread->fileList.begin()it1!=_dataThread->fileList.end()++it1) {
vec.push_back(it1->first.c_str())
}
return vec
}
第二步:使用getAllFile的返回值做遍历,这里直接帖出iOS和Android的同时遍历吧,同时搜索png和jpg的图片,可以用于加载资源,记得导入头文件
#include "support/zip_support/ZipUtils.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include <dirent.h>
#include <sys/stat.h>
#else
#include "platform/CCCommon.h"
#include "support/zip_support/unzip.h"
#include "jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"
#endif
void ResourceLoadingLayer::getAllFile(std::string folderPath,int depth, std::vector<std::string>*list, std::string head){
#if CC_PLATFORM_IOS == CC_TARGET_PLATFORM
DIR *dp
structdirent *entry
structstat statbuf
if((dp =opendir(folderPath.c_str())) ==NULL) {
fprintf(stderr,"cannot open directory: %s\n", folderPath.c_str())
return
}
chdir(folderPath.c_str())
while((entry =readdir(dp)) != NULL) {
lstat(entry->d_name,&statbuf)
if(S_ISDIR(statbuf.st_mode)) {
if(strcmp(".",entry->d_name) == 0 ||
strcmp("..",entry->d_name) ==0)
continue
getAllFile(entry->d_name,depth+4,list,head+entry->d_name)
} else {
if (head.length() ==0) {
string name = entry->d_name
if (name.length()>3 &&name.rfind(".") >0 &&(name.substr(name.rfind(".")+1,3) == "jpg" || name.substr(name.rfind(".")+1,3) == "png")) {
list->push_back(entry->d_name)
}
} else {
string filename = head+"/" +entry->d_name
if (filename.length()>3 &&filename.rfind(".") >0 &&(filename.substr(filename.rfind(".")+1,3) == "jpg" || filename.substr(filename.rfind(".")+1,3) == "png")) {
list->push_back(filename)
}
}
}
}
chdir("..")
closedir(dp)
#else
ZipFile* pFile = new ZipFile(getApkPath(),"assets/")
vector<string>vec = pFile->getAllFile()
for (int i=0i<vec.size()i++) {
string file = vec.at(i)
if (file.compare("assets/")) {
file = file.substr(7,file.length())
}
if(file.substr(0,folderPath.length()) == folderPath ){
string filename = file.substr(file.rfind("/")+1,file.length())
if (filename.length()>3 &&filename.rfind(".") >0 &&(filename.substr(filename.rfind(".")+1,3) =="jpg" || filename.substr(filename.rfind(".")+1,3) =="png") {
list->push_back(filename)
}
}
}
#endif
}
第三步,使用:
首先得拿到资源文件夹的完整路径,方法有很多,只举其一:
在HelloWorld的工程下的资源根目录有一张HelloWorld.png图片,我们可以直接获取它在程序中的完整路径,即
string fullpath = CCFileUtils::sharedFileUtils()->fullPathForFilename("HelloWorld.png")
所以 string resPath = fullpath.substr(0,fullpath.rfind("/")+1)
得到了完整的资源路径后,
vector<string>vec
getAllFile(resPath, 0, &vec, "")
这样就大功告成了,vec会保存所有的png或jpg的资源,会带head名的哦,比如说bg/welcome.jpg
上面是遍历所有的文件夹,如果单独遍历资源文件下的某个目录,即是
getAllFile(resPath+"xxx",0,&vec,"")xxx 为资源根目录下的子目录,这样就可以分别加载某个目录了
1。解压,放在一个你容易找到的位置。但是最好别是桌面。2。打开终端(Application->Utilities->Terminal应用程序->实用工具->终端)。在终端中查找到你放置cocos2d解压包的地方。3。继续输入cdCocos2d-iPhone-0.99.5(cdCocos2d-iPhone-0.99.5为解压的cocos2d文件夹名称)进入cocos2d文件夹中。4。继续输入./install-templates.sh则打开你文件夹下面的install-templates.sh进行cocos2d的安装。这样就是把工程模板文件拷贝到Xcode规定的工程模板文件目录(/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/ProjectTemplates/Application/)下。下面是说说使用方法:
(1)首先是将压缩包解压,然后打开文件夹些的Zwoptex.html网页文件,d出如下界面:
(2)然后点击File选择import images,这里我使用的是在网上别人事先做好的spritesheet
将8张bear图片加载到工程中,一开始8张图片是叠在一起的,不过不要紧,接下来就是要展开它们。显示选Modify选项,选择Canvas width,选择512px,
接着在选Arrange选择By Name&Height。最终8张图片被展开:
(3)选File按钮,选择Export Texture,并命名为AnimBea,在选Export Coordinates到处.plist文件,并命名为AnimBear,注意两者要相同名称,后面会解释原因。
现在开始,就进入写代码阶段了:
step1:创建cocos2d-x工程,并命名为animation
step2:这里我直接修改了HelloWorldScene.cpp中的init函数代码:
[cpp]
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false
}
/////////////////////////////
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it.
// add a "close" icon to exit the progress. it's an autorelease object
CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback) )
pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) )
// create menu, it's an autorelease object
CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem, NULL)
pMenu->setPosition( CCPointZero )
this->addChild(pMenu, 1)
/************************************************************************/
/* add animation */
/************************************************************************/
CCSize size = CCDirector::sharedDirector()->getWinSize()
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("AnimBear.plist")
CCSpriteBatchNode* spriteSheet = CCSpriteBatchNode::batchNodeWithFile("AnimBear.png")
addChild(spriteSheet)
CCMutableArray<CCSpriteFrame*>*walkAnimFrames = new CCMutableArray<CCSpriteFrame*>
char str[20]
for(int i = 1i <= 8i++)
{
sprintf(str, "bear%d.png", i)
walkAnimFrames->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(str))
}
CCAnimation * animation = CCAnimation::animationWithFrames(walkAnimFrames, 0.1f)
CCSprite* bear = CCSprite::spriteWithSpriteFrameName("bear1.png")
//注意这里的bear1.png是在缓存中命名的图片名称,不是Resources文件夹下的bear1.png图片
bear->setPosition(ccp(size.width / 2, size.height / 2))
CCActionInterval* walkAction = CCRepeatForever::actionWithAction(CCAnimate::actionWithAnimation(animation, false))
bear->runAction(walkAction)
spriteSheet->addChild(bear)
/**************end of adding code*********************/
return true
}
(1)缓冲sprite帧和纹理
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(AnimBear.plist)
首先,调用CCSpriteFrameCache的addSpriteFramesWithFile方法,然后把Zwoptex生成的plist文件当作参数传进去。这个方法做了以下几件事:
寻找工程目录下面和输入的参数名字一样,但是后缀是.png的图片文件。然后把这个文件加入到共享的CCTextureCache中。(这我们这个例子中,就是加载AnimBear.png,由于XNA工程的AssetName的问题,两个一样名字的文件会发生冲突(这个与文件后缀无关),所以把AnimBear.png文件放在了下一级目录中。)
解析plist文件,追踪所有的sprite在spritesheet中的位置,内部使用CCSpriteFrame对象来追踪这些信息。
(2) 创建一个精灵批处理结点
CCSpriteBatchNode* spriteSheet = CCSpriteBatchNode::batchNodeWithFile("AnimBear.png")
接下来,创建CCSpriteBatchNode对象,把spritesheet当作参数传进去。spritesheet在cocos2d中的工作原理如下:
你创建一个CCSpriteBatchNode对象,通过传递一个包含所有sprite的spritesheet的名字作为参数,并把它加入到当前场景之中。
接下来,你从spritesheet中创建的任何sprite,你应该把它当作CCSpriteBatchNode的一个孩子加进去。只要sprite包含在spritesheet中,那么就没问题,否则会出错。
CCSpriteBatchNode可以智能地遍历它的所有的孩子结点,并通过一次spriteBatch的呼叫来渲染这些孩子,而不是以前每个sprite都需要一个spriteBatch呼叫,这样渲染速度就会更快。
(3)收集帧列表
CCMutableArray<CCSpriteFrame*>*walkAnimFrames = new CCMutableArray<CCSpriteFrame*>
char str[20]
for(int i = 1i <= 8i++)
{
sprintf(str, "bear%d.png", i)
walkAnimFrames->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(str))
}
为了创建一系列的动画帧,我们简单地遍历我们的图片名字(它们是按照Bear1.png-->Bear8.png的方式命名的),然后使用共享的CCSpriteFrameCache来获得每一个动画帧。记住,它们已经在缓存里了,因为我们前面调用了addSpriteFramesWithFile方法。
(4)创建动画对象
CCAnimation * animation = CCAnimation::animationWithFrames(walkAnimFrames, 0.1f)
接下来,我们通过传入sprite帧列表来创建一个CCAnimation对象,并且指定动画播放的速度。我们使用0.1来指定每个动画帧之间的时间间隔。
(5)创建sprite并且让它运行动画
CCSprite* bear = CCSprite::spriteWithSpriteFrameName("bear1.png")
//注意这里的bear1.png是在缓存中命名的图片名称,不是Resources文件夹下的bear1.png图片
bear->setPosition(ccp(size.width / 2, size.height / 2))
CCActionInterval* walkAction = CCRepeatForever::actionWithAction(CCAnimate::actionWithAnimation(animation, false))
bear->runAction(walkAction)
spriteSheet->addChild(bear)
我们首先通过spriteframe来创建一个sprite,并把它放在屏幕中间。然后,生成CCAnimationAction,并复制给wlakAction,最后让熊来运行这个action
最后,我们把熊加个场景中--把它当作spritesheet的孩子加到spritesheet中去。注意,如果在这里我们没有把它加到spritsheet中,而是加到当前层里面的话。那么我们将得不到spritesheet为我们带来的性能提升!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)