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)
相关推荐
IT从业者张某某1 天前
基于EGE19.01完成恐龙跳跃游戏-V00-C++使用EGE19.01这个轮子
c++·游戏
相信神话20212 天前
第四章:Godot 4.6 核心概念与开发环境搭建
游戏引擎·godot·2d游戏编程·godot4·2d游戏开发
代数狂人2 天前
在Godot中应用面向对象原则:C#脚本实践
c#·游戏引擎·godot
Sator12 天前
Unity关于射击游戏人物动画的设计经验
游戏·unity·游戏引擎
王杨游戏养站系统2 天前
3分钟搭建1个游戏下载站网站教程!SEO站长养站系统!
开发语言·前端·游戏·游戏下载站养站系统·游戏养站系统
huwuhang2 天前
索尼PS3游戏合集【中文游戏】8.12T 1430个游戏+PS3模拟器
android·游戏·智能手机·游戏机·电视
毕业设计-小慧2 天前
计算机毕业设计springboot游戏数据管理系统 基于SpringBoot的电竞赛事数据管理平台 基于SpringBoot的在线游戏运营数据分析系统
spring boot·游戏·课程设计
黑客说2 天前
AI驱动剧情,解锁无限可能——AI游戏发展解析
人工智能·游戏
智算菩萨2 天前
【OpenGL】10 完整游戏开发实战:基于OpenGL的2D/3D游戏框架、物理引擎集成与AI辅助编程指南
人工智能·python·游戏·3d·矩阵·pygame·opengl
风酥糖2 天前
Godot游戏练习01-第20节-增加亿点点细节
游戏·游戏引擎·godot