第十章 游戏循环的设计

前面的几章中,曾多次提到游戏循环,这一章就让我们一起了解游戏循环的相关概念,学习如何使用游戏循环。

我们知道,游戏的主体通常在一个循环体中,最初,我们用一个变量来表示游戏的状态,比如

gameState = STATE_STARTMENU;

每次循环都判断当前状态,调用不同的函数进行处理。这种方法简单有效,所有的逻辑代码都在一个类里,不必考虑隐藏和划分,只需要定义一些函数即可。但是它的优点也是它的缺点,这种结构化的方法通常让程序显得很大,有些混乱。所以我们采用另一种方式管理游戏循环,将场景(Scene)的概念引入程序中。

我们可以认为一个游戏由一些独立的场景组成,如开始菜单,游戏中画面,过关画面等等都可以是场景,而整个游戏就在这些场景之间不断切换,直到退出为止。场景这个词用在这里非常贴切,所有游戏的元素,不论是选项菜单还是玩家角色,都像是舞台上的演员(Actor),他们根据不同的场景登上舞台或离开舞台。有了场景的支持,演员们不再挤在一起,而是被划分成一组一组的,彼此隔离,这样会让程序变得清晰有序,而游戏循环就变成了场景循环。

我们首先创建一个SceneBase类,作为所有Scene的基类:

public abstract class SceneBase {

abstract public void tick();

abstract public void update(Canvas c);

}

其中tick为一个动画帧,让所有演员做出动作。update将演员们显示在舞台上。

然后,我们在GameView建立一个SceneBase类型的变量来表示当前的场景,只有当前的场景才会被绘制。

static SceneBase currentScene;

……

if(c != null) {

currentScene.tick();

currentScene.update(c);

}

最后通过一个函数改变当前场景,这就实现了最基本场景转换。

public static void setCurrentScene(SceneBase scene) {

currentScene = scene;

}

为了测试这种方案,我们创建两个场景类SceneStartMenu和SceneMain分别表示开始菜单和游戏主循环,通过点击屏幕在这两个场景之间切换。

我们首先在GameView中定义这两个场景

static SceneStartMenu sceneStartMenu = null;

static SceneMain sceneMain = null;

在GameView的构造函数中初始化sceneStartMenu,将它作为初始场景

if(sceneStartMenu == null)

sceneStartMenu = new SceneStartMenu();

setCurrentScene(sceneStartMenu);

然后我们在GameView中重载onTouchEvent(也要为SceneBase增加一个响应的函数)

@Override

public boolean onTouchEvent(MotionEvent event) {

// TODO Auto-generated method stub

return currentScene.onTouchEvent(event);

}

在SceneStartMenu中

public boolean onTouchEvent(MotionEvent event) {

// TODO Auto-generated method stub

switch(event.getAction()) {

case MotionEvent.ACTION_DOWN:

if(GameView.sceneMain == null)

GameView.sceneMain = new SceneMain();

GameView.setCurrentScene(GameView.sceneMain);

break;

}

return true;

}

SceneMain与之相反即可

然后我们修改两个scene的update函数

public void update(Canvas c) {

// TODO Auto-generated method stub

c.drawARGB(255, 0, 0, 0);

c.drawText("SceneStartMenu", GameView.width/2, GameView.height/2, paint);

}

这样就能知道当前的Scene是哪一个了

现在让我们运行一下这个程序,点击屏幕,可以看到两个场景之间切换的效果。到此为止,本章的内容就讲完了,很短是吧,但是很有用,有了这个结构,加上前一章的生命周期控制,你的程序会变得更整洁有序。当然,在具体应用中,你必须扩充scene的内容,比如场景之间的交互,你可能需要一个或几个setter或者Map结构(模仿Activity)。请保持场景之间传递的是数值而不是实例,是设定给演员的指令而不是演员本身。

本章示例程序 http://u.115.com/file/f1cf493609

从零开始Android游戏编程(第二版) 第十章 游戏循环的设计相关推荐

  1. 石头剪刀布python编程_《python核心编程第二版》练习题——游戏:石头剪刀布

    习题里比较有意思的一个题目,实现石头剪刀布这个游戏,起初设计的时候走弯路了(主要时被习题里那个"尽量少用if判断"给整晕了),想的太复杂,后来发现其实非常简单,完全可以不写if语句 ...

  2. Unity游戏优化[第二版]学习记录6

    以下内容是根据Unity 2020.1.01f版本进行编写的 Unity游戏优化[第二版]学习记录6 第6章 动态图形 一.管线渲染 1.GPU前端 2.GPU后端 3.光照和阴影 4.多线程渲染 5 ...

  3. 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

    目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高 ...

  4. python核心编程第二版pdf_Python Book电子书pdf版合集 Python核心高级编程第二版

    1小时学会Python.doc 51CTO下载-[Python系列].BeginningPythonFromNovicetoProfessionalSecondEdition.pdf 8.Python ...

  5. python核心教程第二版答案_python核心编程第二版第4章习题答案.docx

    python核心编程第二版第4章习题答案.docx 4-1.Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下. 答案: 所有的 Python 对象都拥有三个特性:身 ...

  6. Unity游戏优化[第二版]学习记录4

    Unity游戏优化[第二版]学习记录4 第4章 着手处理艺术资源 一.音频 1.导入音频文件 2.加载音频文件 3.编码格式与品质级别 4. 音频性能增强 二.纹理文件 1.纹理压缩格式 2.纹理性能 ...

  7. 开始利用CSDN做学习笔记,从windows 游戏编程大师技巧和3D游戏编程大师开始

    利用两个月的空余时间将windows 游戏编程大师技巧和3D游戏编程大师技巧看了一遍. 第一遍读的并不深入,代码也没有仔细研究.特别是3D下册,基本只是草草浏览了一遍而已.这一遍是为了对整体有个印象和 ...

  8. easyx游戏编程:魔塔(C++游戏开发)

    easyx游戏编程:魔塔(C++游戏开发) 魔塔: 本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接: https://easyx.cn/downloads/. 下方有源码. ...

  9. 使用python开发网页游戏_四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程...

    原标题:四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程 前言 学习编程虽然对有些人来说是件乐事,但是对大多数人来说仍然是一件比较枯燥困难的事情.当然,面临这样困惑的人,并不是只有你一个 ...

  10. html5游戏开发 网页版-捕鱼达人游戏源码下载

    html5游戏开发 网页版-捕鱼达人游戏源码下载 来玩一把! 转载于:https://www.cnblogs.com/jsfoot/p/3215371.html

最新文章

  1. 题解 P4692 【[Ynoi2016]谁的梦】
  2. ubuntu 突然不能 sudo成功,报错su: Authentication failure
  3. 作业帮、猿题库们烧了千亿争市场,家长陷入选择焦虑
  4. 深度学习作业(一)手写字体
  5. 今天的凉爽的学习环境 录音软件
  6. 【Vue.js源码解析 二】-- 虚拟 DOM
  7. Windows Message ID 常量列表
  8. Halcon缺陷检测——测量拟合
  9. 【SHOI2009】【BZOJ2028】会场预约(线段树染色)
  10. python之os.listdir
  11. 微软商店 错误代码0x80073CF9
  12. fiddler抓包记录
  13. 广州科二化龙考场_广州考驾照[科目二]化龙考场.考试详解
  14. 功能强大的安卓刷机软件-刷机精灵提供下载
  15. oCPC和oCPM的本质区别是什么?
  16. Linux TF卡ext4文件系统录制视频文件用拷贝不用移动的影响
  17. 2021-05-24 Nyquist图背后的信息
  18. 2023电工杯数学建模A题思路模型代码
  19. CSP拼图问题--矩阵快速幂
  20. 【报错】InternalExceptionException got error code in reply:34

热门文章

  1. eclipse tomcat找不到或无法加载
  2. React-leaflet在ant-design pro中的基本使用
  3. 图片点击后出现模态框效果的实现
  4. ElastcSearch的Mapping映射建立
  5. Ubuntu环境下NFS服务器搭建
  6. VS2010+OpenCV2.4.6永久性配置方法
  7. [原创]微软笔试经验总结
  8. 电影播放器mplayer设置常用选项
  9. 【转载】来自架构师的建议
  10. nvidia-smi介绍