想法

A collection of 4 posts
想法

一种回合制战斗过程的记录方式

回合制战斗的页游,需要将战斗过程在服务端全部计算完成后再下发给客户端,并且还需要将战斗过程保存起来,让第三方直接查看。 将战斗的过程以动作为单位分解成多种消息,之后将多种战斗消息封装在一个消息打包器中下发给客户端。客户端从打包消息中按字节流的方式还原 出战斗消息,再解析消息进行表现。保存战斗过程只需要保存被打包完的字节流消息即可。 MsgPacker #pragma pack(push, 1) typedef struct { MSGHEAD_DEFINE USHORT usAction; DWORD dwData; DWORD dwAmount; //后面有几个消息 UCHAR ucMsg[0]; //各种战斗消息 }MSG_Info; #pragma pack(pop) ```**MsgBattle**``` enum MSGBATTLE_ACTION { MSGBATTLE_None, = 0, //无效 MSGBATTLE_BattleStart = 1, //战斗开始 MSGBATTLE_BattleEnd = 2,
2 min read
游戏开发

一种可以守护多个程序的守护进程的实现方案

* 账服需要守护程序,原来的守护程序使用的一对一的方式,技术部希望我们能提供一对多的守护程序,这样他们可以不用区分哪个程序守护哪个账服,多开时比较方便。 * 原来的守护进程的做法是先启动守护进程,然后守护进程通过CreateProcess启动账服程序,然后调用WaitForSingleObject挂起等待账服进程,如果返回,说明账服崩溃了或者被关闭了,那么就重新启动账服,不断循环。 如果一个守护程序要同时守护多个程序,那么原来的方案就适用了。 * 于是我们采用了另外一个方案: 1. 在文件中配置需要守护的所有程序 2- 每隔一段时间(可配置在文件中,如5秒),遍历一次所有进程(可以使用ToolHelp32也可以用enumprocesses),获取进程的可执行文件的完整路径文件名,和配置内的程序进行匹配 3- 如果无法找到,则重新启动这些程序 * 方案优缺点分析: *
1 min read
游戏开发

3D地图和场景管理

其他项目的做法 * 方案 1. 将场景用八叉树划分,最多三层 2. 物体根据坐标直接加入八叉树的叶节点(忽略了体积和包围盒) 3. 移动采用完全相信客户端的做法 4. 通过MoveState来记录移动过程,客户端上传开始位置、结束位置、持续时间信息,服务器根据开始位置和结束位置、以及时间计算出速度。 5. 只有在其他对象主动查询或者RegionSwitch的OnTimer时候,才会做移动,八叉树节点切换 6. 如果没有主动查询,中间过程是没有体现的 * 疑问 1. 如果出现网络延迟,客户端中途改变移动方向或者目的地点时,两端的位置会有严重偏差,这时如何同步? 2. 如果地面上有陷阱,在起点和终点之间,是否会被触发? 3. 忽略了体积的情况下,如何做碰撞检测? TrinityCore的做法 TO-DO 我的想法 1. 场景用八叉树管理,在八叉树中只保存动态物体,如玩家角色、NPC、怪物、子弹等,姑且称为动态检测。八叉树可以用来做广播和碰撞检测,
3 min read
游戏开发

3DMMO游戏服务器架构

服务器框架 备选资源 1. NavMesh 2. 3D碰撞检测 3. 网络通信 * 连接协议 * RakNet * ENet * libuv * 消息协议: * ProtoBuf * MsgPack * BitStream:RakNet集成 网络通信协议的选择 * 结论:由于客户端最后选择了UNITY3D引擎,所以有些选择考虑到客户端的实现做了妥协。最后选择了libuv+byteStream,并且自己做了一层封装,起名为UVSocket。代码我提交到了oschina。 代码库:UVSocket * 原因: * 首先,如果不考虑客户端,我的首选会是RakNet,毕竟是老牌的游戏通信库,而且UDP从延迟角度来说也更适合用于网络游戏。并且收发包没有分包合包的烦恼。但是RakNet并没有官方的C#实现,因此客户端担心和
4 min read