第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

怎么用cocos2d-x lua開發(fā)游戲?

怎么用cocos2d-x lua開發(fā)游戲?

POPMUISE 2018-12-20 14:11:26
怎么用cocos2d-x lua開發(fā)游戲
查看完整描述

1 回答

?
神不在的星期二

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊

protobuf Google的一個(gè)很好用的傳輸數(shù)據(jù)的封裝 說(shuō)實(shí)話Google的東西確實(shí)比較好用 所以我們前后端數(shù)據(jù)交換就用他了 不過(guò)Google沒(méi)有對(duì)lua進(jìn)行支持 還好社區(qū)有開源的大俠們貢獻(xiàn) 找了所有關(guān)于lua protobuf 我只找到 云風(fēng)的 pbc 修改相關(guān)cocos2d-x中的類可以正常使用。protoc-gen-lua 我在使用的時(shí)候 總是報(bào)截?cái)鄶?shù)據(jù) 在修改后cocs2d-x中的類之后沒(méi)有對(duì)protoc-gen-lua 進(jìn)行測(cè)試是否是這個(gè)問(wèn)題導(dǎo)致
1)集成 云風(fēng) 云大俠的(博客)lua-pbc 標(biāo)準(zhǔn)c寫的protobuf 具體看pbc的幫助很輕松集成
2) 生成pb文件(我自己寫了個(gè)mac中批處理生成所有.proto文件為.pb文件)把pb 和proto文件都加入到項(xiàng)目資源中
[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
#!/bin/sh
#pb = "pb"
for i in *.proto
do
#echo $i
#echo ${i%.*}".pb"
#echo ${i%.*}
#pbn = $i | cut -d.
pbname=${i%.*}".pb"
#echo $pbn
#echo $pbname
protoc --descriptor_set_out $pbname $i
done
echo "finish"
也可以用命令行手動(dòng)生成
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
protoc --descriptor_set_out aaa.pb aaa.proto
3)本步驟可以忽略了,可以直接用io進(jìn)行讀取(Android是路徑問(wèn)題請(qǐng)看本文最下面解釋)在lua中使用如下代碼(我用的是cocos2d-x中綁定的CCFileUtils中的獲取文件的方式,不過(guò)要手動(dòng)用tolua++進(jìn)行綁定到lua,可以參考我上個(gè)文章中的綁定方式,云大俠中的 用lua io形式獲取在相關(guān)了解中不能跨平臺(tái)所有就用這個(gè)了)
[javascript] view plaincopy在CODE上查看代碼片派生到我的代碼片
local protobuf = require "protobuf"
local buffer = CCFileUtils:sharedFileUtils():getFileData("entity/p_result.pb","r",0)
-- print(buffer)
protobuf.register(buffer)
4)本步驟可以忽略了,可以直接用io進(jìn)行讀?。ˋndroid是路徑問(wèn)題請(qǐng)看本文最下面解釋) 上一步完成后我們要對(duì)提到的CCFileUtils.cpp中的類進(jìn)行修改 如果不修改讀文件pb文件會(huì)時(shí)好時(shí)壞 原因是 讀文件的時(shí)候結(jié)束總是添加多余字節(jié)我也不清楚這個(gè)問(wèn)題 進(jìn)行修改cocos2d-x中CCFileUtils.cpp的下面方法中的讀取數(shù)據(jù)后處理并在tolua++ 中添加下面方法綁定到lua層
修改CCFileUtils.cp getFileData(const char* pszFileName, const char* pszMode,unsignedlong * pSize)方法(在最后添加\0,保證字節(jié)不多余)如下代碼
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
unsigned char* CCFileUtils::getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize)
{
unsigned char * pBuffer = NULL;
CCAssert(pszFileName != NULL && pSize != NULL && pszMode != NULL, "Invalid parameters.");
*pSize = 0;
do
{
// read the file from hardware
std::string fullPath = fullPathForFilename(pszFileName);
FILE *fp = fopen(fullPath.c_str(), pszMode);
CC_BREAK_IF(!fp);

fseek(fp,0,SEEK_END);
*pSize = ftell(fp);

fseek(fp,0,SEEK_SET);
pBuffer = new unsigned char[*pSize];
*pSize = fread(pBuffer,sizeof(unsigned char), *pSize,fp);
fclose(fp);

} while (0);

if (*pSize >0 && pBuffer[*pSize] != '\0')
pBuffer[*pSize] = '\0';

if (! pBuffer)
{
std::string msg = "Get data from file(";
msg.append(pszFileName).append(") failed!");

CCLOG("%s", msg.c_str());
}
return pBuffer;
}
5)經(jīng)過(guò)上一步驟lua層基本搞定可以創(chuàng)建本地的數(shù)據(jù)并encode成傳輸數(shù)據(jù)到服務(wù)器端了 如下代碼
[javascript] view plaincopy在CODE上查看代碼片派生到我的代碼片
local major = {
majorId = "795f94a9-3466-41b4-bf16-043ba8081fab"
}
local buffer = protobuf.encode("com.sj.web.proto.Major", major)
6)我們客戶端數(shù)據(jù)傳輸?shù)?a >服務(wù)器端 服務(wù)器端會(huì)返回?cái)?shù)據(jù)給我們 同樣我們接收的數(shù)據(jù)肯定也是protobuf數(shù)據(jù)了 用 protobuf.decode進(jìn)行解數(shù)據(jù)
[javascript] view plaincopy在CODE上查看代碼片派生到我的代碼片
local t = protobuf.decode("com.sj.web.proto.Result", request:getResponseString())--tolua.cast(event.dataCString))--tolua.cast(event.dataCString,"CCString"):getCString())
cclog(t)

print(t.major.gender)
print(t.major.majorId)
print(t.user.username)
7)上一步中的數(shù)據(jù)是服務(wù)器端過(guò)來(lái)的數(shù)據(jù),不過(guò)在http連接方面遇到了些小插曲
(1)我先前用的是quick-cocos2d-x-lua中封裝的CCHTTPRequest的這個(gè)進(jìn)行服務(wù)器端交互 不過(guò)不如愿 因?yàn)榉?wù)器端過(guò)來(lái)的數(shù)據(jù)中是protobuf進(jìn)行處理過(guò)的數(shù)據(jù) 在進(jìn)行調(diào)試跟蹤后發(fā)現(xiàn)過(guò)來(lái)的數(shù)據(jù)中不定什么地方都有\(zhòng)0結(jié)束符 這個(gè)導(dǎo)致直接在lua中調(diào)研CCHTTPRequest中的獲取string 方法數(shù)據(jù)被截?cái)嗖荒苷=馕?我在CCHTTPRequest::getResponseString進(jìn)行處理過(guò)來(lái)的數(shù)據(jù)處理掉\0 也不行
(2)由于項(xiàng)目中要用的短連接socket我先前已經(jīng)集成好luasocket,其實(shí)這個(gè)開源的socket很好用 也有對(duì)http的支持果斷用這個(gè)測(cè)試下服務(wù)器端回來(lái)的數(shù)據(jù) 讓我小小喜悅了一下 丟到protobuf.decode中進(jìn)行解析正是我要的數(shù)據(jù) 不過(guò)有個(gè)不好的地方 luasocket對(duì)socket有設(shè)置一個(gè)超時(shí)時(shí)間 就可以不阻塞線程 但是htpp方式我找遍了網(wǎng)站上的資料也沒(méi)找到非阻塞式的 不過(guò)這個(gè)沒(méi)關(guān)系比較可以正常跑protobuf了 集成一個(gè)線程框架就ok了呀 可以用協(xié)同線程 或者是lua llthreads 自己選擇吧如果要用 luasocket的http 先附上luasocket的http代碼
[javascript] view plaincopy在CODE上查看代碼片派生到我的代碼片
local http = require 'socket.http'
local ltn12 = require 'ltn12'
response_body = ""
request_body = ""

function http.post(u)
local t = {}
local r, c, h = http.request{
url = u,
method = "POST",
headers = {
["Content-Type"] = "application/x-protobuf",
["Content-Length"] = #request_body,
},
source = ltn12.source.string(request_body),
sink = ltn12.sink.table(t)}
return r, c, h, t
end

-- url = "http://www.baidu.com"
r,c,h,body=http.post(HTTP_URL)
print(c)
if c~= 200 then
return
end
local protobuf = require "protobuf"
local buffer = CCFileUtils:sharedFileUtils():getFileData("entity/p_result_test.pb","r",0)
-- print(buffer)
protobuf.register(buffer)

local t = protobuf.decode("com.sj.web.proto.Result", body[1])
cclog(t)

(3)不過(guò)我沒(méi)有用上面中提到的luasocket http 個(gè)人感覺(jué)還是直接用coco2d-x中的CCHttpClient比較好用也不用處理線程的東西 因?yàn)槲彝ㄟ^(guò)這個(gè)測(cè)試過(guò)c++層中protobuf進(jìn)行解析是完全沒(méi)問(wèn)題的所以我就模仿(1)中提到的CCHTTPRequest對(duì)cocos2d::extension::CCHttpClient封裝使用不過(guò)有點(diǎn)不順利數(shù)據(jù)傳到lua層還是不正常,我就進(jìn)行對(duì)\0 進(jìn)行處理 又讓我喜悅了 處理獲取的服務(wù)器數(shù)據(jù)如下
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
std::vector<char> *data = response->getResponseData();
std::stringstream mystream;
for(int i=0;i<data->size();i++){
//if ((*data) != '\0') {
mystream << (*data);
//}else{
// mystream << '\b';
//}
}
mResponseData = mystream.str();

std::cout << mystream.str() << std::endl;
CCLog("ddd:%s",mystream.str().c_str());
CCString * cstr = CCString::create(temp);
// com::sj::web::proto::Result *r = new com::sj::web::proto::Result::Result();
// r->ParseFromString(temp.c_str());
// CCLog("ParseFromString:::::::::%d %s",r->resultcode(),r->release_major()->majorcode().c_str());
CCLuaValueDict dict;
dict["request"] = CCLuaValue::ccobjectValue(this, "HTTPRequest");
dict["data"] = CCLuaValue::stringValue(mystream.str()); // 傳值回到lua層
dict["dataCString"] = CCLuaValue::ccobjectValue(cstr, "CCString");
dict["dddd"] = CCLuaValue::stringValue("dssddsdsds");

LUA_FUNCTION listener = (LUA_FUNCTION)response->getHttpRequest()->getUserData();
CCLuaStack *stack = CCLuaEngine::defaultEngine()->getLuaStack();
stack->clean();
stack->pushCCLuaValueDict(dict);
做好上一步進(jìn)行修改cocos2d-x CCLuaStack.cpp 方法pushCCLuaValue(....) 中 代碼293行代碼,修改如下(這樣做可以直接使用 lua_pushlstring(m_state, stringValue, length) 把所有數(shù)據(jù)壓到lua上層)
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
return pushString(value.stringValue().c_str(), value.stringValue().length());

完整方法代碼為:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
void CCLuaStack::pushCCLuaValue(const CCLuaValue& value)
{
const CCLuaValueType type = value.getType();
if (type == CCLuaValueTypeInt)
{
return pushInt(value.intValue());
}
else if (type == CCLuaValueTypeFloat)
{
return pushFloat(value.floatValue());
}
else if (type == CCLuaValueTypeBoolean)
{
return pushBoolean(value.booleanValue());
}
else if (type == CCLuaValueTypeString)
{
return pushString(value.stringValue().c_str(), value.stringValue().length()); //pushString(value.stringValue().c_str());
}
else if (type == CCLuaValueTypeDict)
{
pushCCLuaValueDict(value.dictValue());
}
else if (type == CCLuaValueTypeArray)
{
pushCCLuaValueArray(value.arrayValue());
}
else if (type == CCLuaValueTypeCCObject)
{
pushCCObject(value.ccobjectValue(), value.getCCObjectTypename().c_str());
}
}
好了就介紹到這里吧希望對(duì)cocos2d-x lua 開發(fā)的同行們有所幫助 如果有什么好的protobuf對(duì)cocos2d-x lua 的支持 或者是更方便的集成 也請(qǐng)貢獻(xiàn)給我一份喲 謝謝
本人用風(fēng)云的pbc 心得 總的來(lái)說(shuō)還算可以
1)浮點(diǎn)類型:java—>lua 沒(méi)問(wèn)題;lua—>java 沒(méi)通過(guò)。我們后端用的java 估計(jì)是lua對(duì)number浮點(diǎn)數(shù)類型進(jìn)行decode的 有整形進(jìn)行傳遞的時(shí)候?qū)е聸](méi)有進(jìn)行對(duì)浮點(diǎn)類型轉(zhuǎn)換(或者java對(duì)類型比較嚴(yán)格導(dǎo)致解碼的時(shí)候?qū)Ω叩匚晦D(zhuǎn)換失敗所致) 由于開發(fā)效率前后端改成string進(jìn)行傳遞(測(cè)試過(guò)protoc-gen-lua 也有這個(gè)問(wèn)題)如有朋友能使用lua—>java進(jìn)行浮點(diǎn)類型通信OK 迫切滴希望您共享我一份解決方案
2)枚舉類型 proto文件中序號(hào)從1開始計(jì)數(shù) 否則pbc pb文件加載失敗
3)上面提到的加載pb文件的時(shí)候ios win 也可以根據(jù) CCFileUtils獲取pb文件路徑后用 lua io進(jìn)行注冊(cè),測(cè)試android(我還是用上面提到的方法進(jìn)行讀文件)用這種方式?jīng)]成功 應(yīng)該是路徑和權(quán)限問(wèn)題導(dǎo)致(已經(jīng)驗(yàn)證過(guò)是android中讀取文件路徑問(wèn)題,我的方式是把proto寫到本地后lua用io進(jìn)行讀取ok)讀不到文件
[javascript] view plaincopy在CODE上查看代碼片派生到我的代碼片
local filePath = CCFileUtils:sharedFileUtils():fullPathForFilename("/entity/protobuf/p_result.pb")
local addr = io.open(filePath,"rb")
protobuffer = addr:read "*a"
addr:close()
protobuf.register(protobuffer)
最近Google產(chǎn)品及服務(wù)全面禁封 表示對(duì)國(guó)內(nèi)互聯(lián)網(wǎng)管控的表示吐槽 但是好的技術(shù)成果是無(wú)界的(我對(duì)protobuf的使用一如既往,如有想用的,請(qǐng)代理去下載吧) 對(duì)protobuf的使用總結(jié)
1)發(fā)現(xiàn)數(shù)據(jù)傳輸上字節(jié)上特別節(jié)省輕量,從這個(gè)優(yōu)勢(shì)上傳輸速度明顯快過(guò)其他如json,尤其適合游戲通信,如果是考慮到用戶通信流量及帶寬資源節(jié)省問(wèn)題可以考慮
2)一點(diǎn)不好就是客戶輸出數(shù)據(jù)不全估計(jì)是pbc反序列化優(yōu)化table對(duì)象問(wèn)題 (和后端交互數(shù)據(jù)全靠java寫的小客戶端日志輸出查看,只是為了方便查看后端返回?cái)?shù)據(jù)) 然后回lua項(xiàng)目進(jìn)行處理信息



查看完整回答
反對(duì) 回復(fù) 2019-01-11
  • 1 回答
  • 0 關(guān)注
  • 879 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)