热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

打飞机游戏终极BOSSAndroid实战打飞机游戏完结篇

打飞机游戏终极BOSS,Android实战打飞机游戏完结篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了打飞机游戏BOSS以及胜利失败页面设计的Android代码,具体内容如下

修改子弹类:

public class Bullet {
 //子弹图片资源
 public Bitmap bmpBullet;
 //子弹的坐标
 public int bulletX, bulletY;
 //子弹的速度
 public int speed;
 //子弹的种类以及常量
 public int bulletType;
 //主角的
 public static final int BULLET_PLAYER = -1;
 //鸭子的
 public static final int BULLET_DUCK = 1;
 //苍蝇的
 public static final int BULLET_FLY = 2;
 //Boss的
 public static final int BULLET_BOSS = 3;
 //子弹是否超屏, 优化处理
 public boolean isDead;

 //Boss疯狂状态下子弹相关成员变量
 private int dir;//当前Boss子弹方向
 //8方向常量
 public static final int DIR_UP = -1;
 public static final int DIR_DOWN = 2;
 public static final int DIR_LEFT = 3;
 public static final int DIR_RIGHT = 4;
 public static final int DIR_UP_LEFT = 5;
 public static final int DIR_UP_RIGHT = 6;
 public static final int DIR_DOWN_LEFT = 7;
 public static final int DIR_DOWN_RIGHT = 8;

 //子弹当前方向
 public Bullet(Bitmap bmpBullet, int bulletX, int bulletY, int bulletType) {
 this.bmpBullet = bmpBullet;
 this.bulletX = bulletX;
 this.bulletY = bulletY;
 this.bulletType = bulletType;
 //不同的子弹类型速度不一
 switch (bulletType) {
 case BULLET_PLAYER:
  speed = 4;
  break;
 case BULLET_DUCK:
  speed = 3;
  break;
 case BULLET_FLY:
  speed = 4;
  break;
 case BULLET_BOSS:
  speed = 5;
  break;
 }
 }

 /**
 * 专用于处理Boss疯狂状态下创建的子弹
 * @param bmpBullet
 * @param bulletX
 * @param bulletY
 * @param bulletType
 * @param Dir
 */
 public Bullet(Bitmap bmpBullet, int bulletX, int bulletY, int bulletType, int dir) {
 this.bmpBullet = bmpBullet;
 this.bulletX = bulletX;
 this.bulletY = bulletY;
 this.bulletType = bulletType;
 speed = 5;
 this.dir = dir;
 }

 //子弹的绘制
 public void draw(Canvas canvas, Paint paint) {
 canvas.drawBitmap(bmpBullet, bulletX, bulletY, paint);
 }

 //子弹的逻辑
 public void logic() {
 //不同的子弹类型逻辑不一
 //主角的子弹垂直向上运动
 switch (bulletType) {
 case BULLET_PLAYER:
  bulletY -= speed;
  if (bulletY <-50) {
  isDead = true;
  }
  break;
 //鸭子和苍蝇的子弹都是垂直下落运动
 case BULLET_DUCK:
 case BULLET_FLY:
  bulletY += speed;
  if (bulletY > MySurfaceView.screenH) {
  isDead = true;
  }
  break;
 //Boss疯狂状态下的8方向子弹逻辑
 case BULLET_BOSS:
  //Boss疯狂状态下的子弹逻辑待实现
  switch (dir) {
  //方向上的子弹
  case DIR_UP:
  bulletY -= speed;
  break;
  //方向下的子弹
  case DIR_DOWN:
  bulletY += speed;
  break;
  //方向左的子弹
  case DIR_LEFT:
  bulletX -= speed;
  break;
  //方向右的子弹
  case DIR_RIGHT:
  bulletX += speed;
  break;
  //方向左上的子弹
  case DIR_UP_LEFT:
  bulletY -= speed;
  bulletX -= speed;
  break;
  //方向右上的子弹
  case DIR_UP_RIGHT:
  bulletX += speed;
  bulletY -= speed;
  break;
  //方向左下的子弹
  case DIR_DOWN_LEFT:
  bulletX -= speed;
  bulletY += speed;
  break;
  //方向右下的子弹
  case DIR_DOWN_RIGHT:
  bulletY += speed;
  bulletX += speed;
  break;
  }
  //边界处理
  if (bulletY > MySurfaceView.screenH || bulletY <= -40 || bulletX > MySurfaceView.screenW || bulletX <= -40) {
  isDead = true;
  }
  break;
 }
 }
}

下面 新建BOSS类

创建BOSS

public class Boss {
 //Boss的血量
 public int hp = 50;
 //Boss的图片资源
 private Bitmap bmpBoss;
 //Boss坐标
 public int x, y;
 //Boss每帧的宽高
 public int frameW, frameH;
 //Boss当前帧下标
 private int frameIndex;
 //Boss运动的速度
 private int speed = 5;
 //Boss的运动轨迹
 //一定时间会向着屏幕下方运动,并且发射大范围子弹,(是否狂态)
 //正常状态下 ,子弹垂直朝下运动
 private boolean isCrazy;
 //进入疯狂状态的状态时间间隔
 private int crazyTime = 200;
 //计数器
 private int count;

 //Boss的构造函数
 public Boss(Bitmap bmpBoss) {
 this.bmpBoss = bmpBoss;
 frameW = bmpBoss.getWidth() / 10;
 frameH = bmpBoss.getHeight();
 //Boss的X坐标居中
 x = MySurfaceView.screenW / 2 - frameW / 2;
 y = 0;
 }

 //Boss的绘制
 public void draw(Canvas canvas, Paint paint) {
 canvas.save();
 canvas.clipRect(x, y, x + frameW, y + frameH);
 canvas.drawBitmap(bmpBoss, x - frameIndex * frameW, y, paint);
 canvas.restore();
 }

 //Boss的逻辑
 public void logic() {
 //不断循环播放帧形成动画
 frameIndex++;
 if (frameIndex >= 10) {
  frameIndex = 0;
 }
 //没有疯狂的状态
 if (isCrazy == false) {
  x += speed;
  if (x + frameW >= MySurfaceView.screenW) {
  speed = -speed;
  } else if (x <= 0) {
  speed = -speed;
  }
  count++;
  if (count % crazyTime == 0) {
  isCrazy = true;
  speed = 24;
  }
  //疯狂的状态
 } else {
  speed -= 1;
  //当Boss返回时创建大量子弹
  if (speed == 0) {
  //添加8方向子弹
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_UP));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_DOWN));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_LEFT));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_RIGHT));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_UP_LEFT));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_UP_RIGHT));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_DOWN_LEFT));
  MySurfaceView.vcBulletBoss.add(new Bullet(MySurfaceView.bmpBossBullet, x+40, y+10, Bullet.BULLET_BOSS, Bullet.DIR_DOWN_RIGHT));
  }
  y += speed;
  if (y <= 0) {
  //恢复正常状态
  isCrazy = false;
  speed = 5;
  }
 }
 }

 //判断碰撞(Boss被主角子弹击中)
 public boolean isCollsionWith(Bullet bullet) {
 int x2 = bullet.bulletX;
 int y2 = bullet.bulletY;
 int w2 = bullet.bmpBullet.getWidth();
 int h2 = bullet.bmpBullet.getHeight();
 if (x >= x2 && x >= x2 + w2) {
  return false;
 } else if (x <= x2 && x + frameW <= x2) {
  return false;
 } else if (y >= y2 && y >= y2 + h2) {
  return false;
 } else if (y <= y2 && y + frameH <= y2) {
  return false;
 }
 return true;
 }

 //设置Boss血量
 public void setHp(int hp) {
 this.hp = hp;
 }
}

在主界面实例化 子弹 以及boss

public class MySurfaceView extends SurfaceView implements Callback, Runnable {
 private SurfaceHolder sfh;
 private Paint paint;
 private Thread th;
 private boolean flag;
 private Canvas canvas;
 public static int screenW, screenH;
 //定义游戏状态常量
 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子弹
 //声明一个菜单对象
 private GameMenu gameMenu;
 //声明一个滚动游戏背景对象
 private GameBg backGround;
 //声明主角对象
 private Player player;
 //声明一个敌机容器
 private Vector vcEnemy;
 //每次生成敌机的时间(毫秒)
 private int createEnemyTime = 50;
 private int count;//计数器
 //敌人数组:1和2表示敌机的种类,-1表示Boss
 //二维数组的每一维都是一组怪物
 private int enemyArray[][] = { { 1, 2 }, { 1, 1 }, { 1, 3, 1, 2 }, { 1, 2 }, { 2, 3 }, { 3, 1, 3 }, { 2, 2 }, { 1, 2 }, { 2, 2 }, { 1, 3, 1, 1 }, { 2, 1 },
  { 1, 3 }, { 2, 1 }, { -1 } };
 //当前取出一维数组的下标
 private int enemyArrayIndex;
 //是否出现Boss标识位
 private boolean isBoss;
 //随机库,为创建的敌机赋予随即坐标
 private Random random;
 //敌机子弹容器
 private Vector vcBullet;
 //添加子弹的计数器
 private int countEnemyBullet;
 //主角子弹容器
 private Vector vcBulletPlayer;
 //添加子弹的计数器
 private int countPlayerBullet;
 //爆炸效果容器
 private Vector vcBoom;
 //声明Boss
 private Boss boss;
 //Boss的子弹容器
 public static Vector vcBulletBoss;

 /**
 * 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);
 setFocusableInTouchMode(true);
 //设置背景常亮
 this.setKeepScreenOn(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() {
 //放置游戏切入后台重新进入游戏时,游戏被重置!
 //当游戏状态处于菜单时,才会重置游戏
 if (gameState == GAME_MENU) {
  //加载游戏资源
  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);
  //爆炸效果容器实例
  vcBoom = new Vector();
  //敌机子弹容器实例
  vcBullet = new Vector();
  //主角子弹容器实例
  vcBulletPlayer = new Vector();
  //菜单类实例
  gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress);
  //实例游戏背景
  backGround = new GameBg(bmpBackGround);
  //实例主角
  player = new Player(bmpPlayer, bmpPlayerHp);
  //实例敌机容器
  vcEnemy = new Vector();
  //实例随机库
  random = new Random();
  //---Boss相关
  //实例boss对象
  boss = new Boss(bmpEnemyBoos);
  //实例Boss子弹容器
  vcBulletBoss = new Vector();
 }
 }

 /**
 * 游戏绘图
 */
 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:
   //游戏背景
   backGround.draw(canvas, paint);
   //主角绘图函数
   player.draw(canvas, paint);
   if (isBoss == false) {
   //敌机绘制
   for (int i = 0; i 

以及胜利和失败页面

最后附上 MainActivit

public class MainActivity extends Activity {
 public static MainActivity instance;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 instance = this;
 //设置全屏
 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 //显示自定义的SurfaceView视图
 setContentView(new MySurfaceView(this));
 }

 @Override
 protected void onDestroy() {
 // TODO Auto-generated method stub
 MySurfaceView.gameState = MySurfaceView.GAME_MENU;
 super.onDestroy();
 }
}

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


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了电流源并联合并的方法,以及谐振电路的原理。谐振电路具有很强的选频能力,通过将电感和电容连接在一起,电流和电压会产生震荡。谐振频率的大小取决于电感和电容的大小,而电路中的电阻会逐渐降低震荡的幅度。电阻和电容组成的电路中,当电容放完电后,电阻两端的电压为0,电流不再流过电容。然而,电感是一种特殊的器件,当有电流流过时,线圈会产生感应磁场,阻止电流的流动,从而使电流不会减小。 ... [详细]
  • 标题: ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • 开发笔记:Docker 上安装启动 MySQL
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker上安装启动MySQL相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
jing阿囡宝_478
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有