网络游戏一般采用C/S结构,客户端负责绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的画面绘制,客户端与服务器通过网络数据包交互完成每一步游戏逻辑。
网关服务器只负责解析数据包、加解密、超时处理、过滤错误包,客户端只需建立和网关服务器的连接即可进入游戏,无需与游戏服务器直接连接。
网关服务器分为LoginGate(登录网关服务器)、GameGate(游戏网关服务器)。
1.LoginGate主要负责在玩家登录时维护客户端与LoginServer之间的网络连接与通讯,对
2.LoginServer主要功能验证玩家账号是否合法,并生成一个登录凭证SESSIONKEY。
3.GameGate主要负责客户端与GameServer之间网络连接和通讯,对客户端请求和发送数据做简单分析。
4.GameServer主要负责游戏逻辑处理,包括战斗系统、任务系统、角色系统、地图系统等。
事件系统是整个WebGame系统里一个核心的组成部分,它控制着游戏的进程,使游戏能够及时执行到期命令。
玩家从NPC里购买一瓶药水,在玩家发出这个指令后,玩家的金钱减少,药水增加1瓶,这一切都在玩家发出指令后瞬间完成。
例如RPG游戏里玩家鼠标点击地图上某个怪物进行攻击。这个攻击过程就是一个非瞬时过程,它有了一个战斗的过程,这个过程需要消耗一定的时间。
例如在策略游戏里升级建筑物,瞬时事件是村庄资源减少,非瞬时事件是建筑物建设,非瞬时事件的结果是建筑物等级上升。
比如策略游戏中的军队战争,瞬时事件是当前村庄的士兵减少,非瞬时事件是减少的士兵移动到需要攻击的村庄,结果是,两个村庄开打了。
LINUX消息队列存储的优势在于降低了PHP进程对数据库查询压力,缺点是服务器宕机,内存中存储的消息事件队列将会丢失,RPG打怪事件队列丢失影响不大,只是当前打的这个怪物无效,但是其他类型的事件队列丢失话有可能影响巨大,还有查询到期事件的效率问题。
客户端玩家发起战斗事件指令,服务端PHP接收到该事件,进行战斗合法性验证后将该事件即相关运算数据存储到LINUX消息队列中,PHP战斗进程监听LINUX消息队列。
2.PHP运算进程在运算完之后将运算结果写入玩家战斗结果DB内存表中存储,并将战报借助IM推送到客户端进行播放。(注:战斗结果是存DB中还是存入LINUX消息队列或MEMCACHE内存中?)
4.避免玩家重复发起战斗事件,可以在服务端通过玩家ID验证是否有正在战斗的战斗队列。(注:是否需要做服务端战斗状态验证?怎么做?查询检索?)
综上分析,服务端战斗相关进程会有两个以上,PHP监听战斗事件并运算进程,PHP监听战斗结束进程。PHP处理战斗运算进程可以扩展出战斗运算分布式服务器。
对于任何项目,一个好的数据库设计极其重要,对于WEBGAME来说就更是重中之重了。一个好的数据库设计相当于一付好的骨架和脉络,当你的骨架搭建好,脉络理顺后,再进行游戏功能代码的时候将会非常顺畅。