动画类研究设计
本文将结合所有与动画有关的显示图片,文件资源等,讨论动画类的实现。
动画类划分
按照需求,动画类分为2大部分,动画数据类及动画显示类。动画数据类负责管理动画数据。而动画显示类负责动画的显示工作。这样划分的好处是,动画数据可以共享,同一个工程中只需要装载一次数据,就可以提供给多个显示调用。如扑克类动画,方片A与红桃A都属于扑克,那么我们可以申请2个扑克显示实例,而扑克数据只需要装载一次,只要显示实例设置相应的参数,就会显示不同花色的扑克了。如此这样就算要显示上百张扑克,工程也只会装载一次扑克数据,保证了数据的唯一性,也避免浪费额外的内存空间。
同样的,显示类负责数据的显示,因此,在不同的时候,设置不同的数据,就可以实现不同状态的动画显示。比如,在鼠标移动过来的时候,显示动画A,而鼠标移开显示动画B,可以用同一个显示类,进行不同数据的显示,来实现多态性。
动画数据类
动画的结构构成
我们所讨论的动画构成,主要是针对2D休闲类游戏。经过需求整理,制定结构如下:
动画由层构成,一层即一个显示桢的序列。层间除了具有位置顺序(最下面的层先显示,最上面的层后显示)关系外,其余属性相互独立。
层具有多种属性,下面分别罗列
l 私有数据,通常对层的访问可以通过层的索引号来进行,而利用私有数据可以额外提供一种识别层的方法,以方便外部的操作,主要用于程序中,开发者动态标识层。默认为0。
l 层基本信息,包括
a) 基准点X Y坐标(整数)。动画由多层构成,而每层同一时刻可能会显示不同的图片,为了这些图片能正确地显示在指定位置,因此要设置基准点的坐标。默认为(0,0)
b) 图片绘制方式,为了表现各种图片显示效果,整理出下面这些绘制方法供选择。每种方法的实现效果见图片效果演示软件。
l 0 完全位图拷贝图片(bitblt)
l 1 去掉颜色键的位图拷贝图片
l 2 完全透明位图拷贝图片(alphablend)
l 3 去掉颜色键的透明位图拷贝图片
l 4 alpha+位图拷贝图片
c) 停止动作,停止动作指当任何停止方式来临时,动画停止,如果停止标志为0,此时显示最终停止的效果,否则,该层动画显示结束。如果,所有层的动画都显示结束,则整个动画显示结束。
d) 显示延迟,该层动画的整个显示时间,该参数当该层具有多桢时有效。0代表总是显示,显示时间通过各种属性设置来判断。
e) 开始延迟,动画整体开始显示后,并不一定每层都要马上显示。设置这个属性,可以确保该层在动画整体开始显示后的一段时间之后才开始进行更新显示。
l 层更新方式,更新方式是指在不同时间点,需要更新的显示层的内容。包括
a) 桢更新,不同时间点显示不同桢图片。
b) 渐变更新,当以透明或者alpha+方式绘制图片时,不同时间点,透明度不同可以实现渐隐渐现的效果。
c) 区域更新,对于一个动画序列图片,多幅同样尺寸的图片保存在一张图片上,每一固定时段,显示不同区域,来实现动画的效果。
d) 运动路径更新,通过设置层的运动路径,可以实现一些云彩飘动,小鸟徘徊的效果。
e) 旋转更新,快速的旋转图片也是动画效果的一种要求。
f) 缩放更新,放大缩小图片,以实现动画效果。
l 层停止方式,有多少更新方式就有多少停止方式
a) 桢停止,所有桢图片显示时间结束后停止层的桢更新。
b) 渐变停止,渐变效果时间结束后停止更新渐变参数。
c) 区域停止,当所有区域时间显示结束后停止更新区域索引。
d) 运动路径停止,当所有的路径点都显示结束后停止路径的更新。
e) 旋转停止,旋转角度时间结束后,停止更新角度值。
f) 缩放停止,缩放时间结束后,停止更新缩放因子。
l 渐变信息,当渐变更新时此项参数有效,包括
a) 渐变值的最小透明度(0-250)
b) 渐变值的最大透明度(10-255)
c) 渐变方向(1.渐显 2.渐隐 3.渐显渐隐 >7 不变的透明度值)
d) 渐变更新过程持续时间(>1正整数单位毫秒)
e) 保留值(0)
l 图片区域信息,当区域更新时此项参数有效,包括
a) 单位区域宽度(>0)
b) 单位区域高度(>0)
c) 区域更新方向(正整数),XXX
低位X 0 横向 1 竖向
次低位X 0 顺序 1 逆序
再次低位X 0 非回旋 1 回旋,回旋是指从前往后再往前,或者是从后往前再往后。
d) 区域更新过程持续时间(>1正整数单位毫秒)
e) 保留值(0)
l 运动路径信息,当路径更新时此项参数有效,包括
a) 路径点数(>=2)
b) 路径停留标志(0.在两路径点间的线上显示 1只显示在路径点上)
c) 路径方向(1.路径循环 2.路径回旋)
d) 路径更新过程持续时间(>1正整数单位毫秒)
e) 运动路径点集合<点x坐标,点y坐标,t该点停留时间>
l 图片旋转信息,当旋转更新时此项参数有效,包括
a) 旋转的最小角度(0-355)
b) 旋转的最大角度(5-360)
c) 旋转方向(1.小角度过渡到大角度 2.大角度过渡到小角度 3.小大小 >7 不变的角度值)
d) 旋转更新过程持续时间(>1正整数单位毫秒)
e) 旋转中心点X Y坐标
f) 保留值(0)
l 图片缩放信息,当缩放更新时此项参数有效,包括
a) 缩放时最小横向缩放比例(1-40000),1代表收缩成1%,100代表不缩放,200代表放大2倍,依次类推,下同。
b) 缩放时最大横向缩放比例(1-40000)
c) 缩放时最竖横向缩放比例(1-40000)
d) 缩放时最大竖向缩放比例(1-40000)
e) 缩放方向(1.小尺寸过渡到大尺寸 2.大尺寸过渡到小尺寸 3.小大小 >7 不变的缩放尺寸值)
f) 缩放更新过程持续时间(>1正整数单位毫秒)
g) 缩放中心点X Y坐标
h) 保留值(0)
l 桢信息,层可以由一桢或多桢组成。桢数据组成如下:
a) 图片显示位置X Y坐标(整数)
b) 图片显示时间(正整数)
c) 图片绘制方式(正整数),同层绘制方式,当非0时有效,否则采用层绘制方式。
d) 桢图片,由文件名,文件数据构成,且保持资源的唯一性。
e) 图片显示区域,这一项主要为了兼容以前的结构,目前没有对它的明确需求。
f) 桢私用数据,作用类似层私有数据。
动画数据类操作划分
针对动画的结构构成,主要划分为几种操作,分别罗列如下:
l 完整数据操作
l 整层操作
l 层内属性操作
l 层内桢操作
由于层属性的重要性,又将层属性进行划分为
l 层基本信息操作
l 层更新方式操作
l 层停止方式操作
l 渐变方式操作
l 图片区域方式操作
l 运动路径方式操作
l 图片旋转方式操作
l 图片缩放方式操作
下面分别讨论。
完整数据操作
完整数据操作指对动画整体数据的操作,主要包括
l 创建动画数据。
l 销毁动画数据。
l 从动画文件中装载动画数据。
l 从内存中装载动画数据。
l 保存动画数据到指定内存中。
l 保存动画数据到指定文件。
l 得到动画数据的版本。
l 设置动画更新桢速率。
l 得到动画更新桢速率。
动画数据的版本是将来做扩展用的,方便对不同的动画版本做不同操作。动画更新桢速率,是为了避免频繁计算动画更新而引入的参数。当外部调用更新时,计算调用时间差,如果当前时间与上次更新时间在同一桢内,则不会计算更新。例,如果桢速率为120ms,上一次计算更新在320ms,应该是第3桢,如果本次调用更新在350ms,则与上次计算更新在同一桢,不需要计算。而如果本次调用更新在360ms,就应该计算第4桢的内容了。
整层操作
整层操作指对动画的指定层进行操作,包括
l 创建层。
l 删除层。
l 移动层位置。
l 得到层总数。
l 设置层私有数据。
l 得到层私有数据。
l 通过层私有数据得到层的位置索引号。
层基本信息操作
对层基本信息的操作,包括
l 设置基本信息字符串。
l 设置基准点。
l 得到基准点。
l 设置图片绘制方式。
l 得到图片绘制方式。
l 设置停止动作。
l 得到停止动作。
l 设置开始延迟。
l 得到开始延迟。
设置基本信息字符串,允许使用者可以像手工编写动画文件那样,对基本信息进行设置,只要字符串格式与动画文件格式相同即可。
层更新方式操作
针对层的更新方式操作,包括
l 设置更新方式字符串。
l 设置更新方式。
l 得到更新方式。
更新方式字符串格式同动画文件。设置和得到更新方式时,用通过方式索引号,方式索引序号从1开始,顺序参见动画文件格式。
层停止方式操作
层的停止方式操作,包括
l 设置停止方式字符串。
l 设置停止方式。
l 得到停止方式。
停止方式字符串格式同动画文件。设置和得到停止方式时,用通过方式索引号,方式索引序号从1开始,顺序参见动画文件格式。
渐变方式操作
l 设置渐变参数字符串。
l 设置渐变参数。
l 得到渐变参数。
渐变参数字符串格式同动画文件。设置和得到渐变参数,包括渐变参数的所有变量信息。
图片区域方式操作
l 设置区域参数字符串。
l 设置区域参数。
l 得到区域参数。
区域参数字符串格式同动画文件。设置和得到区域参数,包括区域参数的所有变量信息。
运动路径方式操作
l 设置路径参数字符串。
l 设置路径参数。
l 得到路径参数。
路径参数字符串格式同动画文件。设置和得到路径参数,包括路径参数的所有变量信息。
图片旋转方式操作
l 设置旋转参数字符串。
l 设置旋转参数。
l 得到旋转参数。
旋转参数字符串格式同动画文件。设置和得到旋转参数,包括旋转参数的所有变量信息。
图片缩放方式操作
l 设置缩放参数字符串。
l 设置缩放参数。
l 得到缩放参数。
缩放参数字符串格式同动画文件。设置和得到缩放参数,包括缩放参数的所有变量信息。
层内桢操作
l 添加桢
l 删除桢
l 得到桢总数
l 移动桢位置
l 设置桢参数字符串。
l 设置桢参数。
l 得到桢参数。
l 设置桢私有数据。
l 得到桢私有数据。
l 通过桢私有数据得到桢位置索引号。
桢参数字符串格式同动画文件。设置和得到桢参数,包括桢参数的除私有外所有变量信息。
动画显示类
动画显示原理
动画显示类负责对给定的动画数据进行显示及相关操作。为了方便操作,动画的显示划分为两个过程,动画更新与动画绘制。
l 动画更新,根据给定时间点,计算动画的每一层在这个时间点上的显示内容。并根据显示内容与上一次更新的显示内容进行比较,得到更新区域(脏矩形),添加到更新区域(脏矩形)列表中。
l 动画绘制,按照动画更新的结果---显示内容,进行动画到目标屏幕(位图)的绘制操作。
从上面可以了解,动画更新的结果有两个,层显示内容表及刷新区域表。其中层显示内容表不光要提供给动画绘制调用,而且在作一些显示相关操作时,也要用到,比如,判断点是否落在动画上,也需要层显示内容表。而刷新区域表只是在调用更新时,传递给外面,以通知调用者是否要进行区域的刷新。
动画显示类结构
了解了动画显示原理,我们讨论一下动画显示的结构构成。
l 动画数据,必不可少的成员。
l 层显示内容表,作用上面已经谈过了。
l 动画起始时间,动画的更新时必须的变量。
l 最后一次更新时间,通过桢速率计算桢更新时使用。
l 播放标志,动画播放过程中为真,否则为假。
动画显示操作
经过整理的动画显示操作如下
l 建立动画显示类
l 消耗动画显示类
l 设置动画数据
l 得到动画数据
l 开始显示动画
l 停止显示动画
l 判断动画是否正在显示
l 更新动画
l 绘制动画
l 计算更新区域列表
l 判断点是否落在更新区域内
l 判断点是否落在绘制的动画内容上。