《飞机大战》安卓游戏开发源码(终)

前言:最 近闲来无事,而且也是因为刚接触安卓不久,所以萌生了以后在开发web 项目的过程中同样开发安卓手游,因前一段时间项目需要独立完成了一款功能型手机app ,该App比较简单,全是按钮操作,也就是Activity之间的相互传值与过渡,所以对安卓的基本知识有了一定了解,在我的印象当中,感觉安卓手游是比 较困难的,但是有困难就要克服,所以有了开发游戏的念头。

 

上一篇文章中写到了飞机的发射子弹,在本文中,将继续完善代码,该代码也是最终的代码,本游戏至此开发结束,游戏界面很粗糙,毕竟不是专业开发游 戏,而且游戏很多功能并未完成,比如说:随机出现一个”能量球”等等,这几天完成这个小游戏,纯属炼手操作,只是达成了其中的逻辑(部分逻辑)开发,接下 来把子弹攻击飞机的代码贴上来。

 

首先修改代码:BulletRunnable.java中的run方法,增加代码:

 

这里的功能就是判断在发射子弹的时候,判断其子弹的位置和飞机的位置是否相同,相同则发生planeBoom();

Java代码  技术分享
  1. holder.unlockCanvasAndPost(canvas);  
  2.   
  3.             if (!isEnemyBullet()) {  
  4.                 bullet.setY(bullet.getY() – 70);  
  5.                 // 从所有的敌机中判断  
  6.   
  7.                 if (enemyPlanes != null && enemyPlanes.size() > 0) {  
  8.                     for (int i = 0, size = enemyPlanes.size(); i < size; i++) {  
  9.                         ImageButton enemyPlan = enemyPlanes.get(i);  
  10.   
  11.                         if (bullet.getX() > enemyPlan.getX()  
  12.                                 && bullet.getX() < (enemyPlan.getX() + planeHalfWidth * 2)  
  13.                                 && bullet.getY() > enemyPlan.getY()  
  14.                                 && bullet.getY() < (enemyPlan.getY() + planeHalfWidth * 2)) {  
  15.   
  16.                             if (emPlanes != null && emPlanes.size() > 0) {  
  17.                                 EnemyPlane plane = emPlanes.get(i);  
  18.                                 if(plane != null){  
  19.                                     plane.setLife(plane.getLife() – 1);  
  20.                                     if (emPlanes.get(i).getLife() <= 0) {  
  21.                                         planeBoom(plane,true);  
  22.                                     }  
  23.                                 }  
  24.   
  25.                             }  
  26.                             bullet.setFly(false);  
  27.                             // 子弹消失  
  28.                         }  
  29.                     }  
  30.                 }  
  31.             } else {  
  32.                 bullet.setY(bullet.getY() + 30);  
  33.                 // 此时是子弹打中了你控制的飞机  
  34.                 if (bullet.getX() > yourPlane.getX()  
  35.                         && bullet.getX() < (yourPlane.getX() + planeHalfWidth * 2)  
  36.                         && bullet.getY() > yourPlane.getY()  
  37.                         && bullet.getY() < (yourPlane.getY() + planeHalfWidth * 2)) {  
  38.   
  39.                       
  40.                     yourPlane.setLife(yourPlane.getLife() – 1);  
  41.   
  42.                     if (yourPlane.getLife() <= 0) {  
  43.                         // 此时你的飞机不能再进行发射  
  44.                         planeBoom(yourPlane,false);  
  45.                         // 发生爆炸  
  46.   
  47.                     }  
  48.                     // 子弹消失  
  49.                     bullet.setFly(false);  
  50.                     // 立马跳出  
  51.                     break;  
  52.                 }  
  53.             }  
  54.   
  55.    

 

发生planeBoom()代码:

 

 

Java代码  技术分享
  1. /** 
  2.     * 飞机爆炸效果 
  3.     */  
  4.    private void planeBoom(Plane plane,boolean isEnemy) {  
  5.   
  6.        // 声明爆炸效果  
  7.        PlaneBoomRunnable boomRunnable = new PlaneBoomRunnable(context, holder);  
  8.        boomRunnable.setPlane(plane);  
  9.        boomRunnable.setIsenemy(isEnemy);  
  10.        // 爆炸  
  11.        new Thread(boomRunnable).start();  
  12.    }  

 

 

这里新建了一个PlaneBoomRunnable .java 类,具体代码如下:

Java代码  技术分享
  1. package com.pm_road.fireair.thread;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PorterDuff.Mode;  
  8. import android.view.SurfaceHolder;  
  9.   
  10. import com.pm_road.fireair.bean.Plane;  
  11.   
  12. /** 
  13.  * 飞机爆炸 
  14.  * @ClassName: PlaneBoomRunnable 
  15.  * @Description: 飞机爆炸效果 
  16.  * @author lipeng 
  17.  * @date 2014-11-11 上午11:27:01 
  18.  * 
  19.  */  
  20. public class PlaneBoomRunnable implements Runnable{  
  21.       
  22.     //飞机爆炸中的plane  
  23.     private Plane plane;  
  24.     //上下文  
  25.     private Context context;  
  26.     //  
  27.     private SurfaceHolder holder;  
  28.       
  29.     private Boolean isenemy;  
  30.     public PlaneBoomRunnable(Context context, SurfaceHolder holder) {  
  31.         super();  
  32.           
  33.         this.context = context;  
  34.         this.holder = holder;  
  35.     }  
  36.   
  37.     @Override  
  38.     public void run() {  
  39.           
  40.         Canvas canvas = holder.lockCanvas();  
  41.         canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);  
  42.   
  43.         Paint paint = new Paint();  
  44.         paint.setColor(Color.BLUE);  
  45.         canvas.drawText(“BOOM”, plane.getX(), plane.getY(), paint);  
  46.         canvas.drawText(“BOOM”, plane.getX()+5, plane.getY()+5, paint);  
  47.         canvas.drawText(“BOOM”, plane.getX()+10, plane.getY()+10, paint);  
  48.         canvas.drawText(“BOOM”, plane.getX()+15, plane.getY()+15, paint);  
  49.         holder.unlockCanvasAndPost(canvas);  
  50.         plane.setShot(false);  
  51.           
  52.     }  
  53.   
  54.     public Plane getPlane() {  
  55.         return plane;  
  56.     }  
  57.   
  58.     public void setPlane(Plane plane) {  
  59.         this.plane = plane;  
  60.     }  
  61.   
  62.     public Boolean getIsenemy() {  
  63.         return isenemy;  
  64.     }  
  65.   
  66.     public void setIsenemy(Boolean isenemy) {  
  67.         this.isenemy = isenemy;  
  68.     }  
  69.       
  70. }  

 

 

 

此时,在BulletRunnable.java中缺少两个属性:

 

Java代码  技术分享
  1. private List<ImageButton> enemyPlanes;  
  2. private List<EnemyPlane> emPlanes;  

 

 

将这两个属性也同样添加至PlaneRunnable.java 和MySurfaceView.java 中,同样要加入get set方法 ,

 

在PlaneRunnable.java的run方法中添加如下代码:该代码表示,如果你控制的飞机被炸掉之后,其它飞机也要停止。

 

Java代码  技术分享
  1. // 发射子弹  
  2.             if(yourPlane.isShot()){  
  3.                 shotOneBullet();  
  4.             }else{  
  5.                 //如果你控制的飞机,停止射击了,所有的飞机也要停止  
  6.                 plane.setShot(false);  
  7.                 Message msg = handler.obtainMessage();  
  8.                 msg.arg1 = 2;  
  9.                 handler.sendMessage(msg);  
  10.             }  

 
在该方法的最下面加上,通知主UI,更新飞机爆炸

 

Java代码  技术分享
  1. if (isEnemyPlane()) {  
  2.             Message msg = handler.obtainMessage();  
  3.             msg.arg1 = 3;  
  4.             msg.obj = enemyPlaneImg;  
  5.             msg.arg2 = (int) plane.getY();  
  6.             handler.sendMessage(msg);  
  7.             plane = null;  
  8.         }     

 

 

在MainActivity.java,的handler中增加判断方法:

 

Java代码  技术分享
  1. case 3:  
  2.                 ImageButton enemyImg = (ImageButton) msg.obj;  
  3.                 enemyImg.setVisibility(View.GONE);  
  4.                 enemyImg.setX(0);  
  5.                 enemyImg.setY(0);  
  6.                 break;  
  7.   
  8.    

 

 

 

至此,所有的代码结束,时间周期比较短,总共下来大概三天左右,其它功能暂时不会进行开发,现在的达到的功能为:随机出现几架敌机,敌机会垂直运 行,并隔一段时间不停发射子弹,你控制一架飞机也会垂直方向向上发射子弹,打中敌机后,敌机会出现BOOM字样,该架敌机消失,如果你控制的飞机让敌机打 中5次,则弹出提示GAME OVER 。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。