1、Ball類
--球
local balls = {} --[playerid] = ball
function ball()
local m = {
playerid = nil,
node = nil,
agent = nil,
x = math.random( 0, 100),
y = math.random( 0, 100),
size = 2,
speedx = 0,
speedy = 0,
}
return m
end
- 首先定義balls表和ball類,balls表會(huì)以玩家id為索引,保存戰(zhàn)場(chǎng)中各個(gè)小球的信息;
- 小球與玩家關(guān)聯(lián),它會(huì)記錄玩家id(playerid)、 代理服務(wù)(agent)的id、代理服務(wù)所在的節(jié)點(diǎn)(node);
- 每個(gè)球都包含x坐標(biāo)、y坐標(biāo)和尺寸這三種屬性(x, y, size),以及移動(dòng)速度speedx和speedy;
- 玩家進(jìn)入戰(zhàn)場(chǎng)會(huì)新建ball對(duì)象,并為其賦予隨機(jī)的坐標(biāo)。
?下圖展示了ball類一些屬性的含義
?
--球列表
local function balllist_msg()
local msg = {"balllist"}
for i, v in pairs(balls) do
table.insert( msg, v.playerid )
table.insert( msg, v.x )
table.insert( msg, v.y )
table.insert( msg, v.size )
end
return msg
end
? 它會(huì)收集戰(zhàn)場(chǎng)中的所有小球,并構(gòu)建balllist協(xié)議。
2、Food類?
local foods = {} --[id] = food
local food_maxid = 0
local food_count = 0
--食物
function food()
local m = {
id = nil,
x = math.random( 0, 100),
y = math.random( 0, 100),
}
return m
end
- 食物類food包含id、x坐標(biāo)、y坐標(biāo)這三種屬性;
- 表foods會(huì)以食物id為索引,保存戰(zhàn)場(chǎng)中各食物的信息;
- 為給食物賦予唯一id,定義變量food_maxid,其初始值為0,每創(chuàng)建一個(gè)食物,給food_maxid加1;
- 變量food_count用于記錄戰(zhàn)場(chǎng)中食物數(shù)量,以限制食物總量。
??定義輔助方法foodlist_msg,代碼如下所示:
--食物列表
local function foodlist_msg()
local msg = {"foodlist"}
for i, v in pairs(foods) do
table.insert( msg, v.id )
table.insert( msg, v.x )
table.insert( msg, v.y )
end
return msg
end
? ?它會(huì)收集戰(zhàn)場(chǎng)中的所有食物,并構(gòu)建foodlist協(xié)議
?3、進(jìn)入戰(zhàn)斗
?
?現(xiàn)在看看scene服務(wù)的內(nèi)容,定義的enter遠(yuǎn)程調(diào)用。代碼如下所示:
--進(jìn)入
s.resp.enter = function(source, playerid, node, agent)
if balls[playerid] then
return false
end
local b = ball()
b.playerid = playerid
b.node = node
b.agent = agent
--廣播
local entermsg = {"enter", playerid, b.x, b.y, b.size}
broadcast(entermsg)
--記錄
balls[playerid] = b
--回應(yīng)
local ret_msg = {"enter",0,"進(jìn)入成功"}
s.send(b.node, b.agent, "send", ret_msg)
--發(fā)戰(zhàn)場(chǎng)信息
s.send(b.node, b.agent, "send", balllist_msg())
s.send(b.node, b.agent, "send", foodlist_msg())
return true
end
- 參數(shù)playerid指玩家id;
- 參數(shù)agent和node指玩家對(duì)應(yīng)的代理服務(wù)id及其所在的節(jié)點(diǎn);
- 參數(shù)source是消息的發(fā)送方,它等同于agent。
?實(shí)現(xiàn)了如下幾項(xiàng)功能:
(1)判定能否進(jìn)入戰(zhàn)斗場(chǎng)景:如果玩家已在戰(zhàn)場(chǎng)內(nèi),不可再次進(jìn)入,返回失敗信息(false)。
(2)創(chuàng)建ball對(duì)象:創(chuàng)建玩家對(duì)應(yīng)的ball對(duì)象,并給各個(gè)屬性賦值。
(3)向戰(zhàn)場(chǎng)內(nèi)的其他玩家廣播enter協(xié)議,說(shuō)明新的玩家到來(lái) (broadcast方法稍后實(shí)現(xiàn))。
(4)將ball對(duì)象存入balls表。
(5)向玩家回應(yīng)成功進(jìn)入的信息(enter協(xié)議),此處使 用“s.send(....,"send"....,”向agent發(fā)送消息,agent相關(guān)處理會(huì)稍后實(shí)現(xiàn)。
(6)向玩家發(fā)送戰(zhàn)場(chǎng)信息(涉及balllist協(xié)議和foodlist協(xié)議)。
--廣播
function broadcast(msg)
for i, v in pairs(balls) do
s.send(v.node, v.agent, "send", msg)
end
end
? ?用于廣播協(xié)議。它會(huì)遍歷balls表,把消息發(fā)送給每個(gè)玩家。
4、退出戰(zhàn)斗?
--退出
s.resp.leave = function(source, playerid)
if not balls[playerid] then
return false
end
balls[playerid] = nil
local leavemsg = {"leave", playerid}
broadcast(leavemsg)
end
?它會(huì)刪除與玩家對(duì)應(yīng)的小球(設(shè)置balls列表對(duì)應(yīng)id為空),并廣播leave協(xié)議。
?5、操作移動(dòng)
--改變速度
s.resp.shift = function(source, playerid, x, y)
local b = balls[playerid]
if not b then
return false
end
b.speedx = x
b.speedy = y
end
?它根據(jù)參數(shù)playerid找到與玩家對(duì)應(yīng)的小球,并設(shè)置它的速度。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-420060.html
完整代碼下載:https://gitee.com/frank-yangyu/ball-server文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-420060.html
到了這里,關(guān)于【從零開始學(xué)Skynet】實(shí)戰(zhàn)篇《球球大作戰(zhàn)》(十二):場(chǎng)景代碼設(shè)計(jì)(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!