Godot模拟实现多人游戏平滑移动

最近几天接触到Godot,发现是一个很不错的免费开源游戏引擎,游戏本身实现了多人对战游戏之间同步功能(好像更适合于即时对战类,而且对战人数对计算机的性能要求高);

如果要实现一个大型的游戏,1个服务端(长期运行)对应N多个客户端(随时运行)需要怎么实现,不知道是不是我接触Godot时间太短,暂时没找到解决方案。我觉得首先需要解决数据同步中的平滑移动 ,让游家体验不出现卡顿现象,实现平滑移动 前提条件就是目标位置是可预测 的;这里分享下我实现的多人游戏之间的平滑移动的思路,以下是模拟实现(第一次接触游戏类的开发,各位见笑了)。

看最终效果:

接下是功能的实现:

Sprite2DRemote:远程节点(模拟服务端)

Timer: 定时器间隔:0.5秒,用于生成随机增加的旋转度数(模拟用户提交的状态数据);

绑定的脚本内容如下:

复制代码
extends Sprite2D

var rng = RandomNumberGenerator.new()

var customTimer
var customRotation
func _ready(): 
	rng.randomize()

	# custom
	customRotation = rotation
	customTimer = get_node("Timer")
	customTimer.connect("timeout",_custom_timer_timeout,CONNECT_PERSIST)

func _process(delta):
	rotation_degrees = customRotation

func _custom_timer_timeout():
	var newRotation = customRotation + (rng.randi() % 20)
	customRotation = int(newRotation) % 360

Sprite2DLocal: 本地节点 (模拟客户端)

Timer: 定时器间隔:0.5秒,用于同步**Sprite2DRemote(模拟服务端)**旋转度数;

Sprite2DLocal1: 本地节点 (模拟客户端)

Timer: 定时器间隔:1秒,用于同步**Sprite2DRemote(模拟服务端)**旋转度数;

Sprite2DLocal2: 本地节点 (模拟客户端)

Timer: 定时器间隔:2秒,用于同步**Sprite2DRemote(模拟服务端)**旋转度数;

Sprite2DLocal、Sprite2DLoca1、Sprite2DLocal2的脚本文件绑定的是同一个文件,内容如下:

复制代码
extends Sprite2D

var sprite2DRemote
var sprite2Dlocal

var customTimer
var customRotation

func _ready(): 
	# remote
	sprite2DRemote = get_node("../Sprite2DRemote")
	sprite2Dlocal = get_node(".")
	
	# custom
	customRotation = sprite2DRemote.rotation_degrees
	customTimer = get_node("Timer")
	customTimer.connect("timeout",_custom_timer_timeout,CONNECT_PERSIST)
	

func _process(delta): 
	var localRotation = rotation_degrees
	if (localRotation==customRotation):
		return
	
	# calc diff
	var diffRotation
	var sumCustomRotation
	if (customRotation<localRotation):
		sumCustomRotation = 360+customRotation
		diffRotation = sumCustomRotation-localRotation
	else:
		diffRotation = customRotation-localRotation
		sumCustomRotation = customRotation
		

	# fix range
	localRotation += diffRotation*delta
	if (localRotation>=sumCustomRotation):
		localRotation = customRotation
	if (localRotation >= 360):
		localRotation = int(localRotation) % 360
		
	#
	# print(sprite2Dlocal.get_name(),": _process() ", localRotation)
	rotation_degrees = localRotation

func _custom_timer_timeout():
	customRotation = sprite2DRemote.rotation_degrees 
	# print(sprite2Dlocal.get_name(),": timeout() ", customRotation)
相关推荐
AIwenIPgeolocation11 小时前
IP地址数据服务:赋能游戏行业体验优化与精细化运营
网络协议·tcp/ip·游戏
迪捷软件11 小时前
显控系统虚拟仿真的工程化路径
游戏引擎·cocos2d
前端不太难13 小时前
AISystem:鸿蒙游戏中的 AI 行为驱动
人工智能·游戏·harmonyos
开开心心就好15 小时前
无品牌限制的手机电视投屏工具推荐
科技·游戏·智能手机·edge·电脑·逻辑回归·powerpoint
Swift社区16 小时前
传统游戏引擎 vs 鸿蒙 System 架构
架构·游戏引擎·harmonyos
mxwin1 天前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F1 天前
三层时间轮的实现
网络·unity·游戏引擎
努力长头发的程序猿2 天前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
上海云盾-小余2 天前
BGP 高防与普通高防差异解析:游戏与政企业务该如何选型
游戏
mxwin2 天前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader