下面是一个简单的RPG游戏架构设计方案,实现了RPG游戏的基本功能(故事情节、战斗)。

  整个系统以RPGGameEngine模块为核心,周边包括了故事情节(Script)、战斗(Fight)、显示(Graphic)、声音(Sound)、输入(Input)几大模块。如图所示

    

游戏系统架构是什么 游戏系统架构设计_RPG

  RPGGameEngine工作原理很简单,主要思路就是通过设置一个状态变量来标志当前要执行的状态,这个变量用Message表示。游戏的主循环在RPGGameEngine中,这个主循环首先更新外部输入信息(Input模块,如键盘、鼠标、摇杆等)。然后,根据输入信息来更新游戏状态(如玩家行走、遇敌等),而后执行Script脚本,更新剧情。这个Script模块根据已经经过的时间、当前角色的状态、角色位置等信息来决定剧情的发展方向,设置游戏状态。执行完成这些后,游戏根据游戏状态的不同而转入不同的处理中,如状态为战斗则调用战斗模块处理,状态为行走则调用行走函数处理。最后,将更新后的图像显示到屏幕,将更新后的声音输出。

  其内部的游戏主循环函数流程如下

void MainLoop()
  {
    while(1)
    {
      //第一步:执行Input模块,更新输入信息
      //第二步:根据输入信息更新游戏状态
      //第三步:执行Script,更新剧情
      //第四步:根据Message执行不同动作
      //第五步:更新声音
      //第六步:更新屏幕显示
    }
  }

第一步:执行Input模块,更新输入信息

  这一步主要是将键盘鼠标等外部输入的信息按照系统关注的方面和方式记录下来,以供下一步使用。这一步收集的是最原始的输入信息。

第二步:根据输入信息更新游戏状态

  根据上一步提供的原始输入数据和Message的值,更新角色位置等信息。Message的值很重要,比如Message在对话状态下,即使玩家按住up键,也不能让角色向前移动。

第三步:执行Script,更新剧情

  调用Script模块,该模块实现剧情部分,也是整个游戏的逻辑部分。Script模块通过判断玩家位置、时间等信息,结合自身逻辑改变游戏的状态。

第四步:根据Message执行不同动作

  就好像电话接线员一样,此处通常是使用switch语句直接找到对应的case,跳入执行。根据Message的不同,转入不同状态的处理函数中。比如对话状态就转入对话内容显示函数,战斗状态就转入战斗模块中处理。

第五步和第六步:更新声音和图像

  在第四步处理完成后,需要将最终的显示和声音结果输出。此处需要用到图形引擎和声音引擎。

  例如,实现一个最简单的RPG游戏,小新去打酱油的故事 XD。整个流程是这样的,首先定义Message一共有自由行走、战斗、显示对话、操作完成、NPC人物移动共五种状态。默认小新站在家门口,状态为操作完成状态。

  游戏开始,玩家通过小新与妈妈的回话得知此次任务是要去打酱油(-_-|||)。对话的流程是这样的,Script设置好要显示的对话内容后,设置Message为"显示对话"状态,此时MainLoop会根据Script设置好的对话内容在屏幕上显示出来对话,当玩家点击鼠标时,对话框消失,Message变为"完成状态"。Script检测到"完成状态"后,装入下一段对话内容并重新设置Message为"显示对话"状态,继续等待完成。如此直到所有对话完成,此时Script设置NPC-妈妈移动到家里的坐标并将Message设置为"NPC人物移动"状态,等待移动完成。完成后,Script设置Message为"自由行走"状态,此时Input消息处理流程才会将玩家输入的上下左右等方向更新到角色上,使角色移动位置。当角色移动到NPC-酱油店老板时,被Script检测到,而后与酱油店老板发生剧情对话(对话方式见上文),没想到老板不给打酱油,为了完成任务,小新只好与酱油店老板死磕了。。。Script配置好战斗双方的参数后,设置Message为"战斗状态",由此进入战斗,战斗模块在处理完成后,将结果放置到预先分配好的变量中,而后置Message为"操作完成"状态。Script在检测到后,显示对话(方法略),至此任务完成。

  系统的重点在于Message状态的变化,如对话,显示到屏幕上以后,Message仍然是对话状态,直到用户点击鼠标后,一切关于这次对话的流程都进行完成后的那次while循环中,才会将状态变为"操作完成"。

  此设计方案只实现了一部分RPG 游戏中最基本的元素,后续计划加入NPC系统、剧情脚本、物品系统、地图切换等功能,敬请期待~~