您的位置:首页 > 其它

碰撞球小游戏开发总结

2014-11-29 10:14 155 查看
最近有空的时候自己用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: