前言
在上篇文章中,我们已经利用SurfaceView游戏框架
实现了随手指点击移动的文字功能。
那么今天这篇文章让我们学习更多关于SurfaceView游戏框架
知识。
今天涉及的知识点有:
- 实际游戏开发会遇到的场景
- SurfaceView实现视图动态场景逻辑
- 主要点的讲解
3.1 游戏进程控制
3.2 定时刷新 - MainActivity视图代码
- 效果图和项目结构图
- 自定义MySurfaceView源码
先来波效果图

一. 实际游戏开发会遇到的场景
在实际游戏开发的过程中,我们会遇到很多动态场景基本不需要人为操作触发,而是它自己"动",如场景中的"小草摆动","流水","倒计时"等。这些元素都不需要和用户交互,故需要采用一个定时刷新机制来实现。
二. 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
,下面贴出MySurfaceView
在Activity
中加载代码:
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));
}
}
五. 效果图和项目结构图


六. 自定义MySurfaceView源码
下面贴出MySurfaceView
源码:
网友评论