Android Studio飞机大战游戏部分详解

●整体设计思路:

用Android Studio制作游戏,先是定义一个MySurfaceView类来继承SurfaceView和实现SurfaceViewHolder.Callback和Runnable;先做游戏的背景图片,我方的飞机是一直向前走的所以背景也需要一直循环,只要用两张就行了,当一张打印结束另一张也紧随而来,如此反复的循环,便达到了背景一直在动的循环。第二个就是打印我方的战机了,定义一个绘制图形,新建一个Myplane的我方战机类,在飞机类中定义飞机的初始位置,做一个触碰的方法让战机跟着手指的移动而移动,然后在MySurfaceView调用打印就行了;接着新建一个bossplane的boss飞机类,和myplane一样设置初始位置,但是boss需要有其他的动作,这个就是自己手动添加了,比如加一个冲撞的方法。接着就是我方战机和boss的子弹了,然后设计我方子弹击打在boss身上和boss子弹击打我方战机以及boss冲撞等技能对我方战机的后果;最后还要加上子弹的声音以及游戏的背景音乐。大致思路就是这样,还有许多细节需要完善。

●如何绘制循环滚动的背景图片;

定义一个背景类;定义图片对象和两个y和y1的对象;因为要实现背景的循环滚动嘴上需要两张图片,当一张开始滚动之后,另一张随之而来,所以第二张图片的y1位置要等于第一张图片y的位置减去一张图片的高度。在MySurfaceView调用。

    public BackGroud(Bitmap bitmap){
        this.bitmap = bitmap;
        y1 = 0;
        y2 = y1-bitmap.getHeight();



    }

接着定义一个方法来打印它们的初始位置;接着定义一个逻辑方法,让图片循环滚动,上述当第一张开始滚动的时候,第二张也要跟着滚动,便如下图

   public void logic(){ //逻辑方法
        y1+=10;      y2+=10;

        if(y1>=bitmap.getHeight()){
            y1 = y2-bitmap.getHeight(); //移动在第二张上面

        }
        if(y2>=bitmap.getHeight()){
            y2=y1-bitmap.getHeight();

        }
    }

这样便实现了图片的循环滚动。

●如何绘制飞机

定义一个飞机类;还是和背景类一样,定义图片对象和x,y横坐标,纵坐标,还有高度和宽度对象;打印构造方法。设置飞机的初始位置,定义一个touchEvent的方法,当手指触碰飞机的时候,是指移动让飞机也跟着移动。如果是boss飞机,需要设置boss的行动方式,还需要添加boss的一些技能。在MySurfaceView调用即可。

    public void touchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            float ex = event.getX();
            float ey = event.getY();
            if (ex > x && ex < x + width && ey > y && ey < y + height) {
                x = (int) (ex - width / 2);
                y = (int) (ey - height / 2);
                if (y < 0) {
                    y = 0;
                }
                if (y + height > MySurfaceView.height) {
                    y = MySurfaceView.height - height;
                }
            }
        }
    }

●如何绘制子弹

定义一个子弹类,照片对象,添加x,y横坐标,还有子弹的飞行速度;定义方法打印子弹的初始位置;定义一个logic逻辑类,使用swicth来区分boss子弹和战机子弹,以及boss子弹的飞行方向和战机子弹的飞行方向,它们是相反的。最后在MySurfaceView调用。

   public void logic() {
        switch (type){
            //玩家子弹
            case 0:
                y -= speed;
                if (y < 0) {
                    isDead = true;

                }
                break;
            //boos子弹
            case 1:
                y += speed;
                if (y < 0) {
                    isDead = true;

                }
                break;
        }



    }

●如何判断碰撞

我做得此游戏当前碰撞有3种:战机被boss碰撞;战机子弹碰撞boss;boss子弹碰撞到战机。
它们原理都是一样的:1.当战机的y坐标小于boss的y+boss的高度,并且战机y+战机高度大于boss的y左标时,便开始判断: 1.战机x坐标小于bossx坐标并且战机x+战机宽度大于boss 的x坐标,便得出战机与boss左侧碰撞;2.当战机x大于boss的x并且战机x+宽度小于boss的x+boss的宽度,便得出战机与bosss 中间碰撞;3.当战机大于boss的x坐标并且战机x+宽度大于boss的x+boss的宽度,便得出右边碰撞;这是战机与boss碰撞。

       if(ybossplane.getY() ){

            if (x < bossplane.getX() && x+width > bossplane.getX()) {//我方战机左边碰撞
                noCollision = true;
                if (Hp > 0) {
                    Hp--;
                }
                return true;
            }

            if (x > bossplane.getX() && x+width < bossplane.getX() + bossplane.getFrameW()) {//我方飞机中间碰撞
                noCollision = true;
                if (Hp > 0) {
                    Hp--;
                }
                return true;
            }

            if (x > bossplane.getX() && x+width > bossplane.getX()+bossplane.getFrameW()) {//我方飞机右边碰撞


                noCollision = true;
                if (Hp > 0) {
                    Hp--;
                }
                return true;
            }

        }

战机子弹碰撞boss:当战机子弹x大于boss的x坐标,并且战机子弹的x+子弹的宽度小于boss的x+boss的宽度并且战机子弹y大于boss的y坐标,并且战机子弹y小于boss的y+boss的高度。便判断出战机子弹与boss碰撞,boss掉血。

     //我方战机子弹与boss飞机碰撞
       public boolean isColision (Bullet bullet){

        if(bullet.getX()>x&&bullet.getX()+bullet.getBitmap().getWidth()y&&bullet.getY()true);
            if(bossHp<0){
                MySurfaceView.GAME_STATE = 1;
            }return true;
        }
        return false;
       }

boss子弹碰撞战机:当boss子弹的x大于战机x并且boss子弹x小于战机x+战机宽度,并且boss子弹y大于战机y并且boss子弹y小于战机y+战机高度。判断战机被boss子弹击中,掉血。

//boss子弹与我方战机碰撞
 if (bullet.getX() > x && bullet.getX() < x + width && bullet.getY() > y && bullet.getY() < y + height) {
            noCollision = true;
            if (Hp > 0) {
                Hp--;
            }
            return true;
        }

●如何绘制爆炸效果:

定义一个boom的类;添加x,y坐标,爆炸的图片是7张,需要一张一张的播放。来实现boss 的飞机爆炸效果。设置初始位置:当战机子弹击中boss时,就需要爆炸的效果,所以它的初始位置在boss的坐标点,具体坐标可以自己改动。

 for(int i=0;i<boomVector.size();i++){
                            if (boomVector.elementAt(i).isEnd()) {
                                boomVector.remove(i);
                            }else{
                                boomVector.elementAt(i).draw(canvas,paint);//打印爆炸
                            }
                        }

●如何添加音效:

创建一个GameSoundPool类;添加对象,导入音乐用于调用;switch来判断使用哪一个音乐。在需要音效的后面调用即可。

public class GameSoundPool {
    private SoundPool soundPool;
    private int s1,s2;
    public GameSoundPool(Context context){
        this.soundPool = new SoundPool(2,AudioManager.STREAM_MUSIC,0);
        s1 = soundPool.load(context,R.raw.shoot,1);
        s2 = soundPool.load(context,R.raw.explosion,1);


    }
    public void playSound(int s){



        switch (s){
            case 1:
                soundPool.play(s1,1,1,1,0,1.0f);
              break;
            case 2:
            soundPool.play(s2,1,1,1,0,1.0f);
                break;



        }
    }
}

●哪些地方用到封装、继承、多态、方法重载、接口等:

主程序的MySurfaceView使用了继承SurfaceView和实现了 SurfaceHolder.Callback,Runnable接口;
每个类中需要在自己类使用的对象都需要使用封装,比如:每个图片的x,y的坐标和一些需要使用的标志位;

●我的收获与感悟:

学了这么些天,说没有收获是假的,纵使再怎么不会,也该学到了一些知识和技能。
这一个月来,江哥带领我们复习了java的基础知识并细心讲解,让我的之前的java的印象能够更深一点,然后慢慢的做一些小的游戏,又学习了许多别的知识。现在的飞机大战的游戏还不够完善,我希望并坚信我能够也可以让这个代码完善下去。
我收获了更多的java知识和android studio的知识,也充实了自己的生活,这让我感到生活很快乐。我需要不断的探索与学习,开拓更深的层次。

你可能感兴趣的:(Android Studio飞机大战游戏部分详解)