欢迎来到天天文库
浏览记录
ID:34328370
大小:66.00 KB
页数:12页
时间:2019-03-05
《xna动画的实现4保存动画数据》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、XNA动画的实现4——保存动画数据在上一篇文章中,我们实现了关键帧类实现了复杂的动画,这些复杂动画的数据都是在程序中手动生成的,为了能够重用这些数据,有必要实现下述功能:将动画数据保存为磁盘上的一个文件,使用时只要从磁盘上读取这个文件构成动画数据类,就可以在内存中使用它了。要做到这一点,只需使用.NET框架的文件IO功能将动画数据文件串行化。首先是关键帧数据类Keyframe.cs,代码如下://////关键帧类,表示一个动画片段(AnimationClip)中一个指定时刻的状态(包含位置、旋转、缩放信息),///多个关键
2、帧组成一个动画片段。///publicclassKeyframe{//////位置///publicVector3Position{get;set;}//////旋转///publicVector3Rotation{get;set;}//////缩放///publicVector3Scale{get;set;}//////此关键帧离开动画开始时刻的时间,单位为秒///pu
3、blicdoubleTime{get;set;}//////创建一个关键帧///publicKeyframe(Vector3Position,Vector3Rotation,Vector3Scale,doubleTime){this.Position=Position;12/12this.Rotation=Rotation;this.Scale=Scale;this.Time=Time;}//必须要有一个不带参数的构造函数用于串行化privateKeyframe(){}}这个代码与上一篇文章几乎是一样的
4、,但有三点不同:1.各个属性由原来的只读变成可写,这样做破坏了类的封装性,让用户可以设置属性值,从而导致错误。但是要让这个类可串行化,属性必须可写。2.Time属性由原来的TimeSpan类型变成了double类型。这是因为.NET框架无法串行化TimeSpan类型,导出为空值,所以只能换种类型。下一篇文章的方法可以解决这个问题。3.必须要有一个不带参数的构造函数,否则串行化过程会报错。然后是动画数据类AnimationClip.cs,你需要将数据和方法分离,因此,相对于上一篇文章,这个类删除了方法,只保留了数据,变得简单多了。代码如下:/
5、/////动画片段类,这个类保存一个关键帧集合和动画持续时间。///publicclassAnimationClip{//////动画片段的播放长度///publicdoubleDuration{get;set;}//////关键帧集合///publicListKeyframes{get;set;}//////创建一个动画片段//////6、ames">关键帧集合publicAnimationClip(ListKeyframes){this.Keyframes=Keyframes;//对关键帧根据时间先后进行排序Keyframes.Sort(CompareKeyframeTimes);//动画播放的时间就是最后一个关键帧的Time属性12/12this.Duration=Keyframes[Keyframes.Count-1].Time;}//////创建一个动画片段,数据是从一个xml文件加载的///p7、ublicAnimationClip(stringfileName){//----------------------------//下述代码应该还有改进空间//---------------------------AnimationClipanimationData;//将xml文件反串行化获取动画数据using(XmlReaderreader=XmlReader.Create(fileName)){XmlSerializerserializer=newXmlSerializer(typeof(AnimationClip));animat8、ionData=(AnimationClip)serializer.Deserialize(reader);}this.Keyframes=animationData.Keyfr
6、ames">关键帧集合publicAnimationClip(ListKeyframes){this.Keyframes=Keyframes;//对关键帧根据时间先后进行排序Keyframes.Sort(CompareKeyframeTimes);//动画播放的时间就是最后一个关键帧的Time属性12/12this.Duration=Keyframes[Keyframes.Count-1].Time;}//////创建一个动画片段,数据是从一个xml文件加载的///p
7、ublicAnimationClip(stringfileName){//----------------------------//下述代码应该还有改进空间//---------------------------AnimationClipanimationData;//将xml文件反串行化获取动画数据using(XmlReaderreader=XmlReader.Create(fileName)){XmlSerializerserializer=newXmlSerializer(typeof(AnimationClip));animat
8、ionData=(AnimationClip)serializer.Deserialize(reader);}this.Keyframes=animationData.Keyfr
此文档下载收益归作者所有