开发文章

android 游戏 实战打飞机游戏 菜单页面

目标 实现 控制 小飞机 左右移动 躲避子弹 打boss.

本节 实现 开始菜单界面

1 首先 资源文件拷过来

2, 划分游戏状态

复制内容到剪贴板
  1. public static final int GAME_MENU = 0;// 游戏菜单  
  2.    public static final int GAMEING = 1;// 游戏中  
  3.    public static final int GAME_WIN = 2;// 游戏胜利  
  4.    public static final int GAME_LOST = 3;// 游戏失败  
  5.    public static final int GAME_PAUSE = -1;// 游戏菜单  
  6.   
  7.    // 当前游戏状态(默认初始在游戏菜单界面)  
  8.    public static int gameState = GAME_MENU;  
定义五种状态 

定义完方法后 在绘图方法中 ,实体键 按下方法 ,抬起方法,触屏监听,逻辑方法,switch

复制内容到剪贴板
  1. //在那几个方法中加这个  
  2.   
  3.                 switch (gameState) {  
  4.                 case GAME_MENU:  
  5.   
  6.                     break;  
  7.                 case GAMEING:  
  8.                     break;  
  9.   
  10.                 case GAME_WIN:  
  11.   
  12.                     break;  
  13.                 case GAME_LOST:  
  14.   
  15.                     break;  
  16.                 case GAME_PAUSE:  
  17.                     break;  
  18.                 default:  
  19.                     break;  
  20.                 }  

下面再声明一些东西

复制内容到剪贴板
  1. //声明一个Resources实例便于加载图片  
  2.     private Resources res = this.getResources();  
  3.     //声明游戏需要用到的图片资源(图片声明)  
  4.     private Bitmap bmpBackGround;//游戏背景  
  5.     private Bitmap bmpBoom;//爆炸效果  
  6.     private Bitmap bmpBoosBoom;//Boos爆炸效果  
  7.     private Bitmap bmpButton;//游戏开始按钮  
  8.     private Bitmap bmpButtonPress;//游戏开始按钮被点击  
  9.     private Bitmap bmpEnemyDuck;//怪物鸭子  
  10.     private Bitmap bmpEnemyFly;//怪物苍蝇  
  11.     private Bitmap bmpEnemyBoos;//怪物猪头Boos  
  12.     private Bitmap bmpGameWin;//游戏胜利背景  
  13.     private Bitmap bmpGameLost;//游戏失败背景  
  14.     private Bitmap bmpPlayer;//游戏主角飞机  
  15.     private Bitmap bmpPlayerHp;//主角飞机血量  
  16.     private Bitmap bmpMenu;//菜单背景  
  17.     public static Bitmap bmpBullet;//子弹  
  18.     public static Bitmap bmpEnemyBullet;//敌机子弹  
  19.     public static Bitmap bmpBossBullet;//Boss子弹  

初始化 游戏

复制内容到剪贴板
  1. /** 
  2.     * SurfaceView视图创建,响应此函数 
  3.     */  
  4.    @Override  
  5.    public void surfaceCreated(SurfaceHolder holder) {  
  6.        screenW = this.getWidth();  
  7.        screenH = this.getHeight();  
  8.        initGame();  
  9.        flag = true;  
  10.        // 实例线程  
  11.        th = new Thread(this);  
  12.        // 启动线程  
  13.        th.start();  
  14.    }  
复制内容到剪贴板
  1. /** 
  2.   * 加载游戏资源 
  3.   */  
  4.  private void initGame() {  
  5.      //加载游戏资源  
  6.      bmpBackGround = BitmapFactory.decodeResource(res, R.drawable.background);  
  7.      bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom);  
  8.      bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom);  
  9.      bmpButton = BitmapFactory.decodeResource(res, R.drawable.button);  
  10.      bmpButtonPress = BitmapFactory.decodeResource(res, R.drawable.button_press);  
  11.      bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck);  
  12.      bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly);  
  13.      bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig);  
  14.      bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin);  
  15.      bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost);  
  16.      bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player);  
  17.      bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp);  
  18.      bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu);  
  19.      bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet);  
  20.      bmpEnemyBullet = BitmapFactory.decodeResource(res, R.drawable.bullet_enemy);  
  21.      bmpBossBullet = BitmapFactory.decodeResource(res, R.drawable.boosbullet);  
  22.   
  23.  }  

20160527175457266.png

菜单类 GameMenu

菜单类
包括 初始化绘制按钮和背景图

复制内容到剪贴板
  1. package com.gsf;  
  2.   
  3. import android.graphics.Bitmap;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Paint;  
  6. import android.view.MotionEvent;  
  7.   
  8. /** 
  9.  *  
  10.  * @author liuml 
  11.  * @time 2016-5-27 下午5:43:34 
  12.  */  
  13. public class GameMenu {  
  14.   
  15.     // 菜单背景图  
  16.     private Bitmap bmpMenu;  
  17.     // 按钮图片资源(按下和未按下图)  
  18.     private Bitmap bmpButton, bmpButtonPress;  
  19.     // 按钮的坐标  
  20.     private int btnX, btnY;  
  21.     // 按钮是否按下标识位  
  22.     private Boolean isPress;  
  23.   
  24.     // 菜单初始化  
  25.     public GameMenu(Bitmap bmpMenu, Bitmap bmpButton, Bitmap bmpButtonPress) {  
  26.         this.bmpMenu = bmpMenu;  
  27.         this.bmpButton = bmpButton;  
  28.         this.bmpButtonPress = bmpButtonPress;  
  29.         // X居中,Y紧接屏幕底部  
  30.         btnX = MySurfaceView.screenW / 2 - bmpButton.getWidth() / 2;  
  31.         btnY = MySurfaceView.screenH - bmpButton.getHeight();  
  32.         isPress = false;  
  33.     }  
  34.   
  35.     public void draw(Canvas canvas, Paint paint) {  
  36.         // 绘制菜单背景图  
  37.         canvas.drawBitmap(bmpMenu, 00, paint);  
  38.         if (isPress) {  
  39.             canvas.drawBitmap(bmpButtonPress, btnX, btnY, paint);  
  40.         } else {  
  41.             canvas.drawBitmap(bmpButton, btnX, btnY, paint);  
  42.   
  43.         }  
  44.   
  45.     }  
  46.   
  47.     public void onTouchEvent(MotionEvent event) {  
  48.         // 获取当前触控位置  
  49.         int pointX = (int) event.getX();  
  50.         int pointyY = (int) event.getY();  
  51.   
  52.         // 当用户是按下和移动时  
  53.         if (event.getAction() == MotionEvent.ACTION_DOWN  
  54.                 || event.getAction() == MotionEvent.ACTION_MOVE) {  
  55.   
  56.             // 判定用户是否点击按钮  
  57.             if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) {  
  58.                 if (pointyY > btnY && pointyY < btnY + bmpButton.getHeight()) {  
  59.                     isPress = true;  
  60.                 } else {  
  61.                     isPress = false;  
  62.                 }  
  63.             } else {  
  64.                 isPress = false;  
  65.             }  
  66.   
  67.             // 当用于是抬起动作时  
  68.         } else if (event.getAction() == MotionEvent.ACTION_UP) {  
  69.             // 判断抬起时是否点击按钮,防止用户移动到别处  
  70.             if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) {  
  71.                 if (pointyY > btnY && pointyY < btnY + bmpButton.getHeight()) {  
  72.                     isPress = false;//抬起后重置 还原Button状态为未按下状态  
  73.                     //改变当前游戏状态为开始游戏  
  74.                     MySurfaceView.gameState = MySurfaceView.GAMEING;  
  75.                 }  
  76.             }  
  77.         }  
  78.   
  79.     }  
  80. }  

然后 在MySurfaceView中使用 GameMenu 使用菜单类

复制内容到剪贴板
  1. public class MySurfaceView extends SurfaceView implements Callback, Runnable {  
  2.     private SurfaceHolder sfh;  
  3.     private Paint paint;  
  4.     private Thread th;  
  5.     private boolean flag;  
  6.     private Canvas canvas;  
  7.   
  8.     // 1 定义游戏状态常量  
  9.     public static final int GAME_MENU = 0;// 游戏菜单  
  10.     public static final int GAMEING = 1;// 游戏中  
  11.     public static final int GAME_WIN = 2;// 游戏胜利  
  12.     public static final int GAME_LOST = 3;// 游戏失败  
  13.     public static final int GAME_PAUSE = -1;// 游戏菜单  
  14.     // 当前游戏状态(默认初始在游戏菜单界面)  
  15.     public static int gameState = GAME_MENU;  
  16.     // 声明一个Resources实例便于加载图片  
  17.     private Resources res = this.getResources();  
  18.     // 声明游戏需要用到的图片资源(图片声明)  
  19.     private Bitmap bmpBackGround;// 游戏背景  
  20.     private Bitmap bmpBoom;// 爆炸效果  
  21.     private Bitmap bmpBoosBoom;// Boos爆炸效果  
  22.     private Bitmap bmpButton;// 游戏开始按钮  
  23.     private Bitmap bmpButtonPress;// 游戏开始按钮被点击  
  24.     private Bitmap bmpEnemyDuck;// 怪物鸭子  
  25.     private Bitmap bmpEnemyFly;// 怪物苍蝇  
  26.     private Bitmap bmpEnemyBoos;// 怪物猪头Boos  
  27.     private Bitmap bmpGameWin;// 游戏胜利背景  
  28.     private Bitmap bmpGameLost;// 游戏失败背景  
  29.     private Bitmap bmpPlayer;// 游戏主角飞机  
  30.     private Bitmap bmpPlayerHp;// 主角飞机血量  
  31.     private Bitmap bmpMenu;// 菜单背景  
  32.     public static Bitmap bmpBullet;// 子弹  
  33.     public static Bitmap bmpEnemyBullet;// 敌机子弹  
  34.     public static Bitmap bmpBossBullet;// Boss子弹  
  35.     public static int screenW;  
  36.     public static int screenH;  
  37.   
  38.     //  
  39.     private GameMenu gameMenu;  
  40.   
  41.     /** 
  42.      * SurfaceView初始化函数 
  43.      */  
  44.     public MySurfaceView(Context context) {  
  45.         super(context);  
  46.         sfh = this.getHolder();  
  47.         sfh.addCallback(this);  
  48.         paint = new Paint();  
  49.         paint.setColor(Color.WHITE);  
  50.         paint.setAntiAlias(true);  
  51.         setFocusable(true);  
  52.     }  
  53.   
  54.     /** 
  55.      * SurfaceView视图创建,响应此函数 
  56.      */  
  57.     @Override  
  58.     public void surfaceCreated(SurfaceHolder holder) {  
  59.         screenW = this.getWidth();  
  60.         screenH = this.getHeight();  
  61.         initGame();  
  62.         flag = true;  
  63.         // 实例线程  
  64.         th = new Thread(this);  
  65.         // 启动线程  
  66.         th.start();  
  67.     }  
  68.   
  69.     /** 
  70.      * 加载游戏资源 
  71.      */  
  72.     private void initGame() {  
  73.         // 加载游戏资源  
  74.         bmpBackGround = BitmapFactory  
  75.                 .decodeResource(res, R.drawable.background);  
  76.         bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom);  
  77.         bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom);  
  78.         bmpButton = BitmapFactory.decodeResource(res, R.drawable.button);  
  79.         bmpButtonPress = BitmapFactory.decodeResource(res,  
  80.                 R.drawable.button_press);  
  81.         bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck);  
  82.         bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly);  
  83.         bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig);  
  84.         bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin);  
  85.         bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost);  
  86.         bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player);  
  87.         bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp);  
  88.         bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu);  
  89.         bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet);  
  90.         bmpEnemyBullet = BitmapFactory.decodeResource(res,  
  91.                 R.drawable.bullet_enemy);  
  92.         bmpBossBullet = BitmapFactory  
  93.                 .decodeResource(res, R.drawable.boosbullet);  
  94.   
  95.         //菜单类实例化  
  96.         gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress);  
  97.   
  98.     }  
  99.   
  100.     /** 
  101.      * 游戏绘图 
  102.      */  
  103.     public void myDraw() {  
  104.         try {  
  105.             canvas = sfh.lockCanvas();  
  106.             if (canvas != null) {  
  107.                 canvas.drawColor(Color.WHITE);  
  108.                 // 绘图函数根据游戏状态不同进行不同绘制  
  109.   
  110.                 switch (gameState) {  
  111.                 case GAME_MENU:  
  112.   
  113.                     gameMenu.draw(canvas, paint);  
  114.                     break;  
  115.                 case GAMEING:  
  116.                     break;  
  117.   
  118.                 case GAME_WIN:  
  119.   
  120.                     break;  
  121.                 case GAME_LOST:  
  122.   
  123.                     break;  
  124.                 case GAME_PAUSE:  
  125.                     break;  
  126.                 default:  
  127.                     break;  
  128.                 }  
  129.   
  130.             }  
  131.         } catch (Exception e) {  
  132.             // TODO: handle exception  
  133.         } finally {  
  134.             if (canvas != null)  
  135.                 sfh.unlockCanvasAndPost(canvas);  
  136.         }  
  137.     }  
  138.   
  139.     /** 
  140.      * 触屏事件监听 
  141.      */  
  142.     @Override  
  143.     public boolean onTouchEvent(MotionEvent event) {  
  144.         switch (gameState) {  
  145.         case GAME_MENU:  
  146.   
  147.             gameMenu.onTouchEvent(event);  
  148.             break;  
  149.         case GAMEING:  
  150.             break;  
  151.   
  152.         case GAME_WIN:  
  153.   
  154.             break;  
  155.         case GAME_LOST:  
  156.   
  157.             break;  
  158.         case GAME_PAUSE:  
  159.   
  160.             break;  
  161.         }  
  162.         return true;  
  163.     }  
  164.   
  165.     /** 
  166.      * 按键事件监听 
  167.      */  
  168.     @Override  
  169.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  170.         switch (gameState) {  
  171.         case GAME_MENU:  
  172.   
  173.             break;  
  174.         case GAMEING:  
  175.             break;  
  176.   
  177.         case GAME_WIN:  
  178.   
  179.             break;  
  180.         case GAME_LOST:  
  181.   
  182.             break;  
  183.         case GAME_PAUSE:  
  184.             break;  
  185.         }  
  186.         return super.onKeyDown(keyCode, event);  
  187.     }  
  188.   
  189.     @Override  
  190.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  191.         switch (gameState) {  
  192.         case GAME_MENU:  
  193.   
  194.             break;  
  195.         case GAMEING:  
  196.             break;  
  197.   
  198.         case GAME_WIN:  
  199.   
  200.             break;  
  201.         case GAME_LOST:  
  202.   
  203.             break;  
  204.         case GAME_PAUSE:  
  205.             break;  
  206.         }  
  207.         return super.onKeyUp(keyCode, event);  
  208.     }  
  209.   
  210.     /** 
  211.      * 游戏逻辑 
  212.      */  
  213.     private void logic() {  
  214.         switch (gameState) {  
  215.         case GAME_MENU:  
  216.   
  217.             break;  
  218.         case GAMEING:  
  219.             break;  
  220.   
  221.         case GAME_WIN:  
  222.   
  223.             break;  
  224.         case GAME_LOST:  
  225.   
  226.             break;  
  227.         case GAME_PAUSE:  
  228.             break;  
  229.         }  
  230.   
  231.     }  
  232.   
  233.     @Override  
  234.     public void run() {  
  235.         while (flag) {  
  236.             long start = System.currentTimeMillis();  
  237.             myDraw();  
  238.             logic();  
  239.             long end = System.currentTimeMillis();  
  240.             try {  
  241.                 if (end - start < 50) {  
  242.                     Thread.sleep(50 - (end - start));  
  243.                 }  
  244.             } catch (InterruptedException e) {  
  245.                 e.printStackTrace();  
  246.             }  
  247.         }  
  248.     }  
  249.   
  250.     /** 
  251.      * SurfaceView视图状态发生改变,响应此函数 
  252.      */  
  253.     @Override  
  254.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  255.             int height) {  
  256.     }  
  257.   
  258.     /** 
  259.      * SurfaceView视图消亡时,响应此函数 
  260.      */  
  261.     @Override  
  262.     public void surfaceDestroyed(SurfaceHolder holder) {  
  263.         flag = false;  
  264.     }  
  265.   
  266. }  

效果图

.安卓飞机游戏效果图.png

感谢 六道对穿肠 支持 磐实编程网 原文地址:
blog.csdn.net/liudao7994/article/details/51517923

文章信息

发布时间:2016-05-30

作者:六道对穿肠

发布者:aquwcw

浏览次数: