最近有空的时候自己用java开发了一个小游戏,也算是弥补自己对这方面的空白。其实游戏开发中考虑的东西大部分都一样,比如碰撞检测,背景位移,计分,生命值计算等。在开发碰撞球的过程中,对android中的SurfaceView跟Rect与RectF有了进一层的认识。
预览图
1.基本组成:
游戏比较简单,主要角色对象分为三类,如下图所示,Brike,Ball,Staff.
Brike:抽象类,因为需要存在两种不同的砖块,它们既存在相同的属性值,也存在不同的方法与属性。RedBrike(红砖)与WhiteBrike(白砖);
Ball:为运动时的球。
Staff:为以下接球的杆
BG:使用SurfaceView绘制的背景
2:技术点
1.图像位移
游戏制作过程中,如果让图片动起来是一件很重要的事情。其实主要是依靠二点,一个是SurfaceView的不停绘制,一个是动画本身对象坐标值的改变.例如在上述中,如何让我们的球动起来,这里我们在Ball类中存在一个方法,
public void fly() {
float tempX = x + velocity_x;
float tempY = y + velocity_y;
if (needfly(tempX, tempY)) {
x = tempX;
y = tempY;
float v = (float) Math.sqrt(velocity_x * velocity_x + velocity_y
* velocity_y);
bmpIndexf = bmpIndexf + Constant.K * v;
bmpIndex = (int) (bmpIndexf) % ballpics.length;
}
}
在主视图中启动一个循环线程来执行上述动作,然后SurfaceView去绘制,自然就达到了移动的效果,背景移动也是一样,通过更改背景绘制坐标值来达到背景移动的目的。
2.碰撞检测
游戏中,我们常常需要处理2个物体中间的碰撞事件,例如我要制作一款飞机大战的游戏,如何才能知道飞出去的子弹击中了敌军的对象呢? 在游戏中,我对球与砖与杆的碰撞检测是使用RectF与Rect来完成的。Ball中的x,y轴坐标值为圆心点的坐标值,碰撞检测的时候,是用(x+r,y),(x-r,y),(x,y+r),(x,y-r)与Staff或者Brike中的RectF对象来比对,如果Recf.contans(Point) 为true的话,我们可以认为两者存在碰撞的事件。
3.矩阵
Matrix m1 = new Matrix();// 平移矩阵
m1.setTranslate(x + Constant.X_OFFSET, y + Constant.Y_OFFSET);
Matrix m2 = new Matrix();// 旋转矩阵
m2.setRotate(angel, rotateX, rotateY);
Matrix mz = new Matrix();// 综合矩阵
mz.setConcat(m1, m2);
这里处理的意思,在于球的角度变化,一旦存在碰撞的事件,那么球则以(180-angel)的方式反射出去。
4.关卡设计
主绘制类中定义失败与胜利的方法,在Ball碰撞检测中判断,如果当前Ball的生命值为0,并且Ball的个数为0。则判断失败,如果Brike集合为0,则进入下一关,只需将所有的Brike集合充值即可,至于如何设计关卡难度,当然是见仁见智了。
游戏还存在一些问题,比如使用canvas绘制的时候,有时候对象会丢失canvas对象。一个简单的游戏基本上包含上述元素,安卓中使用Java来做游戏的效果并不理想,不过用来学习SurfaceView的使用还是蛮不错的。
下面给出源码(可以直接运行)。
http://download.csdn.net/detail/zjfengdou30/8207195
转载自原文链接, 如需删除请联系管理员。
原文链接:碰撞球小游戏开发总结,转载请注明来源!