如何让画面动起来?

都知道动画的原理,想想看跑马灯,在任意时刻把跑马灯按停,面对眼睛的那附图,它叫做帧(Frame)。

帧,就是一串儿连贯动画里的单个截面

玩儿游戏的人知道,要达到基本流畅的水准,30fps(frame per second)就够了,达到毫无察觉的流畅,可能要到60fps,那么,界面以30~60次每秒的频率重绘,画面不就动起来了?

在本篇文章里,将解释常见的基础概念生命周期到底是怎么回事。

要写一个游戏框架啦,首先,还是对游戏进行建模,从两个方面进行,一个是游戏的实体结构,一个是游戏的运行流程(也就是生命周期)。

1、结构分析

市面上很多游戏,在切换场景的时候,都会进入一个loading界面,参考这个现象可以推论出,游戏是由一个个场景构成。

(loading界面用于加载资源,无论是启动游戏时候一次性loading,还是过程中异步loading又或者切换场景时候loading,都属于加载策略,这里暂不讨论。)

有了场景了,就要考虑游戏背景,背景有可能是一份image,也有可能是复杂的动态生成的地形。

除此之外,还有游戏角色,物品等对象。先就这几个来做个简单的建模:

想想上一章说过的内容,Scene可以视为复合控件,BgPainter执行Scene的背景绘制,Role和Item都是单一控件。

当调用Scene的绘制方法时,会首先触发BgPainter的绘制,然后迭代所有的Role和Item,进行绘制。一次绘制方法的调用,视为一帧

2、流程分析

一个场景从加载到结束的过程,称之为场景的生命周期。

我把该生命周期划分为以下几个步骤:

其中,加载、启动、停止、销毁,在整个生命周期中,只会执行一次。而继续态会多次出现(可以考虑是根据帧率来不断提出继续请求),主动发起暂停请求的时候,才会进入暂停态。

图是画出来了,代码怎么写呢?

一般来说,实现生命周期管理,可以使用状态机模式

参见如下伪码:

 1 define Scene{
 2     //空白状态
 3     status=NONE;
 4     //时钟频率
 5     frequence=150;
 6
 7     /**
 8     *接收请求并修改状态和频率
 9     */
10     void performRequest(Request req){
11         status=req.status;
12         frequence=req.frequence;
13
14         if(isRunning){
15             //停止循环调用
16             stopInterval();
17         }
18         //启动循环调用,执行方式是根据frequence间隔来调用refresh方法
19         startInterval();
20 }
21
22
23 /**
24 *刷新
25 */
26 void refresh(){
27     //根据请求类型来决定执行
28     switch(status){
29     case LOADING:
30     if(loaded)
31         status=START;
32     else if(!loading)
33         onLoading();
34     break;
35     case START:
36         if(started)
37         status=RESUME;
38         else if(!starting)
39         onStart();
40         break;
41     case RESUME:
42         resume();
43         break;
44     case PAUSE:
45         if(!paused)
46         pause();
47         break;
48     case STOP:
49         if(!stopped&&!stopping)
50         stop();
51         break;
52     case DESTROY:
53         if(stopped&&!destroyed)
54         destroy();
55         break;
56     }
57 }
58 void loading(){
59 loading=true;
60 //加载loading页,加载完成后回调
61 loading=false,loaded=true;
62 }
63 void resume(){
64 //绘制地图
65 //绘制所有角色
66 //绘制所有物品
67 }
68 }                                                    

这段状态机实现保证了几点:

1、loading、start、stop三个状态,无论出现多少次,都只会执行对应函数一次。

2、loading、start对应函数执行完成之后,会修改当前场景的状态,进入下一个步骤。

3、resume、pause状态,可以随时切换

启动方式如下所示

scene.performRequest({status=LOADING,freqence=150});

如果希望暂停,自然也可以使用

scene.performRequest({status=PAUSE,freqence=150});

一个结构简单的动画框架就这样完成了。下一章来讲解一个数据分析框架,可以用于各种不同类型的数据格式之间的互相转化,比如Json<->java实例,xml<->java实例,或者xml<->Json

转载于:https://www.cnblogs.com/anrainie/p/5614461.html

基础知识漫谈(3) 组合基础知识,设计游戏框架相关推荐

  1. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之项目管理概述、项目管理基本基础知识、项目立项管理相关知识

    DayDayUp:计算机技术与软件专业技术资格证书之<系统集成项目管理工程师>课程讲解之项目管理概述.项目管理基本基础知识.项目立项管理相关知识 目录 一.项目管理概述 1.1.项目的定义 ...

  2. SWEBOK软件工程知识体系 - 13.计算基础

    计算基础(COMPUTING FOUNDATIONS) 计算基础知识领域(KA)的范围包括软件演化和执行的开发和操作环境.因为任何软件都不可能在真空中存在,也不可能在没有计算机的情况下运行,所以这种环 ...

  3. 实验一计算机基础和网络知识,有关于计算机基础心得体会

    有关于计算机基础心得体会 在平日里,心中难免会有一些新的想法,可以将其记录在心得体会中,这样就可以总结出具体的经验和想法.但是心得体会有什么要求呢?以下是小编整理的有关于计算机基础心得体会,欢迎大家分 ...

  4. 小白入门!网络安全基础知识详解(附知识问答)

    小白入门!网络安全基础知识详解(附知识问答) 一.引论 提到网络安全,一般人们将它看作是信息安全的一个分支,信息安全是更加广义的一个概念:防止对知识.事实.数据或能力非授权使用.误用.篡改或拒绝使用所 ...

  5. 学习python需要什么基础-自学python需要什么基础,要掌握哪些知识?

    Python语言的应用非常广泛.我们一定要掌握一些基础知识的储备,如果缺少一些基础知识的储备,那么我们在学习Python语言的过程中将会会感觉到非常难,比如,在学习Python语言的过程中我们需要具备 ...

  6. 学python需要什么文化基础-数据分析需要掌握那些基础知识?

    在这个信息对称的时代,数据分析师的工作将为领导决策提供重要的价值,在企业的地位备受重视.因此,这个职业也吸引了越来越多的人,那么想成为一名数据分析师,以下这些基础的知识是必须要掌握的. />北京 ...

  7. 计算机基础知识应用文档,计算机基础知识与应用

    计算机基础知识与应用Tag内容描述: 1.计算机应用基础知识计算机应用基础知识点计算机应用基础知识话题计算机应用基础知识计算机基础知识电子商务单击第一章计算机基础知识1.1946年2月15日世界上第一 ...

  8. 一些解密必备知识(2)- 基础篇03|解密系列

    一些解密必备知识(2)- 基础篇03 让编程改变世界 Change the world by program   软件安全是信息安全领域的重要内容,本系列视频教程将涉及到软件相关的加密.解密.逆向分析 ...

  9. 计算机基础知识教案1,计算机基础知识教案一

    计算机基础知识教案一 秦皇岛外国语职业学院教案首页 年 月 日 学科 计算机基础 年级 专一 课题 计算机基础知识 教具 课时分配 2课时 教学目的 1. 了解计算机的发展.特点和应用 2. 掌握计算 ...

最新文章

  1. window下java开发环境安装
  2. Bean 在 Spring 中代表什么含义,为什么这样命名?
  3. 4位快速加法器和4位串行加法器相比_使用混合信号示波器调试串行总线系统
  4. php开发入门,PHP开发入门教程之面向对象
  5. stack overflow--技术问答网站
  6. RabbitMQ事务和Confirm发送方消息确认——深入解读
  7. 求一早间新闻~20170717
  8. chrome inspect 远程调测:Chrome on Android之一 普通调试
  9. 木材材积表快速计算器_木材材积表快速计算器
  10. 软件概要设计说明书—模板
  11. 吾生有涯 而知也无涯
  12. 详细理解JS的三座大山
  13. 考虑单用户计算机上的下列I O操作,操作系统概论自考2016年10月真题
  14. 浏览器开发者模式下你不可错过的Network面板知识
  15. linux HID驱动分析
  16. UNCTF2022-公开赛|Crypto
  17. 【渗透测试】你应该了解的大部分工具![本文仅供了解]
  18. 5 坐标变换与视觉测量
  19. spark-测试模式-在windows中连接虚拟机中cdh集群的hdfs和hive和linux单机模式
  20. javascript编码转换,javascript跳转代码

热门文章

  1. Android中使用running services查看service进程内存
  2. LruCache缓存处理及异步加载图片类的封装
  3. 【转】Asp.net控件开发学习笔记整理篇 - Asp.net客户端状态管理
  4. eclipse中统计代码行数
  5. 在单块磁盘上安装2000和XP操作系统
  6. Verilog语言中如何将memory型变量转换为普通变量
  7. 推荐陈永真著作《高效率开关电源设计与制作》
  8. Linux版本之redhat9---gFtp中文乱码解决方案
  9. SSM+maven实现答题管理系统(二)
  10. 带你开发类似 Pokemon Go 的 AR 游戏