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

最近,准备偿试写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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值