发布时间:2022-11-26 14:06:26来源:网络整理浏览:17
在本教程系列中,我们使用多人贪吃蛇游戏的示例开发了一个异步应用程序。第一篇文章介绍如何实现异步,第二篇文章重点介绍如何编写游戏循环。前两个门户如下:
跟随并编写一个多人在线游戏(1)。
跟随并编写多人在线游戏(II)。
作者是一家IT咨询公司的工程师。由翻译,校对:@。
译者简介:oo7ww,北京邮电大学大三学生,计算机科学与技术专业,指导网络。
4. 制作一个完整的游戏
4.1 项目概述
在这一部分中,我们将回顾一个完整的在线游戏的设计。
这是一款经典的贪吃蛇游戏,增加了玩家的数量。你可以试试()。源代码托管在上面。游戏包含以下文件:
4.2 游戏循环内部
由于简单,多人贪吃蛇游戏是一个很好的学习例子。每一帧,所有的蛇都会移动一个位置,帧以非常慢的速度变化,这使您可以观察游戏引擎的工作原理。由于游戏速度较慢,对玩家键盘输入没有立即响应。记录每个按下的键,然后在游戏循环迭代结束时计算下一帧时,将计算该键。
现代动作游戏以相对较高的帧速率运行,服务器和客户端的帧速率不相等。客户端帧速率通常取决于客户端的硬件性能,而服务器帧速率是固定的。客户端可能会在获取与“游戏滴答”对应的数据后呈现多个帧。这允许您创作仅受客户端性能限制的平滑动画。
在这种情况下,服务器不仅应该传递这些目标的当前位置,还应该传递它们的运动方向、速度和加速度。客户端帧速率以 FPS(每秒帧数)表示,而服务器帧速率以 TPS(每秒时钟周期)表示。
在此贪吃蛇游戏示例中,两个值相等,并且在客户端上呈现的帧是在服务器的 tick 事件中计算的。
我们将使用类似于文本格式的游戏区域。实际上,这是一个包含许多单字符单元格的 HTML 表。游戏中的所有对象都由放置在单元格中的不同颜色的角色渲染。大多数情况下,客户端将密钥的代码传递给服务器,并获得与每个“tick”对应的游戏区域的更新。从服务器获取的更新包含表示生成的字符及其坐标和颜色的信息。因此,我们将所有游戏逻辑保存在服务器上,只将生成的数据发送给用户。此外,我们通过替换网络发送的信息来减少黑客攻击游戏的可能性。
4.3 它是如何工作的?
此游戏的服务器类似于例 3.2 的简单示例。但是,我们没有使用全局列表,而是使用了服务器范围的 Game 对象。Game 实例包含一个对象列表(在 self. 属性中),表示加入游戏的玩家及其私有数据和对象。所有与游戏相关的数据都放置在一个游戏对象中,该对象还允许我们拥有多个游戏室。在这种情况下,我们需要维护多个 Game 对象,因为每个游戏在开始时都需要一个。
服务器和客户端之间的所有交互都是通过以 JSON 格式编码的消息完成的。从客户端发送的消息仅包含一个数字,这是玩家按键的代码。所有其他从属客户端消息都按以下格式发送:[, 参数
1, 参数2, ...argN]
服务器消息以列表形式发送,因为通常需要立即发送许多消息(主要是呈现的数据):[
[, arg1,arg2多人在线游戏, ...argN], ... ]
在每个游戏循环迭代结束时,将计算下一帧并将其发送到所有客户端。当然,我们不会每次都发送完整的帧,只是下一帧的更改列表。
需要注意的是,玩家在连接到服务器后不会立即加入游戏。连接后,启动“旁观者”模式,以便您可以看到其他人的比赛方式。如果游戏已经开始,或者游戏之前出现在“游戏结束”屏幕上。玩家只能按“加入”按钮加入现有游戏。或者,如果游戏当前未运行,则可以创建新游戏(没有其他活动的玩家)。在后一种情况下,在开始之前会清除游玩区。
游戏区域保存在游戏中。 属性,它是二维数组的嵌套列表。它是用来保存游戏区域的内部状态。数组中的每个元素表示单元格区域,然后再将单元格呈现为 HTML 表单元格。
它具有 Char 类型,该类型包含单个字符和颜色。保持游戏区域与所有连接的客户端同步至关重要,因此应将所有游戏区域的更新与相应的消息一起发送给客户。这是由Game开发的。() 方法实现。它接收 Draw 对象的列表,然后在内部使用它来更新游戏区域并将信息发送到客户端。
我们使用 ,不仅因为它很好地表示了简单的数据结构,还因为它在以 JSON 格式发送消息时比 dict 需要更少的空间。
如果在实际游戏应用中发送复杂的数据结构,建议将它们序列化为普通甚至更短的格式,或者将它们打包成二进制格式(例如 bson,而不是 json)以减少网络流量。
该对象包含一个表示蛇的 deque 对象。此数据类型类似于列表,但可以更有效地添加和删除其上的元素,因此理想情况下它表示一条移动的蛇。此类的方法主要是 。() ,返回渲染数据以将玩家的蛇移动到下一个位置。
基本上,它将蛇头渲染到新位置,删除尾巴所在的最后一个元素。考虑到蛇在吃一个数字时会长大,尾巴不会移动相应的帧数。蛇的渲染数据可以在游戏中使用。() 方法,实现所有游戏逻辑。它将呈现所有蛇的运动,检查每条蛇前面的障碍物多人在线游戏,同时产生数字和“石头”。在每次滴答期间,游戏直接从 () 调用该方法以生成下一帧。
如果蛇头前面有障碍物,它会在游戏中找到。() 在呼叫游戏中。() 。它将在线通知所有客户(死蛇由.( ) 变成石头)蛇死了,最高分表更新。对象的活动标志设置为 False,以便在渲染下一帧时忽略玩家,直到他再次加入游戏。如果没有蛇活着,游戏区域中会显示“游戏结束”消息。同时,主游戏循环将停止,游戏将停止。该标志设置为 False,下次玩家按“加入”键时,游戏区域将被清空。
每次生成下一帧时,数字和石头也会同时出现,由随机值决定。数字或石头的赔率可以在.py中修改。注意,游乐区里每条活着的蛇都有一个对应的编号,所以蛇越多,数量就会越多,所以它们会有足够的食物。
4.4 网络协议
从客户端发送的消息列表
命令参数说明
[姓名]
设置玩家昵称
加入
玩家将加入游戏
从服务器发送的消息列表
命令参数说明
[同上]
为玩家分配 ID
世界
[[(字符,颜色), ...], ...]
初始化游戏区域地图
清理地图,将所有字符替换为空格
[x、y、字符、颜色]
在相应位置显示字符
[ID、姓名、颜色、分数]
游戏新手玩家
[同上]
单人游戏结束
[ID,分数]
为玩家设置分数[
[名称、分数、颜色], ...]
更新最高分表
典型的消息交换规则
客户端>
服务器>客户端-服务器->所有客户端注释
名称将传递给服务器
标识分配
世界
初始游戏地图交付已完成
最新的最高分表交付已完成
加入
玩家按下“加入”,游戏循环开始
命令客户端清理游玩区
、,...
第一个游戏徽标,第一帧渲染
(密钥代码)
玩家按下一个键
、,...
第二帧渲染
蛇吃了一个数字
、,...
第三帧渲染
。重复几帧。
蛇在吃这种疾病时死亡
更新最高成绩表(如果有)
5. 总结
老实说,我真的很喜欢使用最新版本的异步功能。新语法不同,因此异步代码现在易于阅读,并且很容易分辨哪些调用是非阻塞的,以及它们是否切换到绿色协程。现在我可以自信地宣称它是异步编程的好工具。
在团队中很受欢迎。如果您决定在公司放松一下,请记住通过 or 向我们提供反馈。
这
翻译组是由@发起的专注于技术内容翻译的团体,至今已有近30名技术爱好者加入。
翻译团队制作的内容(包括教程、文档、书籍、)将在编程微信公众号发布,欢迎爱好者推荐相关线索。
要推荐线索,可以直接在编程学校微信公众号推文下留言。
上一篇: 《仙语星辰》AR弹球3d手机游戏
007球探网即时比分 足球手机版下载_007球探网即时比分 足球手机版「EV2.0」下载
热门手游
下载02s515排水检查井下载_02s515排水检查井「EV2.0」下载
热门手游
下载0515返利网下载_0515返利网「Ve2.2」下载
热门手游
下载03g101图集下载_03g101图集「V1.25」下载
热门手游
下载1.70合击下载_1.70合击「VE1.10」下载
热门手游
下载1 2 fan club下载_1 2 fan club「EV2.0」下载
热门手游
下载1.70金币版下载_1.70金币版「V1.2」下载
热门手游
下载.net framework 3.0下载_.net framework 3.0「VE1.10」下载
热门手游
下载