国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【從零開始學(xué)Skynet】實(shí)戰(zhàn)篇《球球大作戰(zhàn)》(十二):場(chǎng)景代碼設(shè)計(jì)(上)

這篇具有很好參考價(jià)值的文章主要介紹了【從零開始學(xué)Skynet】實(shí)戰(zhàn)篇《球球大作戰(zhàn)》(十二):場(chǎng)景代碼設(shè)計(jì)(上)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

????????場(chǎng)景服務(wù)會(huì)處理絕大部分的游戲邏輯。新建service/scene/init.lua,開始編寫相關(guān)代碼。

1、Ball類

???場(chǎng)景中包含小球和食物這兩種對(duì)象,先看看小球的實(shí)現(xiàn)。代碼如下所示:
--球
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
  • 首先定義ballsballballs會(huì)以玩家id為索引,保存戰(zhàn)場(chǎng)中各個(gè)小球的信息;
  • 小球與玩家關(guān)聯(lián),它會(huì)記錄玩家id(playerid、 代理服務(wù)(agentid、代理服務(wù)所在的節(jié)點(diǎn)node;
  • 每個(gè)球都包含x坐標(biāo)、y坐標(biāo)和尺寸這三種屬性x, y, size,以及移動(dòng)速度speedxspeedy;
  • 玩家進(jìn)入戰(zhàn)場(chǎng)會(huì)新建ball對(duì)象,并為其賦予隨機(jī)的坐標(biāo)

?下圖展示了ball一些屬性的含義

?【從零開始學(xué)Skynet】實(shí)戰(zhàn)篇《球球大作戰(zhàn)》(十二):場(chǎng)景代碼設(shè)計(jì)(上)

? ?定義輔助方法balllist_msg,代碼如下所示:
--球列表
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類?

? 完成了小球類,再看看食物類。定義如下代碼 所示的 foods 表和 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_maxid1
  • 變量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)斗

? ? ? ?下圖 展示了進(jìn)入戰(zhàn)斗的流程, agent 收到 enter 協(xié)議(開始比賽, 圖中階段① )后,隨機(jī)選擇一個(gè) scene 服務(wù),給它發(fā)送 enter 消息(稍后實(shí)現(xiàn),見圖中階段② )。 scene 和客戶端的所有交互,都以 agent 作為中介。

?【從零開始學(xué)Skynet】實(shí)戰(zhàn)篇《球球大作戰(zhàn)》(十二):場(chǎng)景代碼設(shè)計(jì)(上)

?現(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ù)agentnode指玩家對(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é)議)。

???定義 輔助方法 broadcast ,代碼如下:
--廣播
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)斗?

????????當(dāng)玩家掉線時(shí),agent 會(huì)遠(yuǎn)程調(diào)用 scene 服務(wù)的 leave 方法(稍后實(shí)現(xiàn))。leave 遠(yuǎn)程調(diào)用方法,代碼如下所示:
--退出
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)

????????當(dāng)玩家要改變移動(dòng)方向時(shí),客戶端會(huì)發(fā)送shift 協(xié)議,經(jīng)由 agent 轉(zhuǎn)發(fā)(稍后實(shí)現(xiàn)),調(diào)用scene shift 方法。實(shí)現(xiàn) shift 遠(yuǎn)程調(diào)用方法,代碼如下所示:
--改變速度
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è)置它的速度。

完整代碼下載: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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【從零開始學(xué)Skynet】基礎(chǔ)篇(三):服務(wù)模塊常用API

    【從零開始學(xué)Skynet】基礎(chǔ)篇(三):服務(wù)模塊常用API

    ??????????Skynet提供了開啟服務(wù)和發(fā)送消息的API,必須要先掌握它們。列出了Skynet中8個(gè)最重要的API,PingPong程序會(huì)用到它們。 Lua API 說(shuō)明 newservice(name, ...) 啟動(dòng)一個(gè)名為 name 的新服務(wù),并返回服務(wù)的地址。 start(func) ????????用 func 函數(shù)初始化服務(wù),并將消息處理函數(shù)注

    2023年04月12日
    瀏覽(14)
  • 【從零開始學(xué)Skynet】工具篇(二):虛擬機(jī)文件的復(fù)制粘貼

    【從零開始學(xué)Skynet】工具篇(二):虛擬機(jī)文件的復(fù)制粘貼

    ????????大家在Linux系統(tǒng)下開發(fā)的時(shí)候肯定會(huì)遇到虛擬機(jī)與主機(jī)間無(wú)法復(fù)制粘貼的問(wèn)題,現(xiàn)在我們就來(lái)解決這樣的問(wèn)題,方便我們的開發(fā)。 我們可以系統(tǒng)界面的菜單欄點(diǎn)擊“控制”,然后打開“設(shè)置”; ?也可以在VirtualBox界面打開“設(shè)置”,效果都是一樣的; ?打開“設(shè)

    2023年04月19日
    瀏覽(20)
  • Python球球大作戰(zhàn)

    Python球球大作戰(zhàn)

    安裝pygame的命令: 《球球大作戰(zhàn)》是一款簡(jiǎn)單易上手、充滿趣味性和競(jìng)技性的休閑手游。游戲的核心玩法可以用一句話概括:“大球吃小球,努力生存并成為最大的球?!?游戲規(guī)則與操作 : 在《球球大作戰(zhàn)》的世界里,每位玩家操控一個(gè)可自由移動(dòng)的小球球。通過(guò)滑動(dòng)屏幕

    2024年04月17日
    瀏覽(19)
  • 從零開始:手寫 JavaScript 代碼應(yīng)用于實(shí)際場(chǎng)景

    從零開始:手寫 JavaScript 代碼應(yīng)用于實(shí)際場(chǎng)景

    ???個(gè)人主頁(yè):前端青山 ??系列專欄:JavaScript篇 ?? 人終將被年少不可得之物困其一生 依舊 青山 ,本期給大家?guī)?lái)JavaScript篇專欄內(nèi)容:JavaScript-場(chǎng)景應(yīng)用 目錄 三、場(chǎng)景應(yīng)用 1. 循環(huán)打印紅黃綠 (1)用 callback 實(shí)現(xiàn) (2)用 promise 實(shí)現(xiàn) (3)用 async/await 實(shí)現(xiàn) 2. 實(shí)現(xiàn)每隔一秒打

    2024年02月03日
    瀏覽(24)
  • 【C++/C 實(shí)現(xiàn)球球大作戰(zhàn)】

    【C++/C 實(shí)現(xiàn)球球大作戰(zhàn)】

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)——《球球大作戰(zhàn)項(xiàng)目》,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。 游戲介紹: 這是一個(gè)大球吃小球的世界,玩家的目標(biāo)是要努力吃成最大的球球。在游戲一開始,玩家出現(xiàn)在地圖上隨機(jī)

    2024年02月09日
    瀏覽(21)
  • 基于C++的簡(jiǎn)易版《球球大作戰(zhàn)》游戲設(shè)計(jì)

    基于C++的簡(jiǎn)易版《球球大作戰(zhàn)》游戲設(shè)計(jì)

    全套資料下載地址:https://download.csdn.net/download/sheziqiong/85602628 全套資料下載地址:https://download.csdn.net/download/sheziqiong/85602628 《球球大作戰(zhàn)》雖然在玩法上類似于大球吃小球的模式看起來(lái)很單薄。但是在游戲過(guò)程中會(huì)出現(xiàn)無(wú)數(shù)種意外情況,這就需要玩家運(yùn)用一系列策略來(lái)達(dá)到

    2024年02月10日
    瀏覽(17)
  • 球球大作戰(zhàn) 旋轉(zhuǎn)合球腳本 - 用于藍(lán)蝶模擬器(blueStacks5)

    球球大作戰(zhàn) 旋轉(zhuǎn)合球腳本 - 用于藍(lán)蝶模擬器(blueStacks5)

    鍵位截圖 JS代碼 下面是生成好的藍(lán)蝶腳本代碼,僅供參考

    2024年02月12日
    瀏覽(80)
  • 【從零開始學(xué)習(xí)JAVA | 第二十二篇】BigInteger

    【從零開始學(xué)習(xí)JAVA | 第二十二篇】BigInteger

    目錄 ?前言: ?BigInterger: BigInteger常見的方法: 總結(jié): ? ? ? ? 本篇我們將介紹BigInteger這個(gè)比較實(shí)用一點(diǎn)的API,這個(gè)API在我們實(shí)際寫項(xiàng)目中都是很實(shí)用的API,因此大家應(yīng)該對(duì)這個(gè)API有更加熟練的掌握。 在Java中,整數(shù)類型int和long的取值范圍是有限的,超出該范圍的整數(shù)無(wú)法

    2024年02月15日
    瀏覽(36)
  • 【區(qū)塊鏈 | 預(yù)言機(jī)】從零開始使用Chainlink預(yù)言機(jī)(2)- 智能合約中使用更安全的隨機(jī)數(shù)-代碼實(shí)戰(zhàn)

    【區(qū)塊鏈 | 預(yù)言機(jī)】從零開始使用Chainlink預(yù)言機(jī)(2)- 智能合約中使用更安全的隨機(jī)數(shù)-代碼實(shí)戰(zhàn)

    Chainlink最近推出一款革命性的產(chǎn)品,VRF—Verifiable Random Function可驗(yàn)證隨機(jī)數(shù),給智能合約帶來(lái)了真正安全的隨機(jī)數(shù)。本文我們就來(lái)介紹一下如何在智能合約中使用VRF吧。 我們先簡(jiǎn)要介紹一下Chainlink VFR的工作流程。 首先,智能合約應(yīng)用,也就是我們的Dapp,需要先發(fā)起一個(gè)獲取

    2024年02月02日
    瀏覽(29)
  • 【從零開始學(xué)習(xí)JAVA | 第三十二篇】 異常(下)新手必學(xué)!

    【從零開始學(xué)習(xí)JAVA | 第三十二篇】 異常(下)新手必學(xué)!

    目錄 前言: ?Exceptions(異常): 異常的兩大作用: 異常的處理方式: 1.JVM默認(rèn)處理 ?2.自己捕獲異常 3.拋出處理 自定義異常: 異常的優(yōu)點(diǎn): 總結(jié): ? ? ? ? 前文我們?cè)敿?xì)的為大家介紹了整個(gè)異常體系的框架,本篇我們將為大家介紹 Exceptions 異常,我們會(huì)講解他的作用以及

    2024年02月15日
    瀏覽(123)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包