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 為資源根目錄下的子目錄,這樣就可以分別載入某個目錄了