会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述Android_(游戏)打飞机04:绘画敌机添加子弹相关的知识,希望能为你提供帮助。
(游戏)打飞机01:前言传送门
(游戏)打飞机02:游戏背景滚动传送门
(游戏)打飞机03:控制玩家飞机传送门
(游戏)打飞机04:绘画敌机、添加子弹
传送门
【Android_(游戏)打飞机04(绘画敌机添加子弹)】(游戏)打飞机05:处理子弹,击中敌机,添加计分板传送门
(游戏)打飞机06:后续传送门
绘画敌机、添加子弹效果
文章图片
文章图片
文章图片
package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Created by Administrator on 2018/8/9. */public class dafeijiGameView extends SurfaceView implements SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{private Bitmap my; //自己 private Bitmap baozha; //爆炸 private Bitmap bg; //背景 private Bitmap diren; //敌人 private Bitmap zidan; //子弹 private Bitmap erjihuancun; //二级缓存 private WindowManager windowManager; //获得界面长宽高 private int display_w; //界面的宽 private int display_h; //界面的高 private ArrayList< GameImage> gameImage = new ArrayList(); private ArrayList< Zidan> zidans = new ArrayList< Zidan> (); public dafeijiGameView(Context context) { super(context); getHolder().addCallback(this); //事件注册 this.setOnTouchListener(this); }private void init(){ //加载照片 my= BitmapFactory.decodeResource(getResources(),R.drawable.my); baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha); bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg); diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren); zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan); erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888); gameImage.add(new BeijingImage(bg)); //先加入背景照片 gameImage.add(new FeijiImage(my)); gameImage.add(new DijiImage(diren)); }FeijiImage selectfeiji; @Override public boolean onTouch(View v, MotionEvent event) { //手接近屏幕产生的事件 if(event.getAction()==MotionEvent.ACTION_DOWN){ for(GameImage game: gameImage){ if(game instanceof FeijiImage){FeijiImage feiji = (FeijiImage)game; //判断条件为真时选中飞机 if(feiji.getX()< event.getX()& & feiji.getY()< event.getY()& & feiji.getX()+feiji.getWidth()> event.getX() & & feiji.getY()+feiji.getHeigth()> event.getY()){ selectfeiji=feiji; }else{ selectfeiji=null; } break; } } }else if(event.getAction()==MotionEvent.ACTION_MOVE){ //移动鼠标 if( selectfeiji!=null){ selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2); selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2); }}else if(event.getAction()==MotionEvent.ACTION_UP){ //松开鼠标 selectfeiji=null; }return true; }private interface GameImage{ public Bitmap getBitmap(); public int getX(); public int getY(); }private class Zidan implements GameImage{Bitmap zidan; private FeijiImage feiji; private int x; private int y; public Zidan(FeijiImage feiji,Bitmap zidan){ this.feiji=feiji; this.zidan=zidan; x=(feiji.getX()+feiji.getWidth()/2)-25; //居中位置 y=feiji.getY()-zidan.getHeight(); }public Bitmap getBitmap() { y-=19; if(y< =-10){ zidans.remove(this); } return zidan; }@Override public int getX() { return x; }@Override public int getY() { return y; } }private class DijiImage implements GameImage{private Bitmap diren = null; private List< Bitmap> bitmaps = new ArrayList< Bitmap> (); private int x; private int y; public DijiImage(Bitmap diren){ this.diren=diren; bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight())); y=-diren.getHeight(); Random ran = new Random(); x=ran.nextInt(display_w-(diren.getWidth()/4)); }private int index=0; private int num =0; @Override public Bitmap getBitmap() { Bitmap bitmap = bitmaps.get(index); //控制切换四个飞机的频率 if(num == 7){ index++; if(index == bitmaps.size()){ index=0; } num=0; } y+=3; num++; if(y> display_h){ gameImage.remove(this); }return bitmap; }@Override public int getX() { return x; }@Override public int getY() { return y; } }private class FeijiImage implements GameImage{private Bitmap my; private int x; private int y; private int width; private int heigth; private int getWidth(){ return width; }private int getHeigth(){ return heigth; }private List< Bitmap> bitmaps = new ArrayList< Bitmap> (); privateFeijiImage(Bitmap my){ this.my=my; bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight())); bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight())); bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight())); bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight())); //得到战机的高和宽 width=my.getWidth()/4; heigth=my.getHeight(); x=(display_w - my.getWidth()/4)/2; y=display_h-my.getHeight()-30; }private int index=0; private int num =0; @Override public Bitmap getBitmap() { Bitmap bitmap = bitmaps.get(index); //控制切换四个飞机的频率 if(num == 7){ index++; if(index == bitmaps.size()){ index=0; } num=0; } num++; return bitmap; }@Override public int getX() { return x; }@Override public int getY() { return y; }public void setY(int y){ this.y=y; }public void setX(int x){ this.x=x; }}//负责背景照片的处理 private class BeijingImage implements GameImage{ private Bitmap bg; private BeijingImage(Bitmap bg){ this.bg=bg; newBitmap = Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888); }private Bitmap newBitmap = null; private int height = 0; public Bitmap getBitmap(){ Paint p = new Paint(); Canvas canvas = new Canvas(newBitmap); canvas.drawBitmap(bg, new Rect(0,0,bg.getWidth(),bg.getHeight()), new Rect(0,height,display_w,display_h+height),p); canvas.drawBitmap(bg, new Rect(0,0,bg.getWidth(),bg.getHeight()), new Rect(0,-display_h+height,display_w,height),p); height++; if(height==display_h){ height=0; } return newBitmap; }public int getX(){ return 0; }public int getY(){ return 0; } }private boolean state = false; private SurfaceHolder holder; //绘画中心 public void run() { Paint p1 = new Paint(); int diren_num=0; // int zidan_num=0; try{ while(state){ if(selectfeiji!=null){ if(zidan_num==10){ zidans.add(new Zidan(selectfeiji,zidan)); zidan_num=0; } zidan_num++; }Canvas newCanvas = new Canvas(erjihuancun); for(GameImage image:(List< GameImage> )gameImage.clone()){ newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1); }for(GameImage image:(List< GameImage> )zidans.clone()){ newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1); }if(diren_num==150){ diren_num=0; gameImage.add(new DijiImage(diren)); } diren_num++; Canvas canvas = holder.lockCanvas(); canvas.drawBitmap(erjihuancun,0,0,p1); holder.unlockCanvasAndPost(canvas); Thread.sleep(10); } }catch(Exception e){ } }@Override public void surfaceCreated(SurfaceHolder holder) { }@Override public void surfaceDestroyed(SurfaceHolder holder) { state = false; }@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //得到屏幕的宽和高 display_w=width; display_h=height; init(); this.holder=holder; state = true; new Thread(this).start(); }}
dafeijiGameView.java
文章图片
文章图片
package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity{@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去掉标题 // requestWindowFeature(Window.FEATURE_NO_TITLE); dafeijiGameView view =new dafeijiGameView(this); setContentView(view); }}
MainActivity.java
实现过程
绘制敌机
文章图片
文章图片
private class DijiImage implements GameImage{private Bitmap diren = null; private List< Bitmap> bitmaps = new ArrayList< Bitmap> (); private int x; private int y; public DijiImage(Bitmap diren){ this.diren=diren; bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight())); y=-diren.getHeight(); Random ran = new Random(); x=ran.nextInt(display_w-(diren.getWidth()/4)); }private int index=0; private int num =0; @Override public Bitmap getBitmap() { Bitmap bitmap = bitmaps.get(index); //控制切换四个飞机的频率 if(num == 7){ index++; if(index == bitmaps.size()){ index=0; } num=0; } y+=3; num++; if(y> display_h){ gameImage.remove(this); }return bitmap; }@Override public int getX() { return x; }@Override public int getY() { return y; } }
DijiImage.java
初始化游戏时候加载敌机类
private void init(){ //加载照片 my= BitmapFactory.decodeResource(getResources(),R.drawable.my); baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha); bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg); diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren); zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan); erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888); gameImage.add(new BeijingImage(bg)); //先加入背景照片 gameImage.add(new FeijiImage(my)); gameImage.add(new DijiImage(diren)); }
绘制敌机飞行动画
private List< Bitmap> bitmaps = new ArrayList< Bitmap> ();
将四张敌机加入链表
bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight()));
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
从原始位图剪切图像,这是一种高级的方式。可以用Matrix(矩阵)来实现旋转等高级方式截图
参数说明:传送门
Bitmap source:要从中截图的原始位图
int x:起始x坐标
int y:起始y坐标
int width:要截的图的宽度
int height:要截的图的宽度
Bitmap.Config config:一个枚举类型的配置,可以定义截到的新位图的质量
返回值:返回一个剪切好的Bitmap
文章图片
绘制飞机飞行动画(不断切换四张图片,看起来像飞机飞)
private int index=0; private int num =0; @Override public Bitmap getBitmap() { Bitmap bitmap = bitmaps.get(index); //控制切换四个飞机的频率 if(num == 7){ index++; if(index == bitmaps.size()){ index=0; } num=0; }//y+=3控制敌机下降速度 y+=3;
随机位置生成敌机
y=-diren.getHeight(); Random ran = new Random(); x=ran.nextInt(display_w-(diren.getWidth()/4));
在游戏绘画中心中添加敌机出现
//绘画中心 public void run() { Paint p1 = new Paint(); int diren_num=0; // try{ while(true){ Canvas newCanvas = new Canvas(erjihuancun); for(GameImage image:(List< GameImage> )gameImage.clone()){ newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1); } if(diren_num==150){ diren_num=0; gameImage.add(new DijiImage(diren)); } diren_num++; Canvas canvas = holder.lockCanvas(); canvas.drawBitmap(erjihuancun,0,0,p1); holder.unlockCanvasAndPost(canvas); Thread.sleep(10); } }catch(Exception e){ } }
敌机出现频率
if(diren_num==150){ diren_num=0; gameImage.add(new DijiImage(diren)); } diren_num++;
文章图片
文章图片
文章图片
package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * Created by Administrator on 2018/8/9. */public class dafeijiGameView extends SurfaceView implements SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{private Bitmap my; //自己 private Bitmap baozha; //爆炸 private Bitmap bg; //背景 private Bitmap diren; //敌人 private Bitmap zidan; //子弹 private Bitmap erjihuancun; //二级缓存 private WindowManager windowManager; //获得界面长宽高 private int display_w; //界面的宽 private int display_h; //界面的高 private ArrayList< GameImage> gameImage = new ArrayList(); public dafeijiGameView(Context context) { super(context); getHolder().addCallback(this); //事件注册 this.setOnTouchListener(this); }private void init(){ //加载照片 my= BitmapFactory.decodeResource(getResources(),R.drawable.my); baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha); bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg); diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren); zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan); erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888); gameImage.add(new BeijingImage(bg)); //先加入背景照片 gameImage.add(new FeijiImage(my)); gameImage.add(new DijiImage(diren)); }FeijiImage selectfeiji; @Override public boolean onTouch(View v, MotionEvent event) { //手接近屏幕产生的事件 if(event.getAction()==MotionEvent.ACTION_DOWN){ for(GameImage game: gameImage){ if(game instanceof FeijiImage){FeijiImage feiji = (FeijiImage)game; //判断条件为真时选中飞机 if(feiji.getX()< event.getX()& & feiji.getY()< event.getY()& & feiji.getX()+feiji.getWidth()> event.getX() & & feiji.getY()+feiji.getHeigth()> event.getY()){ selectfeiji=feiji; }else{ selectfeiji=null; } break; } } }else if(event.getAction()==MotionEvent.ACTION_MOVE){ //移动鼠标 if( selectfeiji!=null){ selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2); selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2); }}else if(event.getAction()==MotionEvent.ACTION_UP){ //松开鼠标 selectfeiji=null; }return true; }private interface GameImage{ public Bitmap getBitmap(); public int getX(); public int getY(); }private class DijiImage implements GameImage{private Bitmap diren = null; private List< Bitmap> bitmaps = new ArrayList< Bitmap> (); private int x; private int y; public DijiImage(Bitmap diren){ this.diren=diren; bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight())); bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight())); y=-diren.getHeight(); Random ran = new Random(); x=ran.nextInt(display_w-(diren.getWidth()/4)); }private int index=0; private int num =0; @Override public Bitmap getBitmap() { Bitmap bitmap = bitmaps.get(index); //控制切换四个飞机的频率 if(num == 7){ index++; if(index == bitmaps.size()){ index=0; } num=0; } y+=3; num++; if(y> display_h){ gameImage.remove(this);
推荐阅读
- POJ2486 Apple Tree 树上背包
- 调用android的getColor()方法出现 java.lang.NoSuchMethodError: android.content.res.Resources.getColor
- QWidget编写的安卓app
- 线段树+dfs序(Apple Tree )(Assign the task )
- Struts 2动作介绍和用法详解
- Struts 2 OGNL使用介绍
- Struts 2 ActionInvocation用法介绍
- Struts 2 ValueStack使用详细教程
- Struts 2 ActionContext用法详细教程