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);    
     
    (如需转载学习,请标明出处)
  • 相关阅读:
    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details
    Visual Studio断点调试, 无法监视变量, 提示无法计算表达式
    ASP.NET MVC中MaxLength特性设置无效
    项目从.NET 4.5迁移到.NET 4.0遇到的问题
    发布网站时应该把debug设置false
    什么时候用var关键字
    扩展方法略好于帮助方法
    在基类构造器中调用虚方法需谨慎
    ASP.NET MVC中商品模块小样
    ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9452487.html
Copyright © 2011-2022 走看看