地图部分(World Map):地图部分很简单。首先,它被相应的脚本调用;然后,基于子功能,或者相应当前的用户输入,或者忽略;最后,就是屏幕上的人物更新,地图被显示,再根据用户的输入,地图不断的得到更新。就这些!
菜单系统(Menu System):这部分有一点儿复杂,因为它要掌控每一件事情,包括加载游戏、创建角色,设置硬件等等。主函数根据菜单的不同功能,把菜单设置成不同的颜色,然后子菜单根据需要再有自己的子菜单。菜单通常都通过指针数组来实现。游戏中的子系统通常都是一个整数标识,从而方便数组的索引。就像下面这样: (*lpfnMenuSubfunctions[substate.current])();
如果你对上面这一行感到困惑,那么你有必要复习一下C语言的指针函数部分,此时,结合实际的情况,你可能对指针的理解更深刻一些。每一个子菜单都操控着一个细节。当玩家选择不同的菜单条,就要有程序实现其相对应的功能,并保证在当前的帧得到显示。当然,如果有必要显示的话。做到这些,主菜单函数需要运行当前的脚本,申请(调用)相应的动作,从而显示相应的画面。如显示当前的金块儿数量,或者是游戏角色的状态等等。
战斗系统(Battle System):战斗系统和菜单系统紧密的联合在一起。战斗系统是一个半自动系统(semi-active),就像《最终幻想》系列(如果你还不知道《最终幻想》这个游戏,我、我、我倒),任何时候都是弹出菜单系统,来半控制角色进行打斗(因为具体的打斗动作,是由脚本控制的),而战斗系统也同时控制菜单系统,因此,战斗系统和菜单系统相辅相成。战斗的逻辑如下:
首先,判断所有的游戏角色是否通敌人的距离足够近。如果是敌人主动靠近游戏角色,则敌人的AI(人工智能)接管,并为敌人做出一个选择;如果是游戏角色主动靠近敌人,并且当前的菜单系统不是战斗模式,那么,战斗系统菜单启动,然后由玩家进一步操控游戏角色。如果此时菜单系统被另一个游戏角色操控,那么把当前要调用的菜单放入队列,等待调用。一旦前一个菜单调用完成,计算机(也就是你的程序)要检查该队列,如果不为空,就启动相应的菜单。
以上的任何一种情况,即敌人走近游戏角色或游戏角色走近敌人,一旦成立,则进入下一个环节——调用动作队列。每一次战斗逻辑(可能来自战斗系统调用,也可能来自菜单系统的调用)需要判断两件事:如果有战斗动作正在进行中,则由脚本控制完成;如果没有战斗动作发生,则检测战斗动作队列,如果队列中有下一个动作,就交给脚本控制完成。
与普通敌人的战斗(Regular Fight)和与Boss(关头人物)的战斗(Boss Fight)不同之处在于,与Boss战斗时,游戏角色不能逃跑——你必须血战到底(很残酷哦!),用一个简单的if结构就完成了这个设定。第三个子菜单是胜利(Victory),它有一点儿不同,它报告战斗的成果,不用有什么逻辑判断,通常都是由脚本控制这一步。
脚本(Scripts Only):这是游戏主要部分的最后一个部分了。它很简单:就是运行被调用的脚本,仅此而已!它通常都不被玩家所觉察,除了在游戏初始化的时候,有的游戏打出一些初始化序列的字幕。不过,无论是在游戏过程中正常出现无显示画面的时候,或者是计算机处理后台作业的时候,它始终是工作的。(无名英雄)
游戏结束(Shutdown):顾名思义,就是结束游戏:它使程序退出主循环,释放所有在游戏中创建的DirectX的对象,释放所有的游戏占用的内存,然后结束游戏。
主循环的最后一步是显示当前的帧,就是简单的把后缓冲区的内容拷贝到屏幕。如果是在Windows模式下,还得使用双缓冲区;如果游戏是在全屏模式下,还得需要页面切换。