为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

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

2018-09-11 3页 doc 15KB 12阅读

用户头像

is_593420

暂无简介

举报
从零开始Android游戏编程(第二版)第十章 游戏循环的设计第十章 游戏循环的设计 前面的几章中,曾多次提到游戏循环,这一章就让我们一起了解游戏循环的相关概念,学习如何使用游戏循环。 我们知道,游戏的主体通常在一个循环体中,最初,我们用一个变量来表示游戏的状态,比如 gameState = STATE_STARTMENU; 每 次循环都判断当前状态,调用不同的函数进行处理。这种方法简单有效,所有的逻辑代码都在一个类里,不必考虑隐藏和划分,只需要定义一些函数即可。但是它的 优点也是它的缺点,这种结构化的方法通常让程序显得很大,有些混乱。所以我们采用另一种方式管理游戏循环,将场景(Scen...
从零开始Android游戏编程(第二版)第十章 游戏循环的设计
第十章 游戏循环的设计 前面的几章中,曾多次提到游戏循环,这一章就让我们一起了解游戏循环的相关概念,学习如何使用游戏循环。 我们知道,游戏的主体通常在一个循环体中,最初,我们用一个变量来示游戏的状态,比如 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)。请保持场景之间传递的是数值而不是实例,是设定给演员的指令而不是演员本身。
/
本文档为【从零开始Android游戏编程(第二版)第十章 游戏循环的设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索