整个项目的ddl为2019-10-21,所剩时间不是很多,按照重要度列出一些功能一个一个来做吧,能做多少做多少。
基础场景与移动
我们只需要墙、天花板、地板三种纹理,而渲染他们的时候都用一个正方形的形式进行渲染。最初的时候,建立一条直线道路,四周都设上围墙进行测试。
接下来是镜头移动,希望能够实现按下trigger开始向所看的方向行走,松开trigger则停下。由于这一代的Google Cardboard按下trigger等价于点击屏幕,虽然SDK里面仅仅提供trigger按下的回调函数接口,也有可能通过处理点击屏幕事件来完成所希望的功能。
然后,实现简单的碰撞机制,也就是对每一帧,在绘制之前你要更新镜头的所在位置,并依据这个位置进行新一帧的绘制,如果在镜头的移动过程中撞墙了,则要将镜头位置停留在墙上。事实上,为了避免跟墙零距离,在计算碰撞时我们将墙的范围向外扩大一点。考虑到地图规模,墙的数量不会很多,我们暴力实现即可。
迷宫自动生成与简单游戏机制
迷宫是2D的,可用一个的矩阵描述,其中$0$表示道路,$1$表示墙,$2$表示起点,$3$表示终点。游戏应当每次随机生成一个新的迷宫。一开始我想到的是由于四连通图,随机一些道路块,并构造它们的斯坦纳树。但是这样的话能处理的数据规模太小。后来在网上找到一种方法,直接通过随机权值通过Kruskal构造最小生成树,由于初始状态的巧妙构造使得无需计算斯坦纳树。决定实现这个算法。
再简单的补完游戏机制:与终点处的门碰撞后就算通关,按下trigger后,回收当前场景所分配的内存,并重新建立游戏场景开始游戏。
至此,一个简单的迷宫游戏已经完成。
绘制细节优化
- 你手中有一个手电筒,除此之外场景是暗的。相当于整个场景只有一个点光源,这种情形比较简单。只需稍微更改着色器即可。
- 加上一些法线贴图、材质贴图等使得这个场景更为逼真。
- 我们并不想场景过于单调,因此可以使用纹理随机化生成算法。
- 为了在屏幕最上方显示一些游戏信息,如电池电量、已过去的游戏时间等信息,我们需要完成文本的渲染。可以参考文本渲染。
游戏机制与实现优化
- 某些墙可以在直视着它的情况下按下trigger进行探索,可以找到手电筒的电池和颜色不同的钥匙,一把钥匙只能打开与之颜色相同的门,这加大了游戏难度。
- 使玩家具有碰撞体积,但仍然局限于2D。这样玩家可能需要通过改变方向来绕过某些障碍物或者躲避陷阱。我们可以设计会动的陷阱,比如齿轮、地刺等,这样更加有趣。
- 对实现进行优化,尽可能提高渲染帧数,提高游戏流畅程度。
我目前的设想就是这样,我们慢慢来就好。