帧同步坦克大战移动系统

上节讲到了匹配系统,匹配完成之后,我们就需要开始进行帧同步了。但是,需要注意,只有房主才可以调用开始帧同步的方法。因此,需要加一层判断。

然后,房间内的其他玩家需要监听开始帧同步的广播,接收到开始帧同步的消息之后,进入游戏场景。

game_scene:游戏主场景。(终于到最关键的逻辑部分了)

首先,进入游戏主场景之后,进行一些玩家的初始化(比如位置,血量,攻击,防御等信息),还有摇杆的初始化。

需要注意的是,玩家的出生位置这一部分逻辑稍微复杂一些。因为,没有服务器逻辑支持,所以只能在客户端想办法。于是,我预先定义了两组,共六个玩家的位置。然后,把服务器传过来的房间内玩家也进行分组,最后将两个分组内的玩家分别和位置信息映射好就可以了。这部分逻辑在GameScene.ts的 initPlayerPoss方法里。

摇杆分为左摇杆和右摇杆。左摇杆是控制坦克的位置和方向的,右摇杆控制坦克的炮头方向和射击。(坦克的方向和坦克的炮头方向互不影响,需要注意一下)

所有初始化动作完成之后,就需要处理逻辑帧消息和发送帧消息了。以下是接收帧消息和发送帧消息的主要代码

每次处理完帧消息之后,就把逻辑帧的信息同步到表现层,然后把当前帧的消息发送到服务器。

之前,给服务器发送帧消息,我是每次摇杆监听到有变动就发送。这样会导致帧消息发送太频繁,没有必要这样做。另外,还会导致一个致命的问题,帧消息的顺序错乱。因为发送帧消息都是异步的,没有办法保证哪个消息先到,哪个后到。因此,会导致有时候坦克会一直移动停不下来(我是根据isMoving判断是否在移动)。看以下截图,timestamp顺序已经被颠倒了,导致最后的ismoving应该是false,现在却是true。

处理帧消息是逻辑层和表现层分离的。逻辑层的逻辑都在GameState.ts模块里。逻辑帧帧率默认15,也就是1秒钟有15个帧消息。处理每帧的消息在calFrame方法里。需要注意的是,处理每帧消息之前,都需要初始化一个随机种子,方便游戏中有些逻辑需要用到随机的地方,比如地图随机生成道具等。(计算机中的随机数都是伪随机的,只要随机种子指定的一样,随机的结果也是一模一样的)

逻辑层每一帧处理完之后,会计算出当前帧最终玩家坦克所在的位置,然后拷贝到表现层。

表现层,是用每个类的update来驱动的。以玩家类Hero.ts为例。

表现层根据当前的坦克位置和逻辑层传过来的当前帧的最终位置,做一个插值运算,以平滑处理坦克的移动。这部分逻辑参看 Hero.ts 里的updatePosition方法和update方法。主要思想就是,计算出来当前位置到最终位置所用的总时间,把时间跑完,也就走到了最终的位置。插值时,需要传入一个所用时间除以总时间的比值。这样,就会让表现层表现移动更平滑一些。虽然,逻辑层是固定15帧,但是表现层是按渲染帧来的。

说明一下:

  1. 项目代码可能看起来比较多。其实,有很多方法和ts类都没用到,那是之前写的逻辑。所以,没必要所有代码都需要看,只需要按照我说的思想一步步往下看即可。重要的代码,主要看这几个就可以了:StartScene.ts,对应start_scene场景
    HomeScene.ts, 对应home_scene场景
    ChooseScene.ts,对应choose_scene场景
    GameScene.ts,对应game_scene主场景
    GameState.ts,帧同步逻辑层
    Hero.ts,坦克移动的表现层
    moveSticker.ts,坦克移动监听脚本
  2. 关于帧同步的浮点数运算,其实没有特别处理,只是简单的乘以1000。有的地方说,需要把所有的地方都换算成整数,包括位置信息。对于浮点数运算,我还有很多疑问,如换算成整数,有时候可能会越界;换算成整数,计算的时候不会出现浮点数吗,那应该怎么办。还有的地方说,浮点数问题不会成为瓶颈,对战游戏,本来一局时间就很短,可能一千局一万局才会出现一局不同步。
  3. 移动平滑使用的是插值算法。这需要保证每一帧都能及时的到达客户端,然后把逻辑帧位置同步到表现层进行平滑处理。在网络状态不好时,可能还会出现卡顿现象。目前,还没有找到更好的方法。(航位推算还需要再研究一下)

原文地址:https://www.cnblogs.com/starry-skys/p/11980418.html

时间: 2024-08-02 23:44:50

帧同步坦克大战移动系统的相关文章

帧同步坦克大战匹配系统

在介绍匹配系统之前,先说一下项目的整体结构. 项目主要有四个场景: start --> home --> choose --> game start_scene: 是游戏的开始场景,在此场景主要做了微信授权,获取用户的昵称,头像等信息.通过云函数获取用户的openid(不了解云函数的可以参考这篇文章:微信云开发使用教程).然后把用户的信息和用户的openid都放到全局对象Global里边,方便以后使用. home_scene: 授权成功之后,就跳转到此场景. 进入此场景之后,需要初始化M

帧同步坦克大战开篇

?最近在用腾讯的小游戏联机对战引擎(以下简称MGOBE)改写我之前写的坦克大战.因为时间有限,每天都是下班业余时间去搞,也是第一次写帧同步,因此遇到了很多问题,也因此学到了很多东西.(不了解这个框架的可以看我之前的简单介绍以及我为什么要用这个框架:惊!!!个人游戏开发者的福音来了!) 目前主要实现的功能,就是匹配系统和帧同步的平滑移动,自我感觉效果还可以,不过还是有很多需要优化的地方. 因无法上传视频,想看视频效果的可以关注公众号「如若清风」,查找近期文章帧同步一即可看到. 匹配系统:包括小游戏

黑马2018年最新kotlin项目实战视频 (手机影音、即时通讯、黑马外卖、坦克大战等)

├─1.kotlin简介和学习方法│ 01_kotlin课程简介_01.mp4│ 02_kotlin学习方法_01.mp4│ 03_kotlin选好教练车_01.mp4│ 03_kotlin选好教练车_02.mp4│ 04_kotlin你好世界_01.mp4│ 05_kotlin变量与输出_01.mp4│ 05_kotlin变量与输出_02.mp4│ ├─10.类,对象和接口(三)│ 38_kotlin面向对象-抽象类和接口_01.mp4│ 38_kotlin面向对象-抽象类和接口_02.mp4

Python3——坦克大战

# coding=utf-8 # Version:python3.6.1 __date__ = '2018/9/20 18:51' __author__ = 'Lgsp_Harold' import pygame, sys, time from random import randint from pygame.locals import * # 坦克大战主窗口 class TankMain(object): width = 600 height = 500 my_tank_missile_li

JAVA课程设计(坦克大战)

2019-01-16 坦克大战游戏背景: 1. 需求分析 1.1环境要求 操作系统:Windows 7(SP1)以上 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 1.2角色设定 用户在系统中扮演的角色,以及可以执行的职责. 玩 家 操纵玩家坦克,与敌方坦克作战,同时保护本基地.敌方坦克随机移动,发射子弹. 1.3设定玩家(玩家一,玩家二,即一个人玩还是两个人玩),我方坦克的方向和子弹由用户控制,所有墙块都可以打碎,但是铁墙是打不碎的,草地不能阻止坦克和子弹的前进,河

Java__线程---基础知识全面实战---坦克大战系列为例

今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的java进行一下实战. 每个程序版本代码中,都附有相关注释,看完注释大家就可以对本程序设计有个很明显的思路.真的很有趣,想对java重新温习的同学完全不必再对厚厚的java基础书籍进行阅读了,在跟着本次代码练习并分析后,大家一定会对java各方面基础知识 尤其是线程的知识有更深一步的了解!!! 本次坦克大

帧同步在竞技类网络游戏中的应用

帧同步在竞技类网络游戏中的应用 帧同步在网上可以搜的资料比较少,关于游戏的更是没有,不过,实现的原理也比较简单,最近几天就写了份关于帧同步的文档,当作给同事扫扫盲,顺便也在这里发发,可以给其他人参考参考     --竞技类网络游戏设计方案   一.        前言 帧同步,根据wiki百科的定义是,一种对同步源进行像素级同步显示的处理技术,对于网络上的多个接入者,一个信号将会通过主机同步发送给其他人,并同步显示在各个终端上.同步信号可以是每帧的像素数据,也可以是影响数据变化的关键事件信息.

【Cocos2D-x 3.5实战】坦克大战(1)环境配置

前言: 最近课比较少,空闲时间比较多,一有时间就东想西想,想着想着就突然想到做手机游戏(android)了,学习下CoCos2d.看了一些CoCos2D的相关文档和教程,觉得是时候实战了,但是苦于没有什么新奇的游戏点子,只有写下被儿时玩过的坦克大战了(主要素材好找).而这个系列的文章来记录下我的开发过程. 开发环境: Win7(x64) VS2012  下载地址: http://www.itellyou.cn/ Eclipse  下载地址:http://www.eclipse.org/downl

【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器

从10月20号到现在,Unity3D也学了10天了,对于Unity3D也有了一个大致的了解,有必要做一个小游戏来检测一下自己的学习成果了.经过两天的努力,终于总算是做出来了一个可以玩的坦克大战了.首先讲讲我的设计目标: 1.地图编辑器 2.道具系统 3.简单AI系统 4.计分器 其中,最重要的就是地图编辑器了,其次到AI系统,其他几个都挺简单的. ---------------------------------------------------------------------------