我有一个关于编程网络游戏上的客户端/服务器通信的一般问题。 我使用TCP作为协议,并且通信...有效,但我不确定,如果这是一种有效的方式。GAMEPROGRAMMING通过....进行客户端/服务器通信? (JAVA)
在一般情况下,在客户端所发生的行为会throught所有这些步骤:(例如火球正投)
- 一些行动
- [*]对于这个动作我定义了一个字符串(例如#F#270#130#,这意味着'F'表示它是一个火球,270是(例如)角度,130 - 火球的速度是射击。)
- 字符串进入客户端的输出缓冲器&等待队列
- 字符串被发送
- 字符串被服务器接收
- [*]服务器需要一个可以检测字符串含义的行解释器(这里:什么意思是F?这是一个火球!)&增加了一个唯一的身份,基于,从哪个客户端收到命令。
- [*]服务器需要根据发生的动作计算逻辑(火球对别人造成伤害,是否立即触及某人或立即飞行)
- 服务器发送一个(更新的)字符串所有客户都会采取的行动。 (例如,也许火球速度由于某种原因减速 - 这里将是一个更新的字符串(#F#12345#270#90# - 12345是唯一的玩家身份)
- 客户端接收字符串
- [* * ]客户端将字符串解析为命令+处理它(触发动画序列...)
- originaly发送命令的客户端将收到的字符串与等待队列中的字符串进行比较 - 当相等时,不执行任何操作(平滑某些操作,否则通过连接问题/延迟,一些动作会发生两次或跳转从一个位置到另一个位置,基于ping
真的有必要通过所有t这些步骤?在所有标有[*]的步骤中,我需要为每个命令定义新的行解释器/操作,因此我将每个操作编码两次,客户端为&服务器端。 我读了一些关于发送可序列化对象的东西,但在genereal中,这个想法对我来说似乎是一样的,我发送一个对象,该对象必须被解释+处理,并且我发回一个对象...
任何提示?为了解决整个沟通更优雅,用更少的代码?或略偏分类 - 所有这些#楼##男寻找不同的动作##^h#标签使它越来越复杂:)
(其实我确实有如下处理/操作:
- 移动 -Look /旋转 -hpchange -firearrow -spawn /断开 ...)
希望你明白我的意思 - 我知道,我可能只是继续编码一样的是,它会以某种方式工作,但它似乎太复杂了,因为它可能是。
谢谢!
还有更多:)字符串被发送,字节被转移到服务器,字符串被服务器接收,其他100个步骤你没有提到 – Tala