1、整体实现思路
(1)在绘制飞机、绘制导弹、爆炸效果、背景图片等利用了canvas的drawBitmap方法 ;
(2)监听屏幕,飞机跟踪等运用了onTouchEvent的方法;
(3)在背景音乐,爆炸音效等等方面,用到了SoundPool。
(4)
2、如何绘制循环滚动的背景图片
private void logic() { y1 += 5; y2 += 5; if (y1 >= MySurfaceView.height) { y1 = y2 - bitmap.getHeight(); } else if (y2 >= MySurfaceView.height) { y2 = y1 - bitmap.getHeight(); } }
public void draw(Canvas canvas,Paint paint) { canvas.drawColor(Color.WHITE); canvas.drawBitmap(bitmap, 0, y1, paint); canvas.drawBitmap(bitmap, 0, y2, paint); logic(); }
public void run() { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bk);
这部分代码完成了背景循环滚动速率及循环
3、如何绘制飞机
在飞机的绘制中,利用了canvas的drawBitmap方法
以x,y为轴,监听屏幕,,飞机随着手指移动。
飞机的长宽高的设定(x,y)
this.bitmap1 = bitmap1; this.bitmaphp = bitmap2; x = MySurfaceView.width/2-bitmap1.getWidth()/2; y = MySurfaceView.heigth-bitmap1.getHeight(); width = bitmap1.getWidth(); heigth = bitmap1.getHeight(); }
还要记得用代码裁剪飞机
public void myPlane (Canvas canvas,Paint paint){ if (noCollsion){ count++; if (count%8==0){ canvas.drawBitmap(bitmap1,x,y,paint); } if (count==100){ noCollsion=false; count=0; } }else { canvas.drawBitmap(bitmap1,x,y,paint); } for (int i =0;i<hp;i++){ canvas.drawBitmap(bitmaphp,i*bitmaphp.getWidth(),MySurfaceView.heigth-bitmaphp.getHeight(),paint); } }
4、如何绘制子弹
绘制Boss的子弹
for(int i=0;i<boosBulletVector.size();i++){ boosBulletVector.elementAt(i).draw(canvas,paint); plane.isCollision(boosBulletVector.elementAt(i)); }
//移除飞机的子弹
for(int i=0;i<bulletVector.size();i++){ if(bulletVector.elementAt(i).isOut()){ bulletVector.remove(i); } }
//绘制飞机的子弹
for(int i=0;i<bulletVector.size();i++){ bulletVector.elementAt(i).draw(canvas,paint); if(bossPlane.isCollison(bulletVector.elementAt(i))){ } }
public void draw(Canvas canvas, Paint paint){ canvas.drawBitmap(bitmap,x,y,paint); ff(); } private void ff(){ switch (teyp){ case 0: y-=speed; if (y<-300){ isDead=true; } break; case 1: y+=(speed/2); if (y>MySurfaceView.heigth){ isDead=true; }
//我的小飞机的子弹
Bitmap bitmap3 = BitmapFactory.decodeResource(getResources(),R.mipmap.mybullet);
//敌机敌机!!!!BOSS的子弹
Bitmap bitmap4 = BitmapFactory.decodeResource(getResources(),R.mipmap.bossbullet);
5、如何判断碰撞(子弹与飞机碰撞,飞机与飞机碰撞)
判断范围
private void ff(){ switch (teyp){ case 0: y-=speed; if (y<-300){ isDead=true; } break; case 1: y+=(speed/2); if (y>MySurfaceView.heigth){ isDead=true; } break; } }
6、如何绘制爆炸效果
爆炸效果利用了canvas的drawBitmap 方法
都要用到ArrayList数组 ,
public void draw(Canvas canvas, Paint paint){ canvas.save(); canvas.clipRect(x,y,x+frameW,y+frameH); canvas.drawBitmap(bitmap,x,y,paint); canvas.restore(); ff(); public void logic(){ if (currentFrame<totalFrame){ currentFrame++; }else { isEnd = true; } }
7、如何添加音效
首先要定义建造一个GameSoundPool类
其次定义一个SoundPool对象
用电脑自带的的播放器用soundPool.play播放
public class GameSoundpool { private SoundPool soundPool; private int s1; private int s2; 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); } public void playSound(int s){ switch (s){ case 1: soundPool.play(s1,1,1,0,1,1.0f); break; case 2: soundPool.play(s2,1,1,0,1,1.0f); break; } } }
8、哪些地方用封装,继承,多态、方法重载、接口等
封装:处处都有,无处不在!
借口:SurfaceHolder.Callback,与Runnable
继承:MySurfaceView类中有用到哦!!
多态:。。。。。。(没找到用到的地方)
方法重载:。。。。。(没找到用到的地方)
9、我的收获与感悟
作为我的第一个安卓项目,我对他有爱有恨。整整一周,我对他花了太多心思,思考做不出来的
过程是痛苦的,紧张的。但是他也让我补足了之前不懂的部分知识,虽然苦,但我觉得,是值得的!!
这次做的代码,还有不足之处,所以我不能放弃,安卓开发的知识是身高的,难度极高的,即使这样,
我还是应该有信心去完成一个又一个项目