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

本节 实现 开始菜单界面

1 首先 资源文件拷过来

2, 划分游戏状态

    public static final int GAME_MENU = 0;// 游戏菜单    public static final int GAMEING = 1;// 游戏中    public static final int GAME_WIN = 2;// 游戏胜利    public static final int GAME_LOST = 3;// 游戏失败    public static final int GAME_PAUSE = -1;// 游戏菜单    // 当前游戏状态(默认初始在游戏菜单界面)    public static int gameState = GAME_MENU;
定义五种状态

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

//在那几个方法中加这个                switch (gameState) {                case GAME_MENU:                    break;                case GAMEING:                    break;                case GAME_WIN:                    break;                case GAME_LOST:                    break;                case GAME_PAUSE:                    break;                default:                    break;                }

下面再声明一些东西

//声明一个Resources实例便于加载图片    private Resources res = this.getResources();    //声明游戏需要用到的图片资源(图片声明)    private Bitmap bmpBackGround;//游戏背景    private Bitmap bmpBoom;//爆炸效果    private Bitmap bmpBoosBoom;//Boos爆炸效果    private Bitmap bmpButton;//游戏开始按钮    private Bitmap bmpButtonPress;//游戏开始按钮被点击    private Bitmap bmpEnemyDuck;//怪物鸭子    private Bitmap bmpEnemyFly;//怪物苍蝇    private Bitmap bmpEnemyBoos;//怪物猪头Boos    private Bitmap bmpGameWin;//游戏胜利背景    private Bitmap bmpGameLost;//游戏失败背景    private Bitmap bmpPlayer;//游戏主角飞机    private Bitmap bmpPlayerHp;//主角飞机血量    private Bitmap bmpMenu;//菜单背景    public static Bitmap bmpBullet;//子弹    public static Bitmap bmpEnemyBullet;//敌机子弹    public static Bitmap bmpBossBullet;//Boss子弹

初始化 游戏

    /** * SurfaceView视图创建,响应此函数 */    @Override    public void surfaceCreated(SurfaceHolder holder) {        screenW = this.getWidth();        screenH = this.getHeight();        initGame();        flag = true;        // 实例线程        th = new Thread(this);        // 启动线程        th.start();    }
    /** * 加载游戏资源 */    private void initGame() {        //加载游戏资源        bmpBackGround = BitmapFactory.decodeResource(res, R.drawable.background);        bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom);        bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom);        bmpButton = BitmapFactory.decodeResource(res, R.drawable.button);        bmpButtonPress = BitmapFactory.decodeResource(res, R.drawable.button_press);        bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck);        bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly);        bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig);        bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin);        bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost);        bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player);        bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp);        bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu);        bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet);        bmpEnemyBullet = BitmapFactory.decodeResource(res, R.drawable.bullet_enemy);        bmpBossBullet = BitmapFactory.decodeResource(res, R.drawable.boosbullet);    }

菜单类 GameMenu

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

package com.gsf;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.view.MotionEvent;/** * * @author liuml * @time 2016-5-27 下午5:43:34 */public class GameMenu {    // 菜单背景图    private Bitmap bmpMenu;    // 按钮图片资源(按下和未按下图)    private Bitmap bmpButton, bmpButtonPress;    // 按钮的坐标    private int btnX, btnY;    // 按钮是否按下标识位    private Boolean isPress;    // 菜单初始化    public GameMenu(Bitmap bmpMenu, Bitmap bmpButton, Bitmap bmpButtonPress) {        this.bmpMenu = bmpMenu;        this.bmpButton = bmpButton;        this.bmpButtonPress = bmpButtonPress;        // X居中,Y紧接屏幕底部        btnX = MySurfaceView.screenW / 2 - bmpButton.getWidth() / 2;        btnY = MySurfaceView.screenH - bmpButton.getHeight();        isPress = false;    }    public void draw(Canvas canvas, Paint paint) {        // 绘制菜单背景图        canvas.drawBitmap(bmpMenu, 0, 0, paint);        if (isPress) {            canvas.drawBitmap(bmpButtonPress, btnX, btnY, paint);        } else {            canvas.drawBitmap(bmpButton, btnX, btnY, paint);        }    }    public void onTouchEvent(MotionEvent event) {        // 获取当前触控位置        int pointX = (int) event.getX();        int pointyY = (int) event.getY();        // 当用户是按下和移动时        if (event.getAction() == MotionEvent.ACTION_DOWN                || event.getAction() == MotionEvent.ACTION_MOVE) {            // 判定用户是否点击按钮            if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) {                if (pointyY > btnY && pointyY < btnY + bmpButton.getHeight()) {                    isPress = true;                } else {                    isPress = false;                }            } else {                isPress = false;            }            // 当用于是抬起动作时        } else if (event.getAction() == MotionEvent.ACTION_UP) {            // 判断抬起时是否点击按钮,防止用户移动到别处            if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) {                if (pointyY > btnY && pointyY < btnY + bmpButton.getHeight()) {                    isPress = false;//抬起后重置 还原Button状态为未按下状态                    //改变当前游戏状态为开始游戏                    MySurfaceView.gameState = MySurfaceView.GAMEING;                }            }        }    }}

==============

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

public class MySurfaceView extends SurfaceView implements Callback, Runnable {    private SurfaceHolder sfh;    private Paint paint;    private Thread th;    private boolean flag;    private Canvas canvas;    // 1 定义游戏状态常量    public static final int GAME_MENU = 0;// 游戏菜单    public static final int GAMEING = 1;// 游戏中    public static final int GAME_WIN = 2;// 游戏胜利    public static final int GAME_LOST = 3;// 游戏失败    public static final int GAME_PAUSE = -1;// 游戏菜单    // 当前游戏状态(默认初始在游戏菜单界面)    public static int gameState = GAME_MENU;    // 声明一个Resources实例便于加载图片    private Resources res = this.getResources();    // 声明游戏需要用到的图片资源(图片声明)    private Bitmap bmpBackGround;// 游戏背景    private Bitmap bmpBoom;// 爆炸效果    private Bitmap bmpBoosBoom;// Boos爆炸效果    private Bitmap bmpButton;// 游戏开始按钮    private Bitmap bmpButtonPress;// 游戏开始按钮被点击    private Bitmap bmpEnemyDuck;// 怪物鸭子    private Bitmap bmpEnemyFly;// 怪物苍蝇    private Bitmap bmpEnemyBoos;// 怪物猪头Boos    private Bitmap bmpGameWin;// 游戏胜利背景    private Bitmap bmpGameLost;// 游戏失败背景    private Bitmap bmpPlayer;// 游戏主角飞机    private Bitmap bmpPlayerHp;// 主角飞机血量    private Bitmap bmpMenu;// 菜单背景    public static Bitmap bmpBullet;// 子弹    public static Bitmap bmpEnemyBullet;// 敌机子弹    public static Bitmap bmpBossBullet;// Boss子弹    public static int screenW;    public static int screenH;    //    private GameMenu gameMenu;    /** * SurfaceView初始化函数 */    public MySurfaceView(Context context) {        super(context);        sfh = this.getHolder();        sfh.addCallback(this);        paint = new Paint();        paint.setColor(Color.WHITE);        paint.setAntiAlias(true);        setFocusable(true);    }    /** * SurfaceView视图创建,响应此函数 */    @Override    public void surfaceCreated(SurfaceHolder holder) {        screenW = this.getWidth();        screenH = this.getHeight();        initGame();        flag = true;        // 实例线程        th = new Thread(this);        // 启动线程        th.start();    }    /** * 加载游戏资源 */    private void initGame() {        // 加载游戏资源        bmpBackGround = BitmapFactory                .decodeResource(res, R.drawable.background);        bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom);        bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom);        bmpButton = BitmapFactory.decodeResource(res, R.drawable.button);        bmpButtonPress = BitmapFactory.decodeResource(res,                R.drawable.button_press);        bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck);        bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly);        bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig);        bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin);        bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost);        bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player);        bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp);        bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu);        bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet);        bmpEnemyBullet = BitmapFactory.decodeResource(res,                R.drawable.bullet_enemy);        bmpBossBullet = BitmapFactory                .decodeResource(res, R.drawable.boosbullet);        //菜单类实例化        gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress);    }    /** * 游戏绘图 */    public void myDraw() {        try {            canvas = sfh.lockCanvas();            if (canvas != null) {                canvas.drawColor(Color.WHITE);                // 绘图函数根据游戏状态不同进行不同绘制                switch (gameState) {                case GAME_MENU:                    gameMenu.draw(canvas, paint);                    break;                case GAMEING:                    break;                case GAME_WIN:                    break;                case GAME_LOST:                    break;                case GAME_PAUSE:                    break;                default:                    break;                }            }        } catch (Exception e) {            // TODO: handle exception        } finally {            if (canvas != null)                sfh.unlockCanvasAndPost(canvas);        }    }    /** * 触屏事件监听 */    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (gameState) {        case GAME_MENU:            gameMenu.onTouchEvent(event);            break;        case GAMEING:            break;        case GAME_WIN:            break;        case GAME_LOST:            break;        case GAME_PAUSE:            break;        }        return true;    }    /** * 按键事件监听 */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        switch (gameState) {        case GAME_MENU:            break;        case GAMEING:            break;        case GAME_WIN:            break;        case GAME_LOST:            break;        case GAME_PAUSE:            break;        }        return super.onKeyDown(keyCode, event);    }    @Override    public boolean onKeyUp(int keyCode, KeyEvent event) {        switch (gameState) {        case GAME_MENU:            break;        case GAMEING:            break;        case GAME_WIN:            break;        case GAME_LOST:            break;        case GAME_PAUSE:            break;        }        return super.onKeyUp(keyCode, event);    }    /** * 游戏逻辑 */    private void logic() {        switch (gameState) {        case GAME_MENU:            break;        case GAMEING:            break;        case GAME_WIN:            break;        case GAME_LOST:            break;        case GAME_PAUSE:            break;        }    }    @Override    public void run() {        while (flag) {            long start = System.currentTimeMillis();            myDraw();            logic();            long end = System.currentTimeMillis();            try {                if (end - start < 50) {                    Thread.sleep(50 - (end - start));                }            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    /** * SurfaceView视图状态发生改变,响应此函数 */    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,            int height) {    }    /** * SurfaceView视图消亡时,响应此函数 */    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        flag = false;    }}

效果图

更多相关文章

  1. 【Android笔记】(2)ButtonClickPic
  2. Android之旋转button视图
  3. 如何去除android上a标签产生的边框
  4. android实现打电话和发短信的功能(10学员张晓丛)
  5. Android(安卓)中传递 json 的问题
  6. 用Android自带的DrawerLayout和ActionBarDrawerToggle实现侧滑效
  7. Android之CheckBox(多选按钮)
  8. Android(安卓)自定义选项卡按钮和选项卡位置
  9. Android(安卓)view的移动和画布的移动原理 适用于制作各种效果

随机推荐

  1. 连接WCF报EntityFramework.SqlServer 错
  2. SQLSERVER的中文排序规则
  3. 为什么我不能在Windows 7专业64位SP1上安
  4. Red Hat5下源码安装mysql5.6过程记录
  5. 如何编写这个SQL查询?
  6. 使用Clustered ColumnStore Index插入唯
  7. 数据库sql及索引优化
  8. [置顶] sql server中对日期字段值
  9. SQLSERVER2005调试存储过程跟函数
  10. 烂泥:Wing FTP Server与mysql数据库整合