现在的位置: 首页 > 综合 > 正文

山寨腾讯“爱消除”游戏7日教程–DAY7

2013年12月02日 ⁄ 综合 ⁄ 共 2820字 ⁄ 字号 评论关闭

【课程内容】今天将完成记分系统的设计,并对开发“疯狂消除”游戏用到的技术做一个小结。

【源代码下载地址】http://download.csdn.net/detail/elong_2009/6468177

 

终于要结束了,已经连续7天了,虽然每一天我们花在代码上的时间其实并不多(我大部分的时间事实上花在了用文字将整个设计开发过程真实记录下来( ⊙ ⊙ ))。如果您已经认认真真地按照我第一天说到的方法进行了实践,那您一定已经抓到了本次课程的本质。相信只要配合一个稍微厉害一点的美工,不用一个月时间,你也能开发出《植物大战僵尸》这样的游戏来。(说实在的,就是“疯狂消除”用到的这几张简单的图片,也耗费了我整个开发的近一半的时间,因此说,有个合格的美工,会事半功倍!)

到目前为止,游戏的基本雏形已经完成了。加上今天的记分系统,可以说已经是一个完整的游戏,当然还有很多功能等待您继续完善。

 

1、计分系统

本来不打算设计计分系统的,因为这个着实没有什么技术含量。不过自己玩了几天自己设计的“疯狂消除”,没有计分系统确实很不过瘾,索性就简单的设计了一个,玩起来确实感觉爽了很多。也许这就是计分系统自身的魅力所在吧。

 

package elong.CrazyLink.Core中,创建了一个Score类来处理计分。

在每次消除动作完成时,我们判断如果有消除发生,则会调用score对象进行计分,同时动画渲染一个tip

case DISAPPEAR_END:

{

int clearCnt = clearPic();

score.award(clearCnt);

if(score.getAward() > 0)

{

drawTip1.control.start(clearCnt);

}

clearInline();

markFill();

break;

}

 

另外,我们会在markInLine中根据本次操作是否实现了消除来决定分值计算是否翻倍。以增加游戏的趣味性。(这样设计,连续消除次数越多,得分就会越高)

 

static void markInLine()

{

int markCount = 0;

for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)

{

for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++) 

{

if (isInLine(i, j))

{

mStatus[i][j] = 4;

markCount++;

}

}

}

if (markCount > 0)

{

drawDisappear.control.start();

score.increase(); //增加计分系数

}

else

{

score.reset(); //复位计分系数

}

}

 

详细的计分代码请参考附件。

 

 

 

2、相关的OpenGL ES技术小结

2.1对纹理图片的要求:

OpenGL ES中进行纹理映射时对纹理图片的尺寸是有要求的,纹理图片的宽度和高度必须为2n (2n次方),即32x32256x512等。如果图片不满足这个要求,可能在一些设备上显示正常,而在一些设备上直接看到白屏。

 

2.2所有的操作都基于三角形

OpenGL ES中,并没用提供绘制正方形的操作,绘制一个正方形,需要转换成绘制两个三角形。

 

2.3背面裁剪

打开背面裁剪功能后,视角在三角形的背面时不渲染此三角形(即无法看到此三角形),该功能可以提高渲染的效率。

因此,我们需要保证在观察方向上渲染三角形,否则就有可能会看不到所绘制的图像。很多初学者经常会遇到这个问题,如果您绘制的三角形没有按预期出现,您可能需要检查是不是这个原因引起的。

以下是确定一个三角形正反面的方法:通常情况下,当面对一个三角形时,如果顶点的顺序是逆时针的,则位于三角形的正面;反之就是反面。

 

2.4正交投影

本教程最后采用的是正交投影。所谓正交投影是平行投影的一种,观察者的视线是平行的,不会产生在真实世界中的远小近大地透视效果。

设置正交投影的语句为gl.glOrthof(left,right,bottom,top,near,far)

其中的leftright为视口左右侧对应的x坐标,bottomtop为视口上下侧对应的y坐标,nearfar为可视空间区域最近端与最远端的z坐标。

 

2.5字节序的问题

不同平台其字节序有可能不同,如果数据单元不是字节的,就一定要经过ByteBuffer进行转换,转换的关键就是要通过ByteOrder设置为nativeOrder(),以适应对应平台的字节序,否则就有可能会出现问题。

ByteBuffer cbb = ByteBuffer.allocateDirect(textureCoors.length*4);

cbb.order(ByteOrder.nativeOrder());//设置本地字节顺序

 

2.6透明的叠加效果

要实现透明的叠加效果,关键的地方是在onSurfaceCreated 中加入以下几行代码:

            /*透明效果对素材图片也要求,要求图片的背景是透明的*/

         gl.glEnable(GL10.GL_BLEND);  

         gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  

         gl.glEnable(GL10.GL_ALPHA_TEST);

         gl.glAlphaFunc(GL10.GL_GREATER,0.1f);

 

2.7堆栈技术

OpenGL ES中,调用glPushMatrix()glPopMatrix()方法进行堆栈操作。

glPushMatrix()表示复制一份当前矩阵,并把复制的矩阵添加到堆栈的顶部;glPopMatrix表示丢弃堆栈顶部的那个矩阵。

可以这样理解:glPushMatrix()记录下当前坐标的位置,经过一系列的平移、旋转变换之后,调用glPopMatrix()回到原来的坐标位置。

 

【后记】现在你知道山寨的力量了吧!我们用7天(10个小时,每天约一个小时)左右的时间,就掌握了山寨一款游戏的必备技术。呵呵,那么,反过来呢?如果您有一款好的作品,别人要山寨你,是不是也很容易?尤其是......

 

由于时间的关系,本教程没有考虑对不同分辨率的屏幕进行适配(在480*800480*854上应该可以正常运行)。而对不同屏幕进行适配,是一项精细的活。如果碰巧在您的机器上没有正常显示,那么你可以简单修改CrazyLinkConstent.UNIT_SIZE来与您的屏幕匹配。

另外,我们抛砖引玉地介绍了几种渲染特效的设计方法,类似的,您还可以发挥您的才智,设计出更多更炫的特效来。如果你做了这方面的工作,希望你也能分享出来。

 

 

抱歉!评论已关闭.