A. 【急】cocos2dx为啥无法打开包括文件:“curl/curl.h”!!!
因为你的新工程里没有把对应的include和lib添加进去。你可以参考一下tests的proporties的设置,主要是C/C++->general的Addtionnal Include Directories和Linker->Input的Addtional Libirary xxxx和你新建的工程的对应项,把curl所在的文件夹添加进去还有curl的.lib文件添加即可。
B. cocos2dx 3.2 android工程打开assets下的plist文件
你修改一下,android的assets下的文件路径应该是 file:///android_asset/文件名 这种格式
C. cocos2dx lua 代码中读取二进制文件用什么方法
如何在cocos2d c++代码中调用lua以及探究,有需要的朋友可以参考下。 如何在cocos2d c++代码中调用lua 在AppDelegate 中加入了 #include"Lua_extensions_CCB.h" #include"CCLuaEngine.h" #include"Lua_web_socket.h" 查到代码加载lua脚步引擎
D. cocos2dx下完后怎么运行
一. 启动终端(点击Finder-前往-实用工具-终端);
二.将你下载的zip包解压,mac下直接双击,放到某一文件夹下;
三.在终端上进入刚解压的文件夹,cd 到目录cocos2d-x-3.2, 然后输入如下命令运行:./setup.py;
四.输入 source /Users/HQ(你的用户名)/.bash_profile 这是用来刷新配置文件的;
五.cocos new MyProject -p com.YouCompany -l cpp -d Project/Games
注: MyProject项目名 可任意命名、com.YouCompany包名 可任意命名、Project/Games 保存文件夹路径 可任意写
运行后就创建新项目了,到xcode中打开
E. cocos2dx CCFileUtils 或者CCDictionary如何读取文件
在cocos2d-x中可以用.plist格式的文件来保存数据,它是XML文件格式的一种,在cocos2d-x解析.plist方面相关的资料比较少,但本身也很简单,要解析.plist文件可以参考cocos2d-x类库中的CCSpriteFrameCache类和CCParticleSystem类,它主要是使用CCDictionary类来对.plist文件进行操作。
下面有一个.plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>level1</key>
<dict>
<key>bg_far_scene</key>
<dict>
<key>path</key>
<string>images/far_scene.png</string>
<key>pos</key>
<string>{358, 309}</string>
</dict>
<key>bg_near_scene</key>
<dict>
<key>path</key>
<string>images/near_scene.png</string>
<key>pos</key>
<string>{360, 100}</string>
</dict>
</dict>
</dict>
</plist>
读取.plist文件的代码如下:
const char* testPlistPath = "BSPlistDatas\\test.plist";
const char* fullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativeFile("test.plist", testPlistPath);
CCDictionary* plistDic = CCDictionary::createWithContentsOfFile(testPlistPath);
CCDictionary* levelDic = dynamic_cast<CCDictionary*>(plistDic->objectForKey("level1"));
CCDictionary* farScene = dynamic_cast<CCDictionary*>(levelDic->objectForKey("bg_far_scene"));
CCString* farScenePath = dynamic_cast<CCString*>(farScene->objectForKey("path"));
CCPoint point = CCPointFromString(farScene->valueForKey("pos")->getCString());
CCLog("path = %s", farScenePath->getCString());
CCLog("pos = %f, %f", point.x, point.y);
第一行是.plist文件的相对路径,通过CCFileUtils类获得文件中绝对路径后,使用CCDictionary::createWithContensOfFile(filePath);将文件中内容加载到CCDictionary数据结构的内存中,然后通过xxxForKey获得相应的key下的value。
这里需要注意的是,当在读取'pos'的时候,它的值一个{x, y}的字符串,这是.plist文件中的数组存储规则,我们可以通过cocos2d-x提供函数api将这样的字符串转化为CCpoint对象。
CCPoint point = CCPointFromString(farScene->valueForKey("pos")->getCString());
上面这句话就是做了这样的一个转化的过程,同样的cocos2d-x还支持CCSize、CCRect的字符串的转化。他们转化的方法以及在.plist中对应的字符串格式如下:
CCPoint: CCPointFromString();{x, y}
CCSize: CCSizeFromString();{w, h}
CCRect: CCSizeFromString();{x, y, w, h}
这样我们2D游戏所初始化所需要的数据都基本上够用了,可以尝试将游戏的初始数据放在.plist中,然后修改调整数值就可以直接修改plist文件,而无需重新编译程序了,从而实现游戏数据和游戏逻辑的分离。
F. cocos2dx怎么遍历资源文件夹里的文件
第一步在:在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=0; i<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 为资源根目录下的子目录,这样就可以分别加载某个目录了