當前位置:首頁 » 操作系統 » cocos2dx塔防源碼

cocos2dx塔防源碼

發布時間: 2023-07-04 03:25:57

『壹』 cocos2dx 3.10 事件機制

cocos2dx的事件機制里存在三類: Event、EventListener、EventDispatcher
先理解一下它們之間的關系
當我們按下按鈕時(Event),會觸發一個特定的事件(EventListener相當於回調函數),而這個特定的事件又存儲在EventDispatcher里,可能按下這個按鈕會觸發多個事件,而事件的先後就是靠EventDispatcher來決定的。

Event的相關類

當出現來自滑鼠,鍵盤,觸屏,搖桿等輸入源的輸入時,這個事實稱之為事件

引擎無時無刻都在感受事件。

Event

可以看出Event主要包含三個變數,一個是事件類型_type(也就是定義的枚舉類型:觸摸、鍵盤等),isStopped判斷事件是否停止,只要事件停止,其相關的Listener都要停止callback調用。

EventTouch
它對應於四種觸摸操作,不同的EventCode可以告訴Listener來調用不同的callback。

EventCustom
它是用戶自定義事件,userData記錄用戶自定義數據,另一個eventName是用戶給事件取的別名

上面的源碼都有英文注釋,我就不多解釋了,我只說一個最重要的_isRegistered,它判斷事件有沒有被注冊,如果沒有被注冊就不會觸發。(如何注冊事件?將事件加入dispatcher)

在講它之前,我們先了解一下它的一個重要變數。

sceneGraphListeners: 一個事件(比如說觸摸事件),需要按照一定的響應序列,依次對這些Node進行事件響應,所以該類型的事件都會綁定一個與此相關聯的node,並且 響應順序是與node在scene下的zorder相關的 。該類型下的事件優先順序統一為0。(與渲染樹有關)

fixedListeners: 優先順序根據 fixedPriority 的數值從小往大排序、

只要出現了刪除,修改,添加監聽器的時候,監聽器列表需要重新排序,都需要設置相應的 DirtyFlag 操作。但是 Cocos-2dx v3.10 裡面的 updateListeners 函數有刪除監聽器的操作,然而並沒有設置相應的 DirtyFlag 操作。
會拋出下面的異常

Gt0Index() 方法其實就是獲取到當前監聽器中 fixedPriority == 0 的監聽器在監聽器向量中的位置,它 只有在給 Listener 排序的時候會設置,但是如果更新了對應 ListenerID 的向量(EventListenerVector),但是沒有重新排序,就會出現 _gt0Index 未及時更新的情況 ,導致拋出這個異常。

引用:
Cocos2dx游戲引擎(3.x)----新的事件分發機制
cocos2dx之event事件(一)
cocos2dx之event事件(三):事件分發器EventDispatcher
Cocos2dx-v3.10 事件分發機制源碼解析

『貳』 cocos2dx 3.x版本中導入tiled地圖如何導入對象層中對象的自定義信息(源碼+注釋)

步驟如下:
1. cocos2d-x 中使用類 TMXTiledMap 創建瓦片地圖
2. 使用 TMXTiledMap 中的 getObjectGroup 介面取得對象層
3. 使用對象層的 getObject 介面獲取對象信息,對象信息是一個 ValueMap 實例
4. 從 ValueMap 中取出數據

測試地圖如下所示:

『叄』 cocos2dx-3.6的luajit怎麼了

cocos2d-x中luajit的使用

新版本的cocos2d-x使用了luajit來替代原始的lua,好處一是可以極大的提高運行速度(android下可以開jit,運行速度提高10~60倍,ios下不可以開jit,運行速度也可以提高2~3倍)。 二是luajit編譯的位元組碼現階段來說無法反編譯,也就是說無法破解。 這里對luajit進行詳細的說明。

1、基本使用。這個很簡單,不用修改任何代碼,與lua5.1完全兼容。 對應的頭文件和庫要替換成luajit的(與lua命名相同)

2、發布時編譯成位元組碼。

這個需要luajit.exe的執行文件。 編譯方法(windows): 在(http://luajit.org/download.html)下載源代碼,使用vs的命令行工具,執行msvc.bat進行編譯。 我最開始使用cygwin直接執行make結果出了很多編譯錯誤和詭異的問題。 其實直接使用批處理才是正確的方式。

編譯完成後,要注意luajit.exe和源代碼src/jit文件夾要同時並且匹配使用。否則運行時會出現 "unknown luaJIT command or jit.* moles not installed"的錯誤。

編譯成位元組碼的命令如下: luajit -b 原始文件 輸出文件

更多詳細說明可以直接執行 luajit -b來獲取。 這里還要注意,輸出文件最好保持.lua的擴展名,否則require文件的時候會提示找不到文件。除非require裡面使用的完整名字。

我在編譯位元組碼時還碰到了一個問題,就是無論編譯什麼文件都提示這個 "luajit '=' expected near '<eof>'" ,後來換了luajit的版本後就沒有出現了。可能跟我一開始手欠改了luajit源代碼有關。

3、編譯luajit的靜態庫文件(for android)

編譯位元組碼所用的執行文件和我們開發程序時使用的靜態庫文件要保持版本一致。 windows版本所需要的文件在編譯執行文件時就已經生成。

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

熱點內容
x3000r存儲卡 發布:2025-03-19 00:12:22 瀏覽:220
ie不顯示腳本錯誤 發布:2025-03-19 00:09:53 瀏覽:957
免費網頁源碼 發布:2025-03-19 00:09:00 瀏覽:261
工業企業資料庫 發布:2025-03-18 23:51:44 瀏覽:94
寶馬車的配置主要看哪些 發布:2025-03-18 23:50:09 瀏覽:484
esxi虛擬存儲 發布:2025-03-18 23:49:59 瀏覽:771
mc自己開伺服器地址 發布:2025-03-18 23:47:10 瀏覽:701
藍凌關聯配置什麼意思 發布:2025-03-18 23:46:16 瀏覽:347
雲存儲vmware 發布:2025-03-18 23:41:51 瀏覽:890
怎麼從配置模式轉到用戶模式 發布:2025-03-18 23:36:07 瀏覽:334