Android_(游戏)打飞机04:绘画敌机、添加子弹
?
?
?
(游戲)打飛機01:前言 傳送門
(游戲)打飛機02:游戲背景滾動 傳送門
(游戲)打飛機03:控制玩家飛機 傳送門?
(游戲)打飛機04:繪畫敵機、添加子彈 ??傳送門
(游戲)打飛機05:處理子彈,擊中敵機,添加計分板 傳送門
(游戲)打飛機06:后續(xù) 傳送門
?
?
?
繪畫敵機、添加子彈效果
?
?
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 implementsSurfaceHolder.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;@Overridepublic boolean onTouch(View v, MotionEvent event) {//手接近屏幕產(chǎn)生的事件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){//移動鼠標(biāo)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){//松開鼠標(biāo)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;}@Overridepublic int getX() {return x;}@Overridepublic 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;@Overridepublic 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;}@Overridepublic int getX() {return x;}@Overridepublic 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>();private FeijiImage(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()));//得到戰(zhàn)機的高和寬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;@Overridepublic Bitmap getBitmap() {Bitmap bitmap = bitmaps.get(index);//控制切換四個飛機的頻率if(num == 7){index++;if(index == bitmaps.size()){index=0;}num=0;}num++;return bitmap;}@Overridepublic int getX() {return x;}@Overridepublic int getY() {return y;}public void setY(int y){this.y=y;}public void setX(int x){this.x=x;}}//負(fù)責(zé)背景照片的處理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){}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {state = false;}@Overridepublic 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{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//去掉標(biāo)題// requestWindowFeature(Window.FEATURE_NO_TITLE);dafeijiGameView view = new dafeijiGameView(this);setContentView(view);}} MainActivity.java?
實現(xiàn)過程
?
繪制敵機
?
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;@Overridepublic 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;}@Overridepublic int getX() {return x;}@Overridepublic 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(矩陣)來實現(xiàn)旋轉(zhuǎn)等高級方式截圖
Bitmap?source:要從中截圖的原始位圖
int?x:起始x坐標(biāo)
int?y:起始y坐標(biāo)
int?width:要截的圖的寬度
int?height:要截的圖的寬度
Bitmap.Config??config:一個枚舉類型的配置,可以定義截到的新位圖的質(zhì)量
返回值:返回一個剪切好的Bitmap? 繪制飛機飛行動畫(不斷切換四張圖片,看起來像飛機飛) private int index=0;private int num =0;@Overridepublic 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));?
在游戲繪畫中心中添加敵機出現(xiàn)
//繪畫中心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){}}?
敵機出現(xiàn)頻率
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 implementsSurfaceHolder.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;@Overridepublic boolean onTouch(View v, MotionEvent event) {//手接近屏幕產(chǎn)生的事件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){//移動鼠標(biāo)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){//松開鼠標(biāo)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;@Overridepublic 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;}@Overridepublic int getX() {return x;}@Overridepublic 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>();private FeijiImage(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()));//得到戰(zhàn)機的高和寬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;@Overridepublic Bitmap getBitmap() {Bitmap bitmap = bitmaps.get(index);//控制切換四個飛機的頻率if(num == 7){index++;if(index == bitmaps.size()){index=0;}num=0;}num++;return bitmap;}@Overridepublic int getX() {return x;}@Overridepublic int getY() {return y;}public void setY(int y){this.y=y;}public void setX(int x){this.x=x;}}//負(fù)責(zé)背景照片的處理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;// 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){}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {state = false;}@Overridepublic 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?
?
游戲中添加子彈
?
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;}@Overridepublic int getX() {return x;}@Overridepublic int getY() {return y;}} zidan.class?
判斷子彈出現(xiàn)飛機位置
public Zidan(FeijiImage feiji,Bitmap zidan){this.feiji=feiji;this.zidan=zidan;x=(feiji.getX()+feiji.getWidth()/2)-25;//居中位置y=feiji.getY()-zidan.getHeight();}(-25是自己微調(diào))
?
子彈超出邊界的時候釋放子彈內(nèi)存,減少手機開銷
public Bitmap getBitmap() {y-=19;if(y<=-10){zidans.remove(this);}return zidan;}?
不斷的出現(xiàn)新的子彈
if(selectfeiji!=null){if(zidan_num==10){zidans.add(new Zidan(selectfeiji,zidan));zidan_num=0;}zidan_num++;}?
便利所有的子彈
for(GameImage image:(List<GameImage>)zidans.clone()){newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);}?
轉(zhuǎn)載于:https://www.cnblogs.com/1138720556Gary/p/9457052.html
總結(jié)
以上是生活随笔為你收集整理的Android_(游戏)打飞机04:绘画敌机、添加子弹的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译安装PHP-7.2.8
- 下一篇: Python3.6全栈开发实例[005]