Android实战打飞机游戏之菜单页面设计(1)


本文目标实现控制小飞机的左右移动、躲避子弹、打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;
 }

}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持phpstudy。



相关阅读:
Wind10 Build 10130即将向Slow Ring用户大面积推送
mysql group_concat()函数用法总结
ajax+jQuery实现级联显示地址的方法
win7系统补丁清理技巧 win7清理更新过的补丁方法分享
WPF的数据绑定详细介绍
jQuery实现的可编辑表格完整实例
JavaScript函数作用域链分析
后缀为 ashx 与 axd 的文件区别浅析
css特效 一道闪光在图片上划过代码
iOS 10即将来袭!升级你的iOS开发装备
Jquery解析json字符串及json数组的方法
chrome表单自动填充导致input文本框背景变成偏黄色问题解决
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
学习php中的正则表达式
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 义乌-利川 哈尔滨东-大庆东 七甸-威舍 锦州南-费县 惠州-民权 前磨头-台前 开通-天津西 连云港东-武功 沙沱-雨格 杭州东-合肥北城 六枝-凯里 滨海-上海虹桥 梨树镇-庆安 磁县-张家口南 新干-麻城 尼日-南尔岗 深圳西-怀化 祁县-重庆北 安阳东-滁州 铁岭-扶余 宁国-芜湖 北京-鄄城 滁州北-乌鲁木齐 谢家镇-姚家 高邑-沟帮子 长春西-扶余北 哈尔滨西-满洲里 水家湖-郑州东 军粮城北-扶余北 安顺西-泰安 哈克-宋 铜陵北-沧州西 天津西-磁窑 松树林-新林 铜仁-衡阳 白桦排-加格达奇 七苏木-六地沟 双城堡-乌鲁木齐 元宝山-敖汉 子洲-延安 锦州南-禹城 平顶山-弋阳 涿州-红果 武汉-泰安 台州-三门县 白音他拉-赤峰东 桃村北-高密 肥东-枝江北 漯河-卫辉 向阳川-福利屯 深圳西-茂名 兴宁-铜仁 昆山南-涪陵北 巩义南-文登东 田东北-宾阳 深州-龙岩 甘洛-白果 赶水-重庆南 沙园-海北 深圳北-嘉善南 武昌-鹿寨 闽清北-福州 下普雄-甘洛 上海虹桥-上饶 丽水-诸暨 贵港-石门县北 瓦房店-哈力图 燕岗-共和 二连-北京 三门峡-南丰 宝鸡-常德 邢台东-衡阳东 镇江-连云港东 缙云-商城 深圳东-黄石 林西-熊岳城 前磨头-大营镇 福州-罗源 东莞-鄂州 银川-阳高 从西安到榆林寄东西最快的方法,最快什么时候能到我急需一
河北廊坊市里凌晨两点到三点有出租车吗
苏宁电器网上商城在深圳苏宁电器买海信LED彩电到江西省萍乡市
杭州车床加工群成立了,以小型车床,自由职业,业务洽谈,技
我的信用卡到期卡已寄出。多少小时能到中国银行到章丘
从常平列车火车站有去浙江金华西的列车火车吗
从高密到威海多少公里
山东济南到长春特快多久能到
烟台到兰村的火车有哪几个
杭州列车南站到广州是几点的列车
谁知道佛山到珠海拱北的车经过金鼎附近的么,在那里下车离金
宁波到温州的火车列车价格和时间的多少?
苏州到乌镇要多久坐客车
上海崇明岛到苏州怎么坐车最方便,也花钱最少
K7381次火车列车从金州到沈阳都过哪些站啊(如果回复字数不够就简
2010年淮南四中到校办理档案转移什么时候
我现在在浙江嘉善我想去湖北孝感怎么走
肇庆到桂林七日以内的旅游团有那些比较好价钱大概是多少
常州到温岭的路怎么坐车
济南到兰州的列车火车票什么时候有
日照汽车站有开往西安汽车吗?
和谐号列车时刻表重庆到成都
我是湖南郴州的,最近我想买一辆五菱荣光标准型号的汽车客车,加
从乐清虹桥到郑州汽车客车票要多少钱
国庆节去哪里玩台州
从常州到成都青羊区树德中学怎么去
我想今年五月份和我女朋友去日照玩4到6天,我是河北保定的,
鹰手营子到北马圈子的火车列车时间
从开封到安阳怎么走,火车汽车有没有直达的,票价多少,还有
在潍坊列车火车站能买到济南到滕州的列车火车票吗

Copyright © 2016 phpStudy |