ANDROID游戏开发——我在写飞机类游戏时遇到的一些问题与思考

来源:互联网 发布:白帽优化 编辑:程序博客网 时间:2024/05/16 17:36

最近,准备偿试写ANDROID游戏,由于本人第一次写ANDROID游戏,所以对很多方面还是不太清楚,不过没关系,先写嘛!!!!!!!!!!

飞机类的游戏DEMO,相信大家已经看过很多了,事实上,它的原理并不难,当然,本人是一个菜鸟,程序已经几本上把该实现的功能都实现了,但是由于前期没有思考的周全,导致虽然功能全部完成了,但是成功项目是很难的了,所以就分享出来,希望大家引以为戒

下面是本人写这个飞机游戏过程中,遇到的一些问题

1、先上一段代码

/**初始化飞机图片1动画的对象**/private Animotion pbm1_animotion;/**飞机图片1**/private Bitmap plane_bitmap1;/**存放飞机图片1每帧的图片**/private Bitmap[] plane_frame_bitmap1;/**飞机图片1动画的帧数**/private final static int PLANE_FRAME_NUMBER=3;/**飞机图片1动画一帧图片的宽**/private static final int PLANE_FRAME_WIDTH=70;/**飞机图片1动画一帧图片的高**/private static final int PLANE_FRAME_HEIGHT=50;
问题:我在程序中对每个图片的对象都使用了变量直接确定其值,这其实是错误的,因为一个游戏不能只为一种屏幕分辨率写的,要适应各种分辨率的,我在这里把动画每帧的图片的大小都固定好了,导致其在480*800分辨率中不能够完成显示(我的是320*480)

建议:在读取每张图片的时候,应该先计算当前手机的屏幕分辨率,以计算出适应当前 分辨率的图片的大小,可以这样写。经过测试,比如我在屏幕分辨率为480*320的屏幕下,获取的图片大小为960*320,而在800*480的屏幕分辨率下,获取同一张图片的时候,分辨率为1440*480(因为800*480的density为240,而480*320的density为160,240/160=1.5所以图片也就是960*1.5  320*1.5 结果就为1440*480了)当然,其实我们没有必要管这么多,既然系统已经动态的为图片改变了大小,那就不需要我们自己去计算了,直接使用getWidth(),getHeight(),这两个方法动态的去获取图片的大小就行了

2、我的代码里没有使用switch(),开关方法,为什么这么说,其实,现在想想开关方法对于我们进行游戏的开发是非常重要的。比如,你的游戏开始界面,结束界面,还有活动界面,道具界面,这些如果用IF方法去做,其实是非常麻烦的。比如:你的游戏的绘制状态的控制,比如绘制不同的对象,比如敌人啊,子弹啊,飞机啊等等,你也必须通过开关switch()方法去有效的控件这些对象的绘制状态,因为你的线程是不能停止的,所以你只能在draw()方法里为每个要绘制的对象都写好绘制语句,然后通过if()方法判断他的状态是否为可绘制,比如

private void myDraw() {try {canvas = surfaceholder.lockCanvas();if (canvas != null) {canvas.drawBitmap(bg_bitmap1,mbgBitposX0, 0, null);//绘制背景canvas.drawBitmap(bg_bitmap2,mbgBitposX1, 0, null);//绘制背景canvas.drawBitmap(land_bitmap1,mlandBitposX0, screenH-land_bitmap1.getHeight(), null);//绘制地面canvas.drawBitmap(land_bitmap2,mlandBitposX1, screenH-land_bitmap2.getHeight(), null);//绘制地面if(PlaneState==true){pbm1_animotion.drawAnimotion(canvas, paint, PlaneX,PlaneY);//绘制飞机}for(int i=0;i<PLANE_BOMB_NUMBER;i++){planebomb[i].drawBomb(canvas, paint);//绘制炸弹}for(int i=0;i<LAND_ENEMY_NUMBER;i++){land_enemy[i].drawEnemy(canvas, paint);}}} catch (Exception e) {// TODO: handle exception} finally {if (canvas != null)surfaceholder.unlockCanvasAndPost(canvas);}} 
这段代码里,我使用了PlaneState这个boolean值去判断当前是否要绘制飞机对象,如果不加这个判断,那么你的飞机被敌人击中后,你怎样让它消失呢,下面的绘制炸弹等对象的绘制状态的判断,我写在了敌人类和炸弹类里了,这样体现了好的封装效果,不然的话,你可能要为这么多的逻辑头疼了,我就是因为这个,后来,直接重写了,大家可以仔细的想想
//对炸弹动画进行绘制public void drawBomb(Canvas canvas ,Paint paint){if(bomb_draw_State==true){bomb_alive.drawAnimotion(canvas, paint, bombX, bombY);}if(bomb_blast_draw_State==true){for(int i=0;i<number;i++){bomb_death.drawAnimotion(canvas, paint, bombX, bombY);}bomb_blast_draw_State=false;}}
这个,是我对炸弹的动画写的一个方法,把要绘制的东西全部写到draw()方法里,然后用boolean值去判断,是否绘制

我最大的败笔就是在这个游戏中没用使用Switch()方法,去管理这么多的boolean值,希望大家以后一定要多使用switch()

对这次的开发做个总结吧:

1、由于第一次学做游戏,所以啥也不懂,代码也是一般看别人的,一边写的,我想思想,大都是差不多的。对于画面中的每一个东西,我们都要把它当成一个对象,相当于一个个体,要对它进行处理,比如位置的更新啊,碰撞的效果啊,还有出屏幕的处理啊等等

2、对于自动发射子弹类的对象,我们应该使用间隔时间的方法去初始化这么子弹对象,比如目前我们初始化飞机有10个炸弹,那么我们就要使用时间间隔法去初始化它们,为什么要间隔初始化呢,因为我们不可能对10个炸弹,每个都详细的写一个类,我们操作它们的时候,肯定是一个一维数组,而坐标的更新是直接使用一个方法去更新的,我们不可能去写10个方法吧。如果不一个一个的初始化,那么每个炸弹的坐标都一样了,也就不会出现炸弹一个一个的落下了,下面的这段代码相当于是每过500MS初始化一个子弹,有效控件效弹从飞机里出来的速度,太快了,就是开挂了0。0.

//初始化飞机10个炸弹对象long now = System.currentTimeMillis();if(msendID<PLANE_BOMB_NUMBER){//msendID为当前初始化第几个子弹if(now-msendTime>=BOMB_INTERVAL_TIME){//BOMB_INTERVAL_TIME为间隔时间planebomb[msendID].init(PlaneX,PlaneY);msendTime=now;msendID++;}if(msendID>=PLANE_BOMB_NUMBER){msendID=0;}}
3、对于对象出屏或者已经碰撞了的操作,我是用两个boolean对象处理的,一个控制对象绘制的状态,一个控制位置更新的状态,这样更加节省内存,不然,你的对象已经出屏或者死亡了,而系统还在更新它的位置,有时候,可能还会从屏幕外面飞出子弹来

public void updatelocation(){if(bomb_location_State==true){bombX-=5;bombY+=(6+(++bomb_aspeed));/**判断炸弹是否已经出屏或者是否已经落地**/if(bombX<0 ||bombY>ScreenH-60 ){bomb_location_State=false;//是否更新位置状态bomb_draw_State=false;//是否进行对象绘制状态}/**判断炸弹是否已经落地**/if(bombY>=ScreenH-60){bomb_blast_draw_State=true;bombX-=10;bombY-=(6+bomb_aspeed)-10;}}}


这次写游戏的过程中还参考了xiaominghimi、雨松MOMO的博文,感谢他的无私奉献
另,给自己求ANDROID开发类的工作,声明,本人对计算机非常的热爱,求苏州、南京、上海,等周边地区的工作
1、本人大专,现在已经大三了,求ANDROID类的工作,目前已经开发了两个ANDROID类的应用,链接地址:

一、美女拼图  http://www.anzhi.com/intro.php?softid=66578&auth=1

二、宝宝成长必备http://www.anzhi.com/intro.php?softid=70531&auth=1
上几张截图吧

源代码下载地址:http://download.csdn.net/detail/yyb346275563/3725906


原创粉丝点击