您好,这是本人的DEMO文档,涉及到的相关知识都会列出
游戏名称:地下城与勇士演示DEMO
游戏类型:2D多线动作游戏(ACT)
涉及到的相关内容:
1 游戏架构
游戏主要类分为 战斗类(掌管整个逻辑判断以及主框架)场景管理器 场景类(管理场景,切换场景) 敌人类 玩家类 障碍物类(3个类继承自单位类,用于深度排序,下详)攻击类(敌人与玩家的攻击动作会生成攻击判定对象,与玩家或敌人做碰撞检测) 敌人与玩家的对象在坐标位置发生移动时,需要与障碍物进行碰撞检测。敌人类与玩家类会通过攻击判定类进行互动。
所有敌人与玩家以及碰撞单位,攻击判定等等的属性信息(如被攻击判定区域,碰撞区域,初始位置等等),全部都由外部txt文件读入。
2 3D空间坐标系
游戏为2D多线动作游戏(如地下城与勇士,恐龙岛,双截龙等),由于存在多线与跳跃的概念,所以坐标系为XYZ组成的3维坐标系。Y轴与Z轴在渲染的时候,采用相加的方式,被合成到了同一个坐标上,然后渲染到屏幕的Y坐标位置。所以如果站在一棵树下方,可以跳跃(Z坐标变化,Y坐标不动),但是不可以向上走(Y坐标变化,与树发生碰撞,Z坐标不动)。
3 Z轴变化
游戏在Z轴上的事件(跳跃,打击浮空等),是用一个全局的重力加速度,模拟抛物线运动的。
4 障碍物碰撞
游戏默认的障碍物都是无限高的,因此需要在X坐标与Y坐标更新时与障碍物进行碰撞检测。游戏采用的方法是:在场景构造时,就用一张后台黑白图,将可行走区域标注为黑色,不可行走区标注为白色。之后通过外部文件读取,构造所有障碍我。按照障碍物的坐标以及碰撞区域大小,将后台图片中相应位置刷新成白色,在单位坐标发生移动时,利用函数GetPixel()函数获取相应位置的颜色,进行碰撞检测。
单位与单位(敌人,玩家)之间在移动时不发生碰撞。
5 深度排序
为了使所有单位在渲染时有正确的遮挡关系,就有必要进行深度排序(远处的树不能挡住近处的人)。游戏内建立了一个单位类,只有一个成员属性Y坐标,以及一个渲染的纯虚函数。玩家,敌人,障碍物3个类继承自这个单位类,并且重写了这个渲染的函数。在需要渲染所有单位的时候,首先用一个单位类的容器,对他们进行深度排序,之后遍历这个排序后的容器,调用渲染的函数。当父类的指针指向子类的对象时,程序会采用动态联编的机制,在运行时根据指针的指向调用相应的函数。进行深度排序后,即可保证单位之间有正确的遮挡关系。
6 滚屏及换区
游戏在有必要的时候,进行了滚屏与换区。换区时所有敌人单位,障碍物都会通过外部txt文件重新构造,以及更新后台碰撞用图片。
7 攻击判定与单位互动
游戏在单位做特定的动作时,会在特定帧产生一个攻击判定对象,添加进战斗类的攻击判定容器里。然后在当前帧遍历攻击排定的容器,与敌对单位进行碰撞检测,如果发生碰撞的话,更新被攻击对象的状态。之后在当前帧最末尾,清空这个攻击判定容器。
8 特效
特效是指除开 玩家 敌人 障碍物 场景之外的其他图片,在游戏中存在一定时间后消亡(如:攻击时产生的剑光,伤害数字,技能释放时的动画)。战斗类中有一个成员是特效的容器,在触发特效时将添加一个特效进入容器,特效动画播放完毕后移出容器。此外还有几个特殊的特效,如单位死亡时的白色剪影,角色在取消动作时的残影,角色的霸体特效,都是通过一张单色bmp图片,与单位当前帧进行异或操作来完成的。
9 复合指令及AI
游戏部分指令需要输入后才可以触发(如后 前 L),敌人拥有自制的简易AI。叫小R修改。
中华游戏网 cnyouw.cn