美文网首页
游编(3)—SurfaceView游戏框架<下>

游编(3)—SurfaceView游戏框架<下>

作者: 奔跑的佩恩 | 来源:发表于2020-08-24 10:33 被阅读0次

前言

在上篇文章中,我们已经利用SurfaceView游戏框架实现了随手指点击移动的文字功能。
那么今天这篇文章让我们学习更多关于SurfaceView游戏框架知识。

今天涉及的知识点有:

  1. 实际游戏开发会遇到的场景
  2. SurfaceView实现视图动态场景逻辑
  3. 主要点的讲解
    3.1 游戏进程控制
    3.2 定时刷新
  4. MainActivity视图代码
  5. 效果图和项目结构图
  6. 自定义MySurfaceView源码

先来波效果图


效果图.gif

一. 实际游戏开发会遇到的场景

在实际游戏开发的过程中,我们会遇到很多动态场景基本不需要人为操作触发,而是它自己"动",如场景中的"小草摆动","流水","倒计时"等。这些元素都不需要和用户交互,故需要采用一个定时刷新机制来实现。

二. SurfaceView实现视图动态场景逻辑

大体逻辑是:

  • 为了不影响主界面的流畅度,我们需要开启一个线程去执行重绘界面,游戏逻辑等功能
  • 为了不频繁刷新界面,我们需要在线程中设置一个sleep,以达到"定时"重绘的效果
  • 为了控制游戏周期,我们需要设置一个游戏标记,然后再结合SurfaceView生命周期来执行和销毁游戏线程

三.主要点的讲解

根据上面的实现逻辑分析。

3.1 游戏进程控制

整体布局上,我们会设置一个游戏开始和结束的boolean值flag,然后结合SurfaceView周期控制游戏的开始和结束,主要代码如下:

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        //设置运行标志位true
        flag=true;
        //其他逻辑暂时省略
        //......
        
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //SurfaceView改变的监听

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //SurfaceView销毁,设置标志位为false
        flag=false;
    }

这里与SurfaceView生命周期结合,是为了处理游戏在按下返回键,home键及退出键时对于游戏进程的控制。

3.2 定时刷新

一般游戏界面刷新的频率为50-100毫秒,根据各个游戏的特点,我们会在50-100毫秒间选一个值作为游戏界面刷新时间间隔。
以下贴出时间刷新间隔的实现逻辑:

        while (flag){
            long start=System.currentTimeMillis();
            //绘制逻辑
            myDraw();
            //执行游戏逻辑
            gameLogic();
            long end=System.currentTimeMillis();

            try {
                if(end-start<REFRESH_TIME){
                    Thread.sleep(REFRESH_TIME-(end-start));
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

据以上逻辑,我们可以看到,开始循环时,记录一次时间,等界面绘制结束和游戏逻辑执行完毕后,又记录一次时间,若这个时间间隔比REFRESH_TIME小,则线程进入沉睡,当时间大于等于REFRESH_TIME时,再次执行刷新界面和更新游戏逻辑的代码。

四. MainActivity视图代码

据以上逻辑及分析,最后我写了一个自定义SurfaceView类,即MySurfaceView,下面贴出MySurfaceViewActivity中加载代码:

public class TempActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        setContentView(new MySurfaceView(TempActivity.this));

    }

}

五. 效果图和项目结构图

效果图.gif
项目结构图.png

六. 自定义MySurfaceView源码

下面贴出MySurfaceView源码:

相关文章

网友评论

      本文标题:游编(3)—SurfaceView游戏框架<下>

      本文链接:https://www.haomeiwen.com/subject/xuitdktx.html