zoukankan      html  css  js  c++  java
  • 游戏框架SurfaceView的简单运用

    SurfaceView运用

         android.view.SurfaceView是游戏开发中常用的框架,他继承android.view.View,与View相比,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。因此开发游戏而言,如果属于要求主动更新界面的就用SurfaceView(例如赛车类,需要一个独立线程去更新界面,防止主线程阻塞),属于被动更新(棋类游戏)可以用View框架(调用invalidate方法更新)。

        上面粗糙的介绍了SurfaceView和View。下面来个简单的例子说明SurfaceView。

         创建一个MySurfaceView.java

    public class MySurfaceView extends SurfaceView implements Callback, Runnable { // 打开程序后,创建一个矩形,并让矩形随着时间而移动
    
        int x = 0, y = 0, w = 40, h = 40, SrceenW, SrceenH; // 定义矩形的x,y坐标,宽高,以及手机的屏幕宽高
        SurfaceHolder surfaceHolder;
        Thread thread; // 定义一个线程,用来更新矩形所在的位置
        int sleepTime = 100;// 让线程100毫秒更新一次界面
        Paint paint; // 画笔
        boolean flag = false;// 线程是否启动
    
        public MySurfaceView(Context context, int SrceenW, int SrceenH) {
            super(context);
            surfaceHolder = getHolder();
            surfaceHolder.addCallback(this);
            this.SrceenH = SrceenH;
            this.SrceenW = SrceenW;
            paint = new Paint();
            thread = new Thread(this);
        }
    
        /**
         * 
         */
        public void draw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
            paint.setColor(Color.RED);
            canvas.drawRect(x, y, x + w, y + h, paint);
        }
        
        /**
         * 逻辑
         */
        public void logic() {
            if(x<=0){
                x=0;
            }
            if(y<=0){
                y=0;
            }
            if(x>=SrceenW-w){
                x=SrceenW-w;
            }
            if(y>=SrceenH-h){
                y=SrceenH-h;
            }
        }
        
        @Override
        public void surfaceCreated(SurfaceHolder holder) { // 启动线程绘制
            // TODO Auto-generated method stub
            flag = true;
            if (!thread.isAlive()) {
                thread.start();
            }
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) { // 结束线程绘制
            // TODO Auto-generated method stub
            flag = false;
            thread = null;
        }
    
        @Override
        public void run() { // 绘制的更新过程
            // TODO Auto-generated method stub
            Canvas canvas = null;
            while (flag) {
                try {
                    canvas = surfaceHolder.lockCanvas(); //锁定画布开始绘制
                    synchronized (canvas) {
                        logic();
                        draw(canvas);
                    }
                } catch (Exception e) {
                    Log.e("mysurfaceview",e.getMessage());
                }finally{
                    if(canvas!=null){
                        surfaceHolder.unlockCanvasAndPost(canvas);//解锁画布结束绘制
                    }
                }
                x++;  //x,y坐标改变
                y++;
                try {
                    Thread.sleep(sleepTime); //阻塞线程
                } catch (Exception e) {
                    Log.e("mysurfaceview",e.getMessage());
                }
            }
        }

    Activity中调用

    public class SurfaceActivty extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            // 获取屏幕宽高
            Display display = getWindowManager().getDefaultDisplay();
            setContentView(new MySurfaceView(this,display.getWidth(),display.getHeight()));
        }
    }
  • 相关阅读:
    201706120024 编译原理第一次作业
    P2014 选课 题解(树形DP)
    基础算法·二分答案
    P4285 [SHOI2008]汉诺塔 题解 (乱搞)
    2018.12-2019.1 TO-DO LIST
    记录一枚蒟蒻的成长(持续更新)
    P3796 【模板】AC自动机(加强版) 题解(Aho-Corasick Automation)
    BuaacodingT651 我知道你不知道圣诞节做什么 题解(逻辑)
    P2766 最长不下降子序列问题 题解(网络流)
    P2516 [HAOI2010]最长公共子序列 题解(LCS)
  • 原文地址:https://www.cnblogs.com/cindyOne/p/2994524.html
Copyright © 2011-2022 走看看