zoukankan      html  css  js  c++  java
  • 《飞机大战》安卓游戏开发源码(终)

    前言:最 近闲来无事,而且也是因为刚接触安卓不久,所以萌生了以后在开发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 。

  • 相关阅读:
    【vue】------ 路由创建 ------ 【William】
    【vue】------------@vue/cli3.7.0创建项目+ts-------------【William】
    【svn】--------------svn介绍------------------【William】
    【vue】------浅谈vue------【William】
    node创建服务器
    vue项目搭建
    利用vw做rem适配(纯css)
    nodejs实现md5和SHA256加密
    Cookie、session、localStorage、sessionStorage的区别
    tpc三次握手与四次挥手
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/4221407.html
Copyright © 2011-2022 走看看