cocos2dx怎么遍历资源文件夹里的文件

cocos2dx怎么遍历资源文件夹里的文件,第1张

第一步在:在ZipFile添加方法,因为_dataThread是个私有的,尽量不改变源码的情况下,添加一个get方法是最好的

这个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为我们带来的性能提升!!!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8078215.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存