zoukankan      html  css  js  c++  java
  • Android_(游戏)打飞机02:游戏背景滚动

      

    (游戏)打飞机01:前言  传送门

    (游戏)打飞机02:游戏背景滚动  传送门

    (游戏)打飞机03:控制玩家飞机   传送门 

    (游戏)打飞机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.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.WindowManager;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by Administrator on 2018/8/9.
     */
    
    public class dafeijiGameView extends SurfaceView implements
            SurfaceHolder.Callback,Runnable{
    
        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 List<GameImage> gameImage = new ArrayList();
    
        public dafeijiGameView(Context context) {
            super(context);
            getHolder().addCallback(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));    //先加入背景照片
        }
    
    
        private interface GameImage{
            public Bitmap getBitmap();
            public int getX();
            public int getY();
        }
    
        //负责背景照片的处理
        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();
            try{
                while(true){
                    Canvas newCanvas = new Canvas(erjihuancun);
    
                    for(GameImage image:gameImage){
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }
    
                    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();
        }
    
    }
    dafeijiView.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

    实现过程

      使用线程绘画游戏

    public void run() {
            Paint p1 = new Paint();
            try{
                while(true){
                    Canvas newCanvas = new Canvas(erjihuancun);
    
                    for(GameImage image:gameImage){
                        newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
                    }
    
                    Canvas canvas = holder.lockCanvas();
                    canvas.drawBitmap(erjihuancun,0,0,p1);
                    holder.unlockCanvasAndPost(canvas);
                    Thread.sleep(10);
                }
            }catch(Exception e){
            }
        }

      绘画移动的背景图片

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

      surfaceCreated:创建时初始化图片并开启线程绘画游戏

      @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();
        }

      初始化函数。加载图片

        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));    //先加入背景照片
        }

      

      线程中使用二级缓存绘画背景,每隔10ms绘画一次

                    Canvas canvas = holder.lockCanvas();
                    canvas.drawBitmap(erjihuancun,0,0,p1);
                    holder.unlockCanvasAndPost(canvas);
                    Thread.sleep(10);

      图片坐标的移动

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

      宽度不发生改变,长度发生变化,两张图片的高不断升高(height++)

    canvas.drawBitmap(bitmap, srcRect, dstRect, paint) :在图片上绘制图片  传送门

      1参:要绘制的图片

      2参: 是对图片进行裁截,可以传null,传null则表示显示整个图片

      3参:目标区域,即把原区域改变参数,得到自己想要的图片及位置,是图片在Canvas画布中显示的区域

      4参:paint画笔,可以为null

    Rect(left,top,right,bottom) :用于表示坐标系中的一块矩形区域   

      left:左

      top:上

      right:右

      bottom:下

                if(height==display_h){
                    height=0;
                }

      其实只是两张照片拼接而成,两张图片不断的向上移动。开始时,第一张在手机屏幕中间,第二张在手机屏幕下方,第一张图片超出手机最上方的范围时候拼接到第一张图片下面,下一张图片不断往上运动形成新的第一张图片在手机屏幕中间,两张背景图片就这样不断的进行循环

    在MainActivity.java中添加这一句可以去掉标题

           requestWindowFeature(Window.FEATURE_NO_TITLE);    
     
    (如需转载学习,请标明出处)
  • 相关阅读:
    字符编码
    数据类型
    流程控制之判断,while循环,for循环
    数据类型,与用户交互,格式化输出,基本运算符
    操作系统,编程语言分类,执行python两种方式,变量,内存管理,定义变量的三个特征
    计算机硬件基础-笔记
    20200714_31adb命令和monkey压力稳定性测试
    20200707_28POM
    20200705_27DDT与Yaml数据驱动
    20200702_26UnitTest套件与运行器
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9452487.html
Copyright © 2011-2022 走看看