《痕》
——chapter 2 魔卡
这个游戏的故事承接我上一个小游戏,讲述主角佑利用卡片的力量脱离了迷宫,但之后却被卷入了卡片世界,这个游戏就是讲述他解决各种困难、谜题和任务,在12小时内集齐60张卡片后回到现实的故事。
玩游戏本是一件愉快的事情,但有样东西却令我们的情绪时高时低——这就是Loading画面。回想起Square-Enix的PC大作《最后的神迹》,画面精细而美(哎,什么时候能做到这个效果),战斗系统新颖,而我对它最有印象的是它的Loading,多而久(可能是我电脑差吧),使游戏时兴奋地情绪不能持续下去,这难道不是一件伤心事吗?
天真的我刚看完《3D游戏程序设计入门》,就想试一试能不能用多线程——主线程执行渲染,其他线程填充数据到显存,填充完毕用一个Flag标识可以渲染了,则在主线程可见。结果当然是失败了…………
主要架构:
1. 地形:
本来计划是用3DMax 制作好多地形区域,然后读取并显示以主角为中心的25个区域(或者更多),如下:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
当主角离开13号区域,则程序检测到然后计算缺少的区域,并填充,渲染和填充并行,当填充完了,地形又出现以主角为中心的新25个区域。
这样,这些地形Meshes可以为PMesh,远离时候精度降低,也可以用视锥检测,所见才渲染。
可惜,不会用3DMax,目前只学了《3D游戏程序设计入门》里面的地形模式,那就把这25个区域再细分,每个区域8X8个顶点(或者更多),每个顶点可以指定自己的贴图(有点像RO)。根据这个模式,写一个简单的地形编辑器。
这时尝试了几种方案:(这些都是用动态顶点缓存的)
1. 用新的线程更新地形,主线程渲染,地形分2组,每组都是以主角为中心的25个区域,当填充好后转换组别渲染。
2. 用主线程填充,渲染,地形也是分2组,每组都是以主角为中心的25个区域,当填充好后转换组别渲染。
3. 用新的线程更新地形,主线程渲染,地形分2组,第二组计算需要添加的新的区域,并加上和第一组中没有变化的区域组成以主角为中心的25个区域,只填充需要添加的新区域。
4. 用主线程填充,渲染,实行第三个方案。
5. 用主线程填充,渲染,地形只有1组,当需要更新地形时候,锁定顶点缓存,更改之。
经过测试,渲染时候的帧数竟然是 2 最高。 用多线程,会让画面一卡一卡的,非常不舒服。得出可能结论:
1. 顶点缓存连续存放后渲染效率最高?
2. 顶点缓存锁定更改的效率非常差?
3. 目前来说,多线程编程对于我来说,我还未能很好地处理。用多线程的时候问题非常多,改单线程后问题全部消失了。
后备方案:
《3D游戏程序设计入门》里面的粒子系统里面也有用到动态缓存,是否也应该这样:
申请几倍(>2)的顶点缓存空间(25个区域),然后填充第一个堆,检测地形需要更新时,开始填充第二个堆,填充完后渲染,如此……不知道会不会更加快呢?
地形的贴图做了少少处理:
1. 只更新第二组地形和累计总贴图缺少的贴图。
2. 累计更新一定次数后才释放没有用的贴图。
3. 如果主角从两个相同的地形组别来回移动,不更新贴图。
SkyBox的Bug很多。不知道为什么天空总是有条缝,而且Skybox的位置是根据主角的位置来调整的。所以读取存档后,Title会出现Skybox跑出来。影子和月亮是为了辨别方向暂时先放上去的。这个地形因为不是平坦的,所以不能用“直砍式”影子,用SDK里面的阴影值可以做到。学完cg后添加上去。
地形编辑器我没有仔细处理好地形,只是大概划分了地形高度和贴图分布,地面凹凸不平。
2. 角色:
1个角色可能在场景里面出现多次,不应该每出现一次,就读取.x文件一次,那么必然绝对是卡卡卡……
游戏里面做到了以下几点:
1.相同的怪物,共用1个模型和动作,以及根据怪物名字来读取贴图,且共享同一个贴图文件。但骷髅怪物没有贴图。
2.主角有自己的模型,而且动作很多。主角的贴图也是根据自己的名字读取的。
3.村民共享主角的模型和动作,现在是随机动画。但每个村民可以根据自己的名字来读取贴图。也就是每个村民可以不同样子。
4.攻击方面,骷髅是远距离攻击,不过武器没有写,所以现在只有动作。影子是近身攻击,4个动作随机。攻击击中会有音效,而且会弹开敌人,敌人可以攻击自己敌人。弹开的远近和攻击力,角色的重量和招数有关。
5.主角可以回避攻击,只要时机恰当,是可以回避到的。方法是配合键+相应的攻击键。
6.怪物死亡后会随机位置重生。
7.主角根据视觉来左右上下移动,并且所有角色做了碰撞检测,碰撞时候平滑过渡,不会停留。不过当接近垂直角度和物体碰撞就会停。地形也是。
8.写了以个根据摄像头距离来自动装载和卸载资源的函数,这是根据当初希望用多线程管理数据的计划来写的,不过角色数据太大,读取时候会卡一下。所以是失败的……不过我相信以后会有办法的。
主角的人物动画如下:
1.Loiter —— 什么都不做时候出现的
2.Walk ——慢步走,键盘操作不能出现,手柄摇杆拨动的幅度少就出现。
3.Jog —— 漫步跑。
4.Jump —— 向前跳
5.Sit —— 坐
6.Swim—— 游泳,当主角碰撞检测到水时,就转换为游泳动作,水这个物体还没有写。而且水的效果还不会,学完cg后添加.
7.Push —— 推,现在可以什么时候都出现,以后为碰撞到可以推动的物体才允许。
8.Death —— 现在角色都是1000血,没有就出现死亡。
9.LFist ——左拳,攻击力一般,速度最快
10.RFist——右拳?
11.BeatenUp——被攻击上半身时候出现。
12.BeatenMiddle——被攻击中间出现。
13.KickUp——上踢。不保证踢中的话别用。
14.KickMiddle——中踢。速度和攻击力不错。
15.AvoidUp——回避上攻击
16.AvoidMiddle——回避中攻击
目前主角的连招有 9 - 10 - 13 或者 9 - 10 - 14 - 13
这些Bip都是网上找到的。我觉得比较好看的。
3.UI
目前只做了Title。
4.输入
游戏支持两种输入,当检测到可用的手柄时候是用手柄,没有的话就用键盘。
震动是做了,可惜效果还不会写,不会根据情况而震,所以就暂时不用了。
5.摄像头
摄像头是根据《3D游戏程序设计入门》里面的摄像头改写的。人物可以根据视觉来进行正确的左右上下移动,我觉得还是这样舒服。并且写了一些碰撞。
游戏里面的全部物体和角色都进行了简单地看见性检测。
6.物体
物体也是和角色的原理差不多,也是用实例管理的。物体都是PMesh来的。所以远近的精度不同。而且也和角色一样写了一个根据和摄像头距离而自动装载和卸载资源的。物体的数据不大,所以可以很好的工作。
现在物体的种类只写了几个子类:树,石头,桥,水,房屋。
只有树和房屋时测试过可以的。其他不会做模型,所以没有测试。
用添加器添加物体时候,默认的话都是随机位置的。和角色一样。
7.其他
Graphics类和System类是从书中代码改了一部分后直接用的。
WaveFile是SDK里面的例子。
PSystem是《3D游戏程序设计入门》里面的例子系统。游戏里面暂时没有使用。
Media是封装了播放Mp3等等Media的类。不过现在暂时只是播放Mp3而且只放1次,以后会逐渐添加好功能的。
最后,目前游戏还很不完美,Bug很多,不过致命Bug我暂时还没有发现,只要你不跑出大地图,不发生找不到贴图就不会出错。
还有很多没实现的方案:(学了cg后再实现)(目前被cg吸引了)
1.攻击的效果。
2.技能不够炫。(攻击的Bip文件不多)
3.各种光效。
4.水,瀑布,火,影子,
5.……………………还有好多。