一.飞机大战的整体思路:
飞机大战的主要使用的方法大纲:
1.概略:
Android的飞机大战用的是SurfaceView()来写,那么首先我们要继承SurfaceView这个类,然后我们还需要用多线程的来运行,那么还要实现Runnable以及SurfaceHolder.CallBack接口。实现多线程就必须要用到run()方法。
由于飞机大战的大部分工作是需要画图片到app里,那么我们又会用到Canvas这个类,这个类是画布类,所有的图片都需要画在Canvas的对象上。
然后,我们需要把图片转换成Bitmap格式。
那么,总结一下:飞机大战使用的最重要的一些类,接口和方法分别是
SurfaceView();Runnable;SurfaceHolder.CallBack;Canvas;Bitmap以及run()方法。
2.规划大概要写的类以及要实现的效果
(1)进入界面的类(Start):
构建一个Start类,这个界面上会有三张图片:背景图,logo图,开始游戏的按钮图。
那么,我们就要定义三张图片的X,Y坐标变量,还有Bitmap变量,这些变量都用private进行修饰,这是用了Java的封装,提高了代码的安全性。
然后,开始游戏按钮需要点击屏幕然后进入游戏界面,这里就用到了onTouchEvent()这个方法,那么我们就需要在SurfaceView的子类里复写这个方法,然后把start类的touchEvent()方法调用过去。
(2)进入游戏界面(需要多个类)
在进入到游戏界面时,我们需要建背景类(Background),我的飞机类(MyPlan),
boss飞机类(BossPlan),子弹类(MyBullet),爆炸类(Boom),
音效类(GameSoundPool) ,一共6个类。
首先,游戏界面的背景需要滚动,那么要在背景类(Background)将图片进行无限的循环。
在游戏界面,我们要移动自己的飞机和Boss飞机对战,那么自己飞机就需要可移动,那么同样要在MyPlan类里写一个touchEvent()方法。
boss飞机会进入疯狂模式,那么要在boss飞机类(BossPlan)写一个方法来判断它什么时候进入这个模式以及持续的时间。
子弹发射出去有它的速度和频率,那么在子弹类(MyBullet)里要对这些进行判断。
子弹击中飞机以及飞机撞到飞机会产生爆炸效果,我们需要在MyPlan和BossPlan类里分别判断飞机是否被击中或者是否被撞到。
子弹发射会有声音,以及爆炸时的爆炸声,这时我们要在音效类(GameSoundPool)里使用load()方法调用音效,然后再用play()方法播放。在使用音效前要先实例化SoundPool的对象,SoundPool是返回一个int类型的值,那么要先int一个整数来接受它,这些变量的声明都用private修饰。
3.分步进行详细操作
(1)如何绘制循环滚动背景图片
当第一张图片的y轴大于屏幕的高度时,说明第一张图片滚动结束了,用第二张图片的y轴减去图片高度,这时第一张图片下一次的y轴就在这。
滚动逻辑代码:
public void logic() {
y1 += 3;
y2 += 3;
if (y1 > MySurfaceView.height) {
y1 = y2 - bitmap1.getHeight(); //当y轴大于手机屏幕高度,下一张图的y轴减去图片高度,第一张图片下一次的y轴就在这
}
if (y2 > MySurfaceView.height) {
y2 = y1 - bitmap1.getHeight();
}
}
(2)如何绘制飞机
绘制飞机的图片用Canvas的对象调用draw()方法就行了,由于飞机需要根据手指移动,那么就要判断当手指的坐标在飞机内移动,飞机才会跟随移动,否则飞机不动。
触摸事件就要用toTouchEveny()方法来写,boss飞机有疯狂模式,要定义一个计数器来判断它进入疯狂模式的时间
触摸事件逻辑代码:
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;//起始坐标(0,0)在左上角,移动的话会向反方向,把起始坐标调整到它中间
y = (int) ey - height / 2;
if (y < 0) {
y = 0;
}
if (y > MySurfaceView.height - height) {
y = MySurfaceView.height - height;
}
if (x < 0) {
x = 0;
}
if (x > MySurfaceView.width - width) {
x = MySurfaceView.width - width;
}
}
}
}
判断boss飞机是否进入疯狂模式代码:
private int count; //疯狂模式计数器
private int crazySpeed = 45; //疯狂模式速读
private int time = 200; //疯狂模式时间
private boolean isCrazy; //是否进入疯狂模式
public void logic(){
count++;
if(isCrazy){ //判断boss飞机是否进入疯狂模式
y = y+crazySpeed;
crazySpeed--;
if(y==0){
isCrazy = false;
crazySpeed = 50;
}
}else{
if(count%time=&