基础知识漫谈(3) 组合基础知识,设计游戏框架 如何让画面动起来?

举报
轻狂书生FS 发表于 2020/12/01 00:49:51 2020/12/01
【摘要】 如何让画面动起来? 都知道动画的原理,想想看跑马灯,在任意时刻把跑马灯按停,面对眼睛的那附图,它叫做帧(Frame)。 帧,就是一串儿连贯动画里的单个截面。 玩儿游戏的人知道,要达到基本流畅的水准,30fps(frame per second)就够了,达到毫无察觉的流畅,可能要到60fps,那么,界面以30~60次每秒的频率重绘,画面不就动起来了?   在...

如何让画面动起来?

都知道动画的原理,想想看跑马灯,在任意时刻把跑马灯按停,面对眼睛的那附图,它叫做帧(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

 

特此声明:因此文章个人认为总结的很到位,很有价值,特此转载!转载地址:http://www.cnblogs.com/anrainie/p/5614461.html

文章来源: blog.csdn.net,作者:LookForDream_,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/LookForDream_/article/details/83536868

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。