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

news2024/11/26 16:56:34
        现在的服务端框架有支撑数万玩家的能力,且支持横向拓展(即 增加物理机数量),理论上具有无上限的负载能力。下面以《球球大 作战》为例,说明怎样使用这套框架。

1、战斗流程

        玩家登录后,玩家可以做些非战斗操作(仿照work示例,可以实现 成就、背包、邮件、好友等功能),如下图所示:

当点击开始比赛按钮时,客户端会发生“进入战斗的协议。战斗流程如下图所示:

 

        服务端会开启很多scene 服务,每个服务处理一场战斗。收到 进入战斗 的协议后, agent 会随机选择一个战斗服务。进入战斗后,agent 会与某个 scene 服关联。注意图中的虚线方框,不同方框里的服务可能位于不同节点,理论上scene服务可以部署在任意节点上,这增加了服务端的扩展能力。

2、游戏玩法

   我们简化一下 《球球大作战》的玩法。如下图所示:
        战场中包含球和食物这两种对象,每个玩家控制一个球,其中黑 色小圆代表食物。当玩家进入战斗时,场景中会添加一个代表玩家的小球,它出生在随机的位置上,默认是很小尺寸(半径)。玩家可以 控制球移动的速度,比如设置为(1,0)会一直向右走,直到设置为 0, 0 )才停下来。场景中会随机生成一些食物,遍布各处,当小球碰 (吃)到食物时,食物消失,球的尺寸增长。

3、战斗协议

《球球大作战》的战斗流程涉及如下几条协议:

(1)进入战场协议      

        当玩家点击“ 开始比赛 按钮时,客户端发送 enter 协议(见下图 ),服务端会做出能不能进入战斗的判定,并且将 agent 和某个 scene 关联起来。

  • 如果成功进入战场,服务端会回应成功信息,且向同战场的其他玩家广播有人进入的消息。广播的消息包含三个参数,分别是刚进入的玩家id、它的坐标尺寸
  • 如果进入失败,例如玩家已经在战斗中,会回应失败信息,如 您已在战场中,不能重复进入”

 (2)战场信息协议

        进入战场后,客户端需要显示战场中的球和食物。服务端会发送balllist foodlist 协议,如下图所示:

         以balllist为例,它依次包含了各个球的信息,每个球包含4个参数,分别是玩家idx坐标、y坐 标和尺寸。 服务端生成食物时,会给每个食物一个唯一id。在食物信息协议 foodlist中每个食物会包含idx坐标、y坐标这3个参数。

(3)生成食物协议

        战场会随机生成一些食物。服务端会广播addfood 协议(如下图所示),此协议包含新生成食物的id、 x 坐标、 y 坐标。

 (4)移动协议

        当需要改变移动方向时,客户端会发送shift 协议(如下图所示 ),设置小球的x 方向速度和 y 方向速度。

        所有游戏逻辑由服务端判定。每当小球的位置发生变化时(每隔一小段时间),服务端就会广播move协议(见下图),更新小球的坐标。move协议是发送频率最高的协议,假设服务端每0.2秒更新一次 小球位置,战场上有10个小球,那么每个客户端每秒将收到50move协议。

        

说明:每个客户端每秒将收到50move协议,这个频率非常高,但有不少优化方法,比如可以将多个小球的位置信息合并成一条 协议或使用AOI算法做优化(后面会提到)。

(5)吃食物协议 

        当小球吞下食物时,服务端会广播eat 协议(见下图 ),此协议的参数包含玩家id 、被吃掉的食物 id 和玩家的新尺寸

(6)离开协议

        当玩家掉线时(离开战场),服务端会广播leave 协议(如下图 所示),告诉战场中每一位玩家,有人离开了。

 

        完整的《球球大作战》还包含玩家间的碰撞、球分裂、排行榜等 功能。这些功能不算复杂,写法和“ 生成食物 ”“ 吞下小球 很相似,大家有时间可以自行实现。

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

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

相关文章

形式语言和自动机总结DFA、NFA

第一章DFA 形式定义和状态转移函数: DFA是一种特殊的NFA, A{Q,,,,F} Q:输入状态集,∑:字母表,δ:状态转移函数Q∑→Q q0∈Q初始状态 F终结集 设计举例 1.设计接受偶数个0和偶数个1串的DFA 2.设计 DFA 接受 {0,1} 上的字符串 w, 且 w 是 …

C++之模拟实现map和set

文章目录前言一、迭代器1.begin()和end()2.operator()二、改造红黑树三、map的模拟实现四、set的模拟实现总结前言 基于之前的红黑树和map、set的相关知识,本节我们使用红黑树来模拟实现STL中的map和set。 一、迭代器 使用迭代器可以方便我们对数据结构进行遍历&a…

windows安装wsl2

总的来说是按照这三个链接来的,也写了一个大体流程。 wsl对win版本有要求,可以 winr winver查看 原始参考链接: 1)https://zhuanlan.zhihu.com/p/466001838 2)https://cloud.tencent.com/developer/article/1986728 3&…

SpringCloud之Eureka、Ribbon及Nacos

SpringCloud之Eureka、Ribbon及Nacos 文章目录SpringCloud之Eureka、Ribbon及Nacos1. 单体架构和微服务架构2. SpringBoot、SpringCloud及SpringCloud Alibaba之间的版本对应关系2022.x 分支2021.x 分支2.2.x 分支组件版本关系3. Eureka3.1 Eureka-server注册中心3.2 Eureka-cl…

Elasticsearch:使用 ingest pipeline 来管理索引名称

在我之前的文章 “Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去” 我详述了如何使用已有的 date_index_name 处理器来把文档归类到所需要的和文档日期相关的的索引中去。比如,我们想把 2023 年 4 月的所有文档写入到 my-index…

【QT】MainWindow中如何为菜单栏或工具栏中的Menu或Action设置快捷键

目录1. 设置快捷键的两种方法1.1 在控件title属性的某个字母前加上&,(Alt该字母)作为快捷键1.2 使用 setShortcuts,(Ctrl字母)作为快捷键2. 为菜单栏中的 menu 设置快捷键2.1 测试2.2 代码3. 为菜单栏或工具栏中的…

百兆以太网使用的电信号编码分析

以太网是一种计算机局域网的组网技术。在IEEE制定的IEEE 802.3标准给出了以太网的技术标准。它规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用普遍的局域网技术。它很大程度上取代了其他局域网标准,如令牌环、FDDI和ARCNET。 我们常见的网…

Netty通信技术进阶一

Netty通信技术进阶1. 概念2. 线程同步、异步3. 其他通信技术对比4. Netty中的Reactor实现5. Pipeline 和 Handler5.1 ChannelHandler 分类6. 入站事件传播7.inbound/outbound 加载顺序和执行顺序8. 出站事件传播9. Code example9.1 编写服务端9.2 编写客户端10. 核心组件10.1 B…

虚拟直播需要哪些设备?如何搭建虚拟直播团队?

虚拟直播不止是新兴的娱乐途径 ,还是新的商业模式 。虚拟直播的出现,是互联网娱乐趋势的变化,带来了更加丰富多彩的娱乐形式,同时也优化了传统直播模式下的人力物力成本,使直播行业更加效率及智能。 科技不断发展&…

JDBC(数据库连接)

MYSQL 数据库总结: http://t.csdn.cn/Ka9Vm JDBC是使用Java语言操作关系型数据库的一套API。 将mysql-connector-j-8.0.32jar复制粘贴到一个新建的目录里,然后右键mysql-connector-j-8.0.32jar,添加为库。 DriverManager 一个工厂类&…

2023易派客工业品展览会在苏州开幕

展厅面积达5.3万平方米,500多家重要工业领军企业参展,20组企业签署购销意向协议,签约金额超82亿元 ​ 4月13日,“2023易派客工业品展览会”在苏州国际博览中心开幕。展会以“绿色智造融通赋能”为主题,500多家重要工业…

CART分类树算法

1. CART分类树算法的最优特征选择方法 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.…

FreeRTOS中临界段的保护(笔记)

目录临界段的定义Cortex-M内核快速关开关中断的指令关中断开中断进入临界段的宏退出临界段的宏进入临界段,不带中断保护, 不能嵌套进入临界段,带中断保护版本,可以嵌套退出临界段,不带中断保护版本,不能嵌套…

【数据结构与算法】堆的实现(附源码)

目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…

Windows通过RDP异地远程桌面Ubuntu【内网穿透】

文章目录前言1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址前言 XRDP是一种开源工具,它允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP外,xrdp工具还接受来自其他RDP客户端(…

文心一格,百度AI作画产品

文章目录AIGC什么是AI作画?Prompt文心一格使用方法注册账号使用AI绘图AIGC的未来发展结语AIGC AIGC(AI Generated Content)是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容,GC的意思是创作内容。与之相对应的概念中…

ElasticSearch索引文档写入和近实时搜索

一、基本概念 1.Segments In Lucene 众所周知,ElasticSearch存储的基本单元Shard,ES中一个Index可能分为多个Shard,事实上每个Shard都是一个Lucence的Index,并且每个Lucene Index由多个Segment组成,每个Segment事实上…

【JS运算】分组求和/平均值(reduce函数)

对于数组求和的问题,使用reduce函数能够最快的解决 如果你还不会reduce函数,可以看这一篇: reduce函数的使用 思路 reduce函数对相同group的值进行迭代求和 将分组的总和除以组里的个数得到平均值,然后存储起来 Sum函数&#x…

Linux ubuntu更新meson版本

问题描述 在对项目源码用meson进行编译时,可能出现以下错误 meson.build:1:0: ERROR: Meson version is 0.45.1 but project requires > 0.58.0. 或者 meson_options.txt:1:0: ERROR: Unknown type feature. 等等,原因是meson版本跟设置的不适配。 …

Linux 学习总结(92)—— Linux 高效率使用技巧

1、跳转目录优雅顺滑 1.1 bd 命令 快速回到 Bash 中的特定父目录,而不是多余地键入 cd ../../..。如果在此路径中/home/radia/work/python/tkinter/one/two并且想快速转到目录 python,只需键入: bd python或者仅输入目录的前几个字母,如匹…