在公司看视频回放时,我就在想,这么神奇,这到底是怎么实现的?
后来看了一下代码,发现有时候你觉得非常不可思议的事,其实很简单
其实也就是服务端把相应事件的发给客户端的数据保存下来,到客户端要回放了,就去服务端下载数据,再把游戏过程的流程自动跑一遍
其中就用到了XMLHttpRequest
XMLHttpRequest中提供GET和POST两种http请求方式,
返回数据类型有以下几种:
cc.XMLHTTPREQUEST_RESPONSE_STRING = 0 -- 返回字符串类型
cc.XMLHTTPREQUEST_RESPONSE_ARRAY_BUFFER = 1 -- 返回字节数组类型
cc.XMLHTTPREQUEST_RESPONSE_BLOB = 2 -- 返回二进制大对象类型
cc.XMLHTTPREQUEST_RESPONSE_DOCUMENT = 3 -- 返回文档对象类型
cc.XMLHTTPREQUEST_RESPONSE_JSON = 4 -- 返回JSON数据类型
local xhr = cc.XMLHttpRequest:new() --http请求
xhr.responseType = cc.XMLHTTPREQUEST_RESPONSE_JSON --请求类型
local url = string.format("http://%sjson/%s.json", NetConfig_getInstance():getHttpDomain(), videoId) --服务端保存数据的位置与名称
xhr:open("GET", url)
local function onResponse()
local str = xhr.response --获得返回数据
tools.saveVideoJsonFile(videoId, str) --保存数据到本地
local playInfo = json.decode(str) --解析json文件
startPlay(playInfo) --传递数据进入下一步操作,开始进行回放
end
xhr:registerScriptHandler(onResponse) --注册脚本方式回调
xhr:send() --发送
在代码中我们可以看见我们从url的地址里获取数据,之后保存到本地,再解析运用
在这里是有服务端保存数据为json格式数据,在客户端请求获得数据,之后再进行解析
--保存本地json视频文件,传参是该视频文件名字和json字符串,直接返回的是table
function tools.saveVideoJsonFile(fileName, content)
local pathToSave = cc.FileUtils:getInstance():getWritablePath()
local f = io.open(pathToSave .. fileName .. ".json", "w")
if f then
f:write(content) --写入数据
f:close()
end
end
上面代码为保存从服务端中下载下来的数据,f文件存在就把数据写进去