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

原创 2011年01月14日 16:34:00

第十章 游戏循环的设计

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

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

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游戏编程(第二版) 第八章 地图的设计和实现

第八章 地图的设计和实现 这本来是第十章,前面计划还有两章的内容,一是跟第四章一样,完成一个Asteroid游戏作为小结,总结一下前面讲过的Sprite的用法,并演示NPC和子弹的处理方法。但是,在...
  • yexing
  • yexing
  • 2011-01-14 16:29
  • 6041

从零开始Android游戏编程(第二版)

没想到重新打开这篇文档已经是一年之后了。去年三月,我停止了这一系列文章的写作。六月,离开了工作了五年的公司。作为公司的创始人和业务主管,我不能容忍它发展的如此缓慢,而合伙人却很享受这种慢节奏的生活。九...
  • yexing
  • yexing
  • 2011-01-14 17:20
  • 7182

从零开始Android游戏编程(第二版) 前言

前言 没想到重新打开这篇文档已经是一年之后了。 去年三月,我停止了这一系列文章的写作。六月,离开了工作了五年的公司。作为公司的创始人和业务主管,我不能容忍它发展的如此缓慢,而合伙人却很享受这种慢节...
  • yexing
  • yexing
  • 2011-01-14 16:07
  • 2306

从零开始Android游戏编程(第二版) 第七章 精灵、帧动画与碰撞检测

第七章 精灵、帧动画与碰撞检测 经过前几章的学习,大家对使用位图、接受用户控制应该已经有了初步的概念,也可以运用这些知识完成简单的小游戏。这一章中,我们会为游戏中最重要的部分——图形处理建立一个基本...
  • yexing
  • yexing
  • 2011-01-14 16:26
  • 9859

从零开始Android游戏编程(第二版) 第六章 SurfaceView动画

第六章 SurfaceView动画 难度:中等 前面介绍的内容,还是比较简单的,应用这些知识,可以完成一些非实时游戏,比如井字棋等,或者一些画面刷新不是很频繁、实时性不强的游戏,比如我们前面做的扫...
  • yexing
  • yexing
  • 2011-01-14 16:22
  • 8225

从零开始Android游戏编程(第二版) 第二章 创建第一个程序Hello Tank

第二章 创建第一个程序Hello Tank 难度:容易 现在开始,我们要真正写作Android程序了。虽然前面安装过程那么复杂,但是写起程序来却是非常简单。而且为了让大家有一个直观的认识,本文不会...
  • yexing
  • yexing
  • 2011-01-14 16:11
  • 7012

从零开始Android游戏编程(第二版) 第四章 响应用户事件

第四章 响应用户事件 上一章介绍了如何显示文字和图片,一般来说,下一步就该讲到动画了。可是我们前面说了,使用View不是最终的选择,要实现动画还需要很多复杂的代码。相对来说,学习如何响应用户事件要简...
  • yexing
  • yexing
  • 2011-01-14 16:14
  • 6656

从零开始Android游戏编程(第二版) 第十一章 演员(Actor)、视口(ViewWindow),演出开始

第十一章 演员(Actor)、视口(ViewWindow),演出开始 本章内容与第七章、第八章关系非常密切,如果对这两章的内容不熟悉请大家先浏览一下七、八章,再回来看本章。 Actor是一个接口,...
  • yexing
  • yexing
  • 2011-01-14 16:47
  • 3968

从零开始Android游戏编程(第二版) 第九章 游戏程序的生命周期

第九章 游戏程序的生命周期 在讲解游戏程序的生命周期之前,让我们先看看普通Android应用的生命周期。关于生命周期,SDK附带的文档上有详细的解释,让我们打开文档,找到andorid.app->A...
  • yexing
  • yexing
  • 2011-01-14 16:30
  • 5223
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)