導航:首頁 > 廢水知識 > lua回調函數怎麼用

lua回調函數怎麼用

發布時間:2022-09-11 20:33:41

㈠ 如何使用WebSocket

WebSocket是HTML5開始提供的一種瀏覽器與伺服器間進行全雙工通訊的網路技術。在WebSocket API中,瀏覽器和伺服器只需要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
Cocos2d-x引擎集成libwebsockets,並在libwebsockets的客戶端API基礎上封裝了一層易用的介面,使得引擎在C++, JS, Lua層都能方便的使用WebSocket來進行游戲網路通訊。
引擎支持最新的WebSocket Version 13。
在C++中使用
詳細代碼可參考引擎目錄下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。
頭文件中的准備工作
首先需要include WebSocket的頭文件。
#include "network/WebSocket.h"
cocos2d::network::WebSocket::Delegate定義了使用WebScocket需要監聽的回調通知介面。使用WebSocket的類,需要public繼承這個Delegate。
class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate
並Override下面的4個介面:
virtual void onOpen(cocos2d::network::WebSocket* ws);
virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);
virtual void onClose(cocos2d::network::WebSocket* ws);
virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);
後面我們再詳細介紹每個回調介面的含義。
新建WebSocket並初始化
WebSocket.org 提供了一個專門用來測試WebSocket的伺服器"ws://echo.websocket.org"。 測試代碼以鏈接這個伺服器為例,展示如何在Cocos2d-x中使用WebSocket。
新建一個WebSocket:
cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();
init第一個參數是delegate,設置為this,第二個參數是伺服器地址。 URL中的"ws://"標識是WebSocket協議,加密的WebSocket為"wss://".
_wsiSendText->init(*this, "ws://echo.websocket.org")
WebSocket消息監聽
在調用send發送消息之前,先來看下4個消息回調。
onOpen
init會觸發WebSocket鏈接伺服器,如果成功,WebSocket就會調用onOpen,告訴調用者,客戶端到伺服器的通訊鏈路已經成功建立,可以收發消息了。
void WebSocketTestLayer::onOpen(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_sendTextStatus->setString("Send Text WS was opened.");
}
}
onMessage
network::WebSocket::Data對象存儲客戶端接收到的數據, isBinary屬性用來判斷數據是二進制還是文本,len說明數據長度,bytes指向數據。
void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data)
{
if (!data.isBinary)
{
_sendTextTimes++;
char times[100] = {0};
sprintf(times, "%d", _sendTextTimes);
std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;
log("%s", textStr.c_str());
_sendTextStatus->setString(textStr.c_str());
}
}
onClose
不管是伺服器主動還是被動關閉了WebSocket,客戶端將收到這個請求後,需要釋放WebSocket內存,並養成良好的習慣:置空指針。
void WebSocketTestLayer::onClose(network::WebSocket* ws)
{
if (ws == _wsiSendText)
{
_wsiSendText = NULL;
}
CC_SAFE_DELETE(ws);
}
onError
客戶端發送的請求,如果發生錯誤,就會收到onError消息,游戲針對不同的錯誤碼,做出相應的處理。
void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error)
{
log("Error was fired, error code: %d", error);
if (ws == _wsiSendText)
{
char buf[100] = {0};
sprintf(buf, "an error was fired, code: %d", error);
_sendTextStatus->setString(buf);
}
}
send消息到伺服器
在init之後,我們就可以調用send介面,往伺服器發送數據請求。send有文本和二進制兩中模式。
發送文本
_wsiSendText->send("Hello WebSocket, I'm a text message.");
發送二進制數據(多了一個len參數)
_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));
主動關閉WebSocket
這是讓整個流程變得完整的關鍵步驟, 當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接。close會觸發onClose消息,而後onClose裡面,我們釋放內存。
_wsiSendText->close();
在Lua中使用
詳細代碼可參考引擎目錄下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。
創建WebSocket對象
腳本介面相對C++要簡單很多,沒有頭文件,創建WebSocket對象使用下面的一行代碼搞定。 參數是伺服器地址。
wsSendText = WebSocket:create("ws://echo.websocket.org")
定義並注冊消息回調函數
回調函數是普通的Lua function,4個消息回調和c++的用途一致,參考上面的說明。
local function wsSendTextOpen(strData)
sendTextStatus:setString("Send Text WS was opened.")
end
local function wsSendTextMessage(strData)
receiveTextTimes= receiveTextTimes + 1
local strInfo= "response text msg: "..strData..", "..receiveTextTimes
sendTextStatus:setString(strInfo)
end
local function wsSendTextClose(strData)
print("_wsiSendText websocket instance closed.")
sendTextStatus = nil
wsSendText = nil
end
local function wsSendTextError(strData)
print("sendText Error was fired")
end
Lua的消息注冊不同於C++的繼承 & Override,有單獨的介面registerScriptHandler。 registerScriptHandler第一個參數是回調函數名,第二個參數是回調類型。 每一個WebSocket實例都需要綁定一次。
if nil ~= wsSendText then
wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)
wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)
wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)
wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR)
end
send消息
Lua中發送不區分文本或二進制模式,均使用下面的介面。
wsSendText:sendString("Hello WebSocket中文, I'm a text message.")
主動關閉WebSocket
當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接,以釋放伺服器和客戶端的資源。close會觸發cc.WEBSOCKET_CLOSE消息。
wsSendText:close()
在JSB中使用
詳細代碼可參考引擎目錄下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。
創建WebSocket對象
腳本介面相對C++要簡單很多,沒有頭文件,創建WebSocket對象使用下面的一行代碼搞定。 參數是伺服器地址。
this._wsiSendText = new WebSocket("ws://echo.websocket.org");
設置消息回調函數
JSB中的回調函數是WebSocket實例的屬性,使用匿名函數直接賦值給對應屬性。可以看出JS語言的特性,讓綁定回調函數更加優美。四個回調的含義,參考上面c++的描述。
this._wsiSendText.onopen = function(evt) {
self._sendTextStatus.setString("Send Text WS was opened.");
};
this._wsiSendText.onmessage = function(evt) {
self._sendTextTimes++;
var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;
cc.log(textStr);
self._sendTextStatus.setString(textStr);
};
this._wsiSendText.onerror = function(evt) {
cc.log("sendText Error was fired");
};
this._wsiSendText.onclose = function(evt) {
cc.log("_wsiSendText websocket instance closed.");
self._wsiSendText = null;
};
send消息
發送文本,無需轉換,代碼如下:
this._wsiSendText.send("Hello WebSocket中文, I'm a text message.");
發送二進制,測試代碼中,使用_stringConvertToArray函數來轉換string為二進制數據,模擬二進制的發送。 new Uint16Array創建一個16位無符號整數值的類型化數組,內容將初始化為0。然後,循環讀取字元串的每一個字元的Unicode編碼,並存入Uint16Array,最終得到一個二進制對象。
_stringConvertToArray:function (strData) {
if (!strData)
returnnull;
var arrData = new Uint16Array(strData.length);
for (var i = 0; i < strData.length; i++) {
arrData[i] = strData.charCodeAt(i);
}
return arrData;
},
send二進制介面和send文本沒有區別,區別在於傳入的對象,JS內部自己知道對象是文本還是二進制數據,然後做不同的處理。
var buf = "Hello WebSocket中文,\0 I'm\0 a\0 binary\0 message\0.";
var binary = this._stringConvertToArray(buf);
this._wsiSendBinary.send(binary.buffer);
主動關閉WebSocket
當某個WebSocket的通訊不再使用的時候,我們必須手動關閉這個WebSocket與伺服器的連接,以釋放伺服器和客戶端的資源。close會觸發onclose消息。
onExit: function() {
if (this._wsiSendText)
this._wsiSendText.close();
}

㈡ 如何把lua的函數作為回調函數當參數傳給c代碼

游戲中類似的問題很多,比如設置trigger,當玩家升級死亡的時候調用腳本函數。 初級方法,全局的LuaState,全局函數,把函數名注冊到trigger中去。 更進一步,希望支持coroutine,那麼把LuaState和ref一起注冊 注意到,在coroutine也要記錄注冊的對象,在coroutine結束的地方需要取消注冊。如果不這么做,而是武斷的:co = nilcollectgarbage 'collect'

㈢ cocos2d Android調用Lua回調函數失敗

花姑子《愛歌和鳴》:一日夫妻,豈止百日恩。看那迷霧,那寒星,那高山,那莽林,管它路轉峰迴山阻水隔,自有那身身相許的拳拳心。滴水之恩,何止報之湧泉,聽那長嚎,那呻吟,那凄泣,那悲鳴,管它情天蒼蒼恨海茫茫,自有那與共生死的殷殷情。啊,剪不斷,啊,理還亂,因為心的許、情的與,除了花前月下閨中唱酬,也會有刀風劍雨,亂紅摧折悲落英。啊,只要靈犀一點,又何論人神仙妖、狐鬼精靈。撥動心的弓弦、情的絲竹,且聽那人神共泣的愛歌和鳴。

㈣ 如何在lua中注冊回調函數給c++

干嗎不參考《lua程序設計》那本書呢?裡面有把函數封裝到一個模塊中的。 其實感覺你的目的就是有一個模塊,該模塊有函數setProperty。封裝c函數給腳本語言使用用swig也很方便 不過還是覺得奇怪,因為如果返回的是一個表的話,完全可以用一般的

㈤ lua的回調函數c++怎麼實現

如果用vc的話windows使用的是消息機制,也就是一個封裝了的回調機制

開發人員可以直接生產滑鼠單擊事件消息響應函數進行操作

㈥ 如何把lua的函數作為回調函數當參數傳給c代碼

比來一段時候在lua的消息組老是碰著如許的題目了。游戲中類似的題目很多,比如設置trigger,當玩家進級滅亡的時辰調用腳本函數。
初級辦法,全局的LuaState,全局函數,把函數名注冊到trigger中去。
更進一步,慾望支撐coroutine,那麼把LuaState和ref一路注冊
重視到,在coroutine也要記錄注冊的對象,在coroutine停止的處所須要作廢注冊。若是不這么做,而是果斷的:co = nilcollectgarbage ""collect""
此時當然會crash!

㈦ cocos2dx lua的回調函數裡面不能用self嗎

回調里的self是另一個不同的東西了,通常是觸發回調的對象,或_G 或nil ,視情況而定

正確的做法是

function MyLayer:sayFromCallback()
print('Hello~ in MyLayer:sayFromCallback')
end

function MyLayer:testCallback()
local this = self
self:runAction(cc.Sequence:create(
cc.DelayTime:create(1.0),
cc.CallFunc:create(function()
this:sayFromCallback() -- 這里this就是上面的self
end)
))
end

㈧ lua的回調函數裡面不能用self嗎

functionfun()ifa>5thenreturnelseprint(a)end只要用個return就可以了

㈨ cocos2dx lua的回調函數裡面不能用self嗎

回調里的self是另一個不同的東西了,通常是觸發回調的對象,或_G 或nil ,視情況而定

正確的做法是

function MyLayer:sayFromCallback()
print('Hello~ in MyLayer:sayFromCallback')
end

function MyLayer:testCallback()
local this = self
self:runAction(cc.Sequence:create(
cc.DelayTime:create(1.0),
cc.CallFunc:create(function()
this:sayFromCallback() -- 這里this就是上面的self
end)
))
end

閱讀全文

與lua回調函數怎麼用相關的資料

熱點內容
凈水機排水管哪裡有賣 瀏覽:870
車子不裝空調濾芯怎麼開 瀏覽:465
廢水泥廠大概有多少噸鐵 瀏覽:199
純水機沒有桶怎麼接線 瀏覽:120
廢水sup是什麼 瀏覽:300
農村污水改造有什麼要求 瀏覽:931
小蘇打的加除垢劑 瀏覽:395
南京市餐飲泔水處理 瀏覽:271
小區雨污水工程指標 瀏覽:145
小區污水管破裂怎麼辦 瀏覽:58
CADco2凈化器怎麼畫 瀏覽:429
工業污水如何提高溶解氧 瀏覽:335
飲水機後面開關松動怎麼辦 瀏覽:572
日本核污染廢水怎麼阻止 瀏覽:540
為什麼要發明空氣凈化器的原因 瀏覽:666
換過凈水器濾芯為啥有水垢 瀏覽:128
污水排放口如何規范設置 瀏覽:357
用檸檬怎樣除水垢 瀏覽:405
鍍鋅廢水能加汽車水箱 瀏覽:682
蒸餾水敷臉可以保濕嗎 瀏覽:797