【从零开始学Skynet】实战篇《球球大作战》(十二):场景代码设计(上)

news2024/11/25 14:07:11
        场景服务会处理绝大部分的游戏逻辑。新建service/scene/init.lua,开始编写相关代码。

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
  • 首先定义ballsballballs会以玩家id为索引,保存战场中各个小球的信息;
  • 小球与玩家关联,它会记录玩家id(playerid、 代理服务(agentid、代理服务所在的节点node
  • 每个球都包含x坐标、y坐标和尺寸这三种属性x, y, size,以及移动速度speedxspeedy;
  • 玩家进入战场会新建ball对象,并为其赋予随机的坐标

 下图展示了ball一些属性的含义

 

   定义辅助方法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

  它会收集战场中的所有小球,并构建balllist协议。

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包含idx坐标y坐标这三种属性;
  • foods会以食物id为索引,保存战场中各食物的信息;
  • 为给食物赋予唯一id,定义变量food_maxid,其初始值为0,每创建一个食物,给food_maxid1
  • 变量food_count用于记录战场中食物数量,以限制食物总量。

  定义辅助方法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

   它会收集战场中的所有食物,并构建foodlist协议

 3、进入战斗

       下图 展示了进入战斗的流程, agent 收到 enter 协议(开始比赛, 图中阶段① )后,随机选择一个 scene 服务,给它发送 enter 消息(稍后实现,见图中阶段② )。 scene 和客户端的所有交互,都以 agent 作为中介。

 

 现在看看scene服务的内容,定义的enter远程调用。代码如下所示:

--进入
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
    --回应
    local ret_msg = {"enter",0,"进入成功"}
    s.send(b.node, b.agent, "send", ret_msg)
    --发战场信息
    s.send(b.node, b.agent, "send", balllist_msg())
    s.send(b.node, b.agent, "send", foodlist_msg())
    return true
end
  • 参数playerid指玩家id
  • 参数agentnode指玩家对应的代理服务id及其所在的节点;
  • 参数source是消息的发送方,它等同于agent
   

 实现了如下几项功能:

(1)判定能否进入战斗场景:如果玩家已在战场内,不可再次进入,返回失败信息(false)。

(2)创建ball对象:创建玩家对应的ball对象,并给各个属性赋值。

(3)向战场内的其他玩家广播enter协议,说明新的玩家到来 (broadcast方法稍后实现)。

(4)ball对象存入balls表。

(5)向玩家回应成功进入的信息(enter协议),此处使 用“s.send(....,"send"....agent发送消息,agent相关处理会稍后实现。

(6)向玩家发送战场信息(涉及balllist协议和foodlist协议)。

   定义 辅助方法 broadcast ,代码如下:
--广播
function broadcast(msg)
    for i, v in pairs(balls) do
        s.send(v.node, v.agent, "send", msg)
    end
end

   用于广播协议。它会遍历balls,把消息发送给每个玩家。

4、退出战斗 

        当玩家掉线时,agent 会远程调用 scene 服务的 leave 方法(稍后实现)。leave 远程调用方法,代码如下所示:
--退出
s.resp.leave = function(source, playerid)
    if not balls[playerid] then
        return false
    end
    balls[playerid] = nil

    local leavemsg = {"leave", playerid}
    broadcast(leavemsg)
end

 它会删除与玩家对应的小球(设置balls列表对应id为空),并广播leave协议。

 5、操作移动

        当玩家要改变移动方向时,客户端会发送shift 协议,经由 agent 转发(稍后实现),调用scene shift 方法。实现 shift 远程调用方法,代码如下所示:
--改变速度
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

 它根据参数playerid找到与玩家对应的小球,并设置它的速度。

完整代码下载:https://gitee.com/frank-yangyu/ball-server

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目打包记录提交id

某天上午正在摸鱼的小邓,突然被领导拉倒一个2年前项目的现场问题沟通群,说是现场数据无法入库,需要排查,奈何不知道版本,无奈的小邓值得用时间记录一个点一个点的从gitlab中查找,为了防止后续提供到现场的版…

【蓝桥杯嵌入式】蓝桥杯嵌入式2023年第十四届省赛真题解答

目录 0 题目介绍 1 题目分析 2 Cubemx配置 4 代码 5 效果显示 0 题目介绍 具体要求如下图 1 题目分析 拿到题目咋一看,就是基本操作,实际做起来一堆定时器操作,很容易把人绕晕。 首先看看需要用到的外设 1. GPIO(key/led) 2.LCD 3…

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象,基本步骤包括: 1)准备Request对象2)准备请求参数3)发起请求4)解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读: 第一步…

Downie4如何使用?Downie4最常用的几种下载方法

Downie 4是一款流行的 Mac 视频下载工具,可让您从各种网站下载视频,包括 YouTube、Vimeo、Twitter 等。但是Downie有多少种下载视频的方法你知道吗?接下来为大家带来最常用的几种下载方法,欢迎大家点赞收藏! 拖链接下载…

〖Python网络爬虫实战①〗- HTTP原理

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费…

道路病害识别领域创新产品RADSDS系统让道路检测更高效更实用

自从我国公路总里程数居世界第一,道路养护成为交通运维工作的重要环节。公路养护维修工作的开展,离不开对公路客观状况的检测。以往,我国依靠人工步行完成这项工作,不但干扰公路上车辆的正常通行,对检测人员安全不利&a…

【Linux】来写一个udp的服务端+客户端

来写一个udp的代码 1.socket编程接口 // 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); // 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len); // 开始…

个人邮箱与企业邮箱的区别有哪些?如何选择?

很多用户不了解企业邮箱,认为使用个人邮箱完全可以满足需求,其实这都是错误的观点,企业邮箱不同于个人邮箱,企业邮箱更适于商务应用的邮箱。今天就简单的做个对比。 个人邮箱与企业邮箱的区别: 1、企业形象 企业邮箱&…

STC单片机DS1307+ssd1306 oled时钟显示

STC单片机DS1307+ssd1306 oled时钟显示 📌相关篇《STC单片机DS1302+ssd1306 oled时钟显示》📍《STC单片机对DS1307读写操作》✨效果演示: 🌿实验对象:STC12C5A60S2🌿屏幕型号:I2C ssd1306 0.96“ oled🌿晶振频率:11.059MHz🌿串口波特率:9600📜串口打印读取信…

rk3568 点亮HDMI

rk3568 Android11/12 适配HDMI HDMI(High-Definition Multimedia Interface)是一种数字化音视频接口标准,用于连接高清电视、电脑、游戏机、蓝光播放器等设备。它是由HDMI联盟(HDMI Licensing, LLC)制定的&#xff0c…

奥威BI数据可视化大屏分享|多场景、多风格

数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景,由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格,起着不同作用的BI数据可视化大屏报表,一起来了解一…

【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)

前言 哒哒~时隔好久终于继续出论文带读了,这次回归当然要出一手王炸呀——没错,今天我们要一起学习的就是传说中的Transformer!在2021年Transformer一经论文《Attention is All You Need》提出,就如龙卷风一般震惊学术界&#xf…

关于ROS机器人-文心一言和CatGPT怎么看-

交流截图: 文字版本如下(W-文心;C-猿如意): 如何通过蓝桥云课学习ROS机器人? W: 如果你想通过蓝桥云课学习ROS机器人,可以按照以下步骤进行: 确认ROS机器人的版本和教…

【记录】笔记本新加SSD,重装系统win10,再装双系统ubuntu18.04

记录一下,希望下次装系统可以来的晚一点一、前言二、换SSD三、装Windows1.安装系统2.删除多余系统3.遇到问题:无法关机4.改注册表,开不开机,黑屏有鼠标三、装ubuntu1.安装完,设置root2.更新源3.时间设置4.win和ubuntu共…

大语言模型及其应用

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 机器学习 机器学习(Machine Learning,ML)是指从数据中自动学习规律和模式,并利用这些规律和模式,在新的数据中完成…

nssctf web 入门(6)

这里通过nssctf的题单web安全入门来写,会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列,之后会一直出这个题单的解析,题目一共有28题,打算写10篇。 目录 [SWPUCTF 2021 新生赛]caidao [SWPUCTF 2021 新…

力扣题库刷题笔记64-最小路径和

1、题目如下: 2、个人Python代码实现: 以上代码主要是照抄题解,根据调试bug了解每一步的逻辑,然后注释利于读懂本题,写本篇文章的目的在于初步了解动态规划。 本题的逻辑主要如下: a、列表中每个数字代表当…

【Redis笔记03】Redis运行环境之Cluster集群模式

这篇文章,主要介绍Redis运行环境之Cluster集群模式。 目录 一、Cluster集群模式 1.1、集群模式原理 (1)普通集群 (2)什么是分片??? (3)如何分片存储&…

基于springboot的音乐网站的设计与实现(带论文)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【OCR】CTC loss原理

1 CTC loss出现的背景 在图像文本识别、语言识别的应用中,所面临的一个问题是神经网络输出与ground truth的长度不一致,这样一来,loss就会很难计算,举个例子来讲,如果网络的输出是”-sst-aa-tt-e’, 而其ground truth…