一.飞机大战整体思路

1.选定背景,然后设置背景,实现两张背景的循环,达成背景的循环滚动的效果
2.加上一个玩家飞机,给他赋予初始位置,然后给玩家飞机Touch,实现玩家飞机能按照手指的触摸位置来进行移动的效果
3.加上Boss飞机,在背景的上方给Boss飞机进行判断,实现飞机的左右移动,设置Boss飞机的疯狂状态
4.给飞机加上子弹,玩家飞机和Boss飞机子弹都是一样的,创建一个speed给它赋值,这是子弹的速度,用speed++进行子弹的加速,再定义一个isdead,进行子弹的判断
5.进行判断,判断当子弹撞到飞机的时候的各种不同的反应,自己飞机撞到敌机时候的反应,比如玩家飞机和Boss飞机的血量的减少,以及飞机碰到时候的闪烁状态,然后就是赋予碰撞时的声音
6.给飞机和子弹和游戏整体加上背景音效

二.如何实现背景图片滚动

首先定义图片的x,y,Bitmap,给这三个值赋予构造方法,要有canvas和paint,一定要锁定画板和解锁画板,然后在逻辑方法中进行判断,给x和y进行++实现背景的滚动,当你的第一张图循环结束,把第二张图放在后面继续进行滚动,第一张图立马放到第二张图后面接着循环,在视觉上形成一种循环的效果。
下面是背景这一部分的代码:

/*** 背景图片*/import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;public class BackGroud {private int x;private int y;private  Bitmap bitmap;public BackGroud(Bitmap bitmap){this.bitmap = bitmap;x = 0;y = x-bitmap.getHeight();}public void draw(Canvas canvas){logic();Paint paint = new Paint();canvas.drawBitmap(bitmap,0, x,paint);canvas.drawBitmap(bitmap,0, y,paint);}public void logic(){ //逻辑方法x+=10;y+=10;if(x>=bitmap.getHeight()){x = y-bitmap.getHeight(); //移动在第二张上面}if(y>=bitmap.getHeight()){y=x-bitmap.getHeight();}}}

三.如何绘制飞机

先给飞机定义一个初始位置,通过定义的属性在屏幕底部的中间,因为屏幕左上角是原点坐标,所以这里的X,Y是飞机和屏幕的左上角的位置,这时候的飞机在中间偏右这个位置,所以你要减去半个飞机的宽度才能到达正中心。

/**
*玩家飞机
*/
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;public class Myplane {private Bitmap bitmap;private Bitmap bitmapHp;private int x, y;private int width, height;private boolean noCollision;private int noCollisionCount;private int Hp = 3;public Myplane(Bitmap bitmap, Bitmap bitmapHp) {this.bitmapHp = bitmapHp;this.bitmap = bitmap;x = MySurfaceView.width / 2 - bitmap.getWidth() / 2;//中间y = MySurfaceView.height - bitmap.getHeight();width = bitmap.getWidth();height = bitmap.getHeight();}public void draw(Canvas canvas, Paint paint) {if(Hp<=0){MySurfaceView.Game_start = 3;}if (noCollision) {noCollisionCount++;if (noCollisionCount % 10 == 0) {canvas.drawBitmap(bitmap, x, y, paint);//闪烁:无敌状态}if (noCollisionCount > 100) { //无敌时间noCollision = false;noCollisionCount = 0;}} else {canvas.drawBitmap(bitmap, x, y, paint);//非无敌状态}for (int i = 0; i < Hp; i++) {canvas.drawBitmap(bitmapHp, i * bitmapHp.getWidth(), MySurfaceView.height - bitmapHp.getHeight(), paint);//HP位置}}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;}}}}//我方飞机与boss子弹public boolean isCollision(Bullet bullet) {if (noCollision) {return false;}if (bullet.getX() > x && bullet.getX() < x + width && bullet.getY() > y && bullet.getY() < y + height) {noCollision = true;if (Hp > 0) {Hp--;}return true;}return false;}//我方飞机与bosspublic boolean Attack(Bossplane bossplane) {if (noCollision) {return false;}if(y<bossplane.getY()+bossplane.getFrameH()&&y+height>bossplane.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;}}return false;}public int getX() { return x; }public int getY() { return y; }public int getWidth() {return width;}public int getHeight() {return height;}
}

四.如何绘制子弹

首先定义三要素,然后写他们的构造方法。要写一个speed,是给子弹赋予速度。

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;}

五.如何判断碰撞

1.飞机与子弹碰撞
当飞机的坐标和子弹的坐标重合的时候,我们要实现飞机血量的减少,来达到你的飞机碰撞的效果。我们要对Boss子弹和玩家飞机碰撞的时候进行判断,判断子弹碰到飞机各种情况时候的状态。

public boolean isCollision(Bullet bullet){if (noCollision){return false;}else{if (bullet.getX()>x&&bullet.getX()<x+width&&bullet.getY()>y&&bullet.getY()<y+height){noCollision = true;if (hp>0){hp--;}return true;}}return false;}

2.飞机与Boss机碰撞
实现玩家飞机和Boss飞机的碰撞,跟飞机和子弹的碰撞一样,都要判断他的各种状态

 public boolean isCollision(BossPlane bossPlane) {if (noCollision){return false;}else{if(bossPlane.getY()+bossPlane.getFrameH()>y&&bossPlane.getY()+bossPlane.getFrameH()<y+height){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;}}}return false;}

六.如何绘制爆炸效果

这里用的是图片的裁剪,因为图片有七张图组成,要用clip方法裁剪,在裁剪前一定要写上save和restore方法。

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;/****/
public class Boom {private Bitmap bitmap;private int x,y;private int totalFrame;private int currentFrame;//当前显示的第几幅画面private int frameW,frameH;private boolean isEnd;public Boom(Bitmap bitmap,int x,int y,int totalFrame){this.bitmap = bitmap;this.x = x;this.y = y;this.totalFrame = totalFrame;frameW = bitmap.getWidth()/totalFrame;frameH = bitmap.getHeight();}public void draw(Canvas canvas, Paint paint){canvas.save();canvas.clipRect(x,y,x+frameW,y+frameH);canvas.drawBitmap(bitmap,x-currentFrame*frameW,y,paint);canvas.restore();logic();}public void logic(){if (currentFrame<totalFrame){currentFrame++;}else {isEnd = true;}}public boolean isEnd(){return isEnd;}
}

七.如何添加音效

现创建一个raw,然后将音乐加入进去。调用this.soundPool,先让他实例化,给他选择音乐和优先级别等。

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;public class GameSoundPool {private SoundPool soundPool;private int s1;private int s2;private int s3;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.explosion2,1);// s3 = soundPool.load(context,R.raw.bg_logobg,2);}public void playSound(int s) {switch (s){case 1:soundPool.play(s1,1,1,1,1,1.0f);break;case 2:soundPool.play(s2,1,1,1,1,1.0f);break;case 3:soundPool.play(s3,1,1,1,1,1.0f);break;}}}

这是最后的效果图

八.哪些地方用到封装,继承,多态,方法重载,接口等

1.继承和接口主要是在mysurfaceview中体现,mysurfaceview继承了surfaceview中的属性和方法,还要实现SurfaceHolder.Callback,Runnable的接口。

2.用的最多的就是封装每个类定义的变量有public型的还有private型的,讲到这个就不得不说四种范围访问修饰符:当前类访问权限:private,包访问权限:default,子类访问权限:protected,公共类访问权限:public。其中private型的只能通过set和get方法来调用。

3.方法的重载主要体现在飞机类和子弹类中,在飞机和子弹类中,飞机与飞机的碰撞中定义了同一个类名,然而参数列表不一样,调用的时候,就按照里面的参数来进行传参。

九.感悟

这一个月的学习虽然很累,但是真的学到了很多。从一开始的什么都不懂,到现在能自己打代码,我自己觉得进步真的还是可以的。从一开始九九乘法表都不会,到现在封装多态啊学了很多专有名词和快捷方式。刚开始就是很兴奋的那种感觉,但是后来在学File类的时候不会真的一点不会,贼绝望。就想放弃,但是后来又好好打代码,抄了一遍又自己写了一遍,慢慢好像就懂一点。这个时候感觉勤能补拙还是有道理的。通过这一个月的学习我觉得对于一个软件班的人收获还是很大的。

Android stutio实现飞机大战相关推荐

  1. Android Studio实现飞机大战

    项目目录 一.项目概述 二.开发环境 三.详细设计 四.运行演示 六.源码获取 一.项目概述 通过自定义View实现Android飞机大战小游戏,游戏玩法很简单,可以锻炼玩家的反应能力.开启背景音乐进 ...

  2. android项目飞机大战,Android 项目之飞机大战

    首先,我们要创建一个GameSurface()类:我们此次采用的是画登入界面的方式,所以GameSurface()需要继承SurfaceView类而且要执行SurfaceHolder.Callback ...

  3. Eclipse开发Android平台的飞机大战游戏APP

    目 录 摘 要 I 一. 绪论 1 (一) 课题的目的与意义 1 (二) 本课题解决的问题 1 1. 欢迎界面 1 2. 帮助界面 1 3. 游戏界面 1 4. 失败界面 2 5. 胜利界面 2 6. ...

  4. android:怎样用一天时间,写出“飞机大战”这种游戏!(无框架-SurfaceView绘制)...

    序言 作为一个android开发人员,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的. 体验地址:http://www.wandoujia ...

  5. Android游戏之仿 微信飞机大战

    暑假实训的一个程序,也是我第一次接触java和android开发,模仿微信的飞机大战,效果图如下:                 一:素材整理 素材来自网络,下载地址在此:http://downlo ...

  6. Android studio飞机大战游戏分析-月末总结

    整体实现思路 绘制循环滚动的背景图片创建BackGround类 绘制飞机和子弹.创建Myplane和Bullet类 在Myplane中构造isCollision绘制飞机与boss飞机的碰撞,飞机与子弹 ...

  7. 学不动了,尝试用Android Jetpack Compose重写微信经典飞机大战游戏

    前段时间看了TechMerger大佬写的<一气呵成:用Compose完美复刻Flappy Bird!>,甚是有趣,按耐不住那躁动的心,笔者决定跟随大佬的脚步通过写游戏的方式学习Jetpac ...

  8. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  9. android飞机大战

    Android飞机大战 简述 android游戏继承surfaceView开发,实现Callback接口,Callback接口作用是回调. 实现Callback接口后,要实现三个抽象方法:surfac ...

最新文章

  1. 设计模式之反射与配置文件
  2. 深度学习100例 | 第27天-卷积神经网络(CNN):艺术作品识别
  3. 000-SQL Server
  4. String、StringBuilder和StringBuffer的区别和用法
  5. linux保存日志报错,为什么在Linux上错误mongod死了,但子系统被锁定,可用空间不足以存放日志文件?...
  6. WPF DataGrid:解决排序、ScrollIntoView、刷新和焦点问题
  7. ios审核一般要多久_水电施工要注意哪些问题?水电施工一般需要多久
  8. 硬纪元AI峰会前瞻:线下大数据驱动下的新零售,目标是精准营销
  9. 安装配置nagios
  10. 让一个数字显示指定位数
  11. 【数学建模】历年全国大学生数学建模竞赛题目+定位分析
  12. mib节点 snmp trap_(转)浅谈 Linux 系统中的 SNMP Trap
  13. 三维装箱算法matlab,三维装箱遗传算法matlab程序
  14. freyja框架 github地址
  15. SDM439/SDM429/SDM450 Sensors Overview (80-PF208-11)
  16. 软件开发量评估法之一---德尔菲评估法
  17. 开关电源补偿环路设计(2):实践部分-例题
  18. 完爆面试官!黑马学java学费多少
  19. matlab如何写不等于号,不等于号(不等于号可以往右写么)
  20. 轩辕剑--资料集(五)

热门文章

  1. 下载全网音视频资源的神器—You-get
  2. SQL 创建表的备份
  3. 小翻译 v3.0.6中文版 (即时英语翻译软件)
  4. 功率电感dcr参数_电感的描述、主要参数、作用以及检测
  5. DeamNet代码学习||网络框架核心代码 逐句查找学习
  6. 计算机组装与维护实训教师评语,计算机组装与维护实训计划打印版.docx
  7. 删除右键上传到有道云笔记
  8. 相对定位 和 绝对定位
  9. shell脚本的人机石头剪刀布游戏
  10. 2021-Semantic Image Matting