首页 » 技术分享 » 碰撞球小游戏开发总结

碰撞球小游戏开发总结

 

 最近有空的时候自己用java开发了一个小游戏,也算是弥补自己对这方面的空白。其实游戏开发中考虑的东西大部分都一样,比如碰撞检测,背景位移,计分,生命值计算等。在开发碰撞球的过程中,对android中的SurfaceViewRectRectF有了进一层的认识。

预览图

 

 

 

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_OFFSETy + Constant.Y_OFFSET);

Matrix m2 = new Matrix();// 旋转矩阵

m2.setRotate(angelrotateXrotateY);

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


转载自原文链接, 如需删除请联系管理员。

原文链接:碰撞球小游戏开发总结,转载请注明来源!

0