XNA入门教程----(三) 简单的动画

XNA 学习笔记-动画(Animation) 所有动画的原理都是利用的人类的视觉延迟原理,就跟小时候的走马灯一样。XNA的2D动画一样用了这一原理,实现方式也一样就是切片法。切片法就是把动画的所有帧都做到一张图片中去,程序先读入整张图片,然后依次显示一部分,用后一部分覆盖前一部分,这样就达到动画效果了。(如下图)废话不多说。看看关键代码是如何实现的首先创建 Texture2D变量,并将图片读进去Textrue2D texure;texture = Content.Load(@"images/threerings");如果每一帧的像素为75X75,定义3 阅读详情
 

继续我们的XNA之旅...

上周,我们简单的介绍了XNA的相关控制器,并且实现了鼠标和键盘对屏幕内的某个Sprite(精灵)进行简单的位置控制.

但是,美中不足的,我们并没有实现Sprite人物的移动动作,即Animation.

现在,我们继续上周所讲的, 实现简单的动画.

 

关于Animation 

 对动画有所了解的朋友对于逐帧动画一定不会陌生.其以最简单的形式,将各动画元件相邻单位时间的动作位置记录在每个帧里.这样,当我们

一帧帧播放时,由于视觉暂留现象,我们便能看到相对"运动"的动画了.我们通常看到的GIF动画,就是基于这个原理的.

 回来说们的游戏,由于在一般游戏内Sprite的"动作"都是有限可枚举得,我们便同样可以用类似的方案来记录Sprite的所有动作. 

 

我们现在尝试用上面的GIF来实现我们的移动动画.

由于原生的XNA不支持直接从GIF动画中读取各帧图象,即不能直接从Content中Load到GIf动画或其相关帧图像 

虽然从技术上而言,由于有很多开源项目支持如何读取或生成GIF(有兴趣的朋友可以看看这里),我们完全可以通过之自己加载Gif动画的某帧来实现游戏动画。

但这里,我们老老实实的将各帧拆开,得到以下的图像。

 

这样,我们只要通过加载不同的同一图像的不同位置,便可实现人物的”运动“了 。

 

加载动画 

我们回到这个系列的第一篇 

在sprite的Draw时候,我们提供以下重载参数

 

 其中我们就可以通过设置sourceRectangle的值来显示texture2D的一部分了。

 

经过计算,我们得知每个单独人物的尺寸为60X110

这样,我们便用以下方法来动态显示不同“帧”的人物动画了

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->          protected   override   void  Update(GameTime gameTime)
        {
            KeyboardState state 
=  Keyboard.GetState();
            
if  (state.IsKeyDown(Keys.Up))
            {
                
this .Position.Y  -=   10 ;
            }
            
if  (state.IsKeyDown(Keys.Down))
            {
                
this .Position.Y  += 10 ;
            }
            
if  (state.IsKeyDown(Keys.Left))
            {
                
this .Position.X  -=   10 ;
            }
            
if  (state.IsKeyDown(Keys.Right))
            {
                
this .Position.X  +=   10 ;
            }
            MouseState state1 
=  Mouse.GetState();
            
if  (state1.LeftButton  ==  ButtonState.Pressed)
            {
                IPathFinder pathFinder 
=   new  PathFinderFast(m_matrix);
                pathFinder.Formula 
=  HeuristicFormula.Manhattan;
                pathFinder.SearchLimit 
=   2000 ;
                m_path 
=  pathFinder.FindPath( new  Vector2(( int ) this .Position.X, ( int ) this .Position.Y),  new  Vector2(state1.X , state1.Y ));
            }
            
if  ( this .m_path  !=   null   &&   this .m_path.Count()  !=   0 )
            {
                
int  index  =   this .m_path.Count()  -   1 ;
                
this .Position  =   new  Vector2( this .m_path[index].X,  this .m_path[index].Y);
                
this .m_path.RemoveAt(index);
                
return ;
            }
             m_frameIndex  =  m_frameIndex  +   1   >   5   ?   0  : m_frameIndex  +   1 ;
            
base .Update(gameTime);
        }
        
protected   override   void  Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
          
   this .spriteBatch.Draw( this .img,  new  Vector2( this .Position.X,  this .Position.Y),  new  Rectangle(m_frameIndex  *  m_frameSize.X,  0 , m_frameSize.X, m_frameSize.Y), Color.White,  0 , Vector2.Zero, 1f, SpriteEffects.None,  0 );
            spriteBatch.End();
            
base .Draw(gameTime);
        }

 其中,m_frameSize 便是我们每个单独动作的尺寸   Point m_frameSize = new Point(60, 110);

编译后,我们 便能看到“动”的人物了。

 

调节动画的“速度” 

我们很快发现,用这个方法显示的逐帧动画很暴走。即动画帧变化速度太快了。

这其实是由于我们的动画变帧逻辑在Update方法中,而通常,update的调用是基于游戏内置循环的,即根据XNA的默认刷新率---60fps(Frame/Second)。 

如果直接用默认速度的帧循环速度,一则CPU使用率太高,二则也没有这个必要。这里,我们决心“降低”帧数。

我们知道,在XNA中,我们可以通过gameTime.ElapsedGameTime得到自从上次循环结束后到现在的时间。

因此,我们可以将我们的Update方法改成如下结构

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->    protected   override   void  Update(GameTime gameTime)
        {
            timeSinceLastFrame 
+=  gameTime.ElapsedGameTime.Milliseconds;
            
if  (timeSinceLastFrame  >  millisecondsPerFrame)
            {
                timeSinceLastFrame 
-=  millisecondsPerFrame;
                
// TODO
            }
        }

 

 其中,int millisecondsPerFrame = 50;就是我们设定的阀值。

经过以上修改,我们就会发现帧速明显下降,当然,CPU使用率也下去了。 

 

一些细节 

或许大家发现,人物不动时还在原地跑步,只需我们加上类似下文逻辑即可。 

代码
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->   if  (isActive)
                {
                    m_frameIndex 
=  m_frameIndex  +   1   >   5   ?   0  : m_frameIndex  +   1 ;
                }
                
else
                {
                    m_frameIndex 
=   0 ;
                }

 

总结 

本文主要简单介绍了逐帧动画及其在XNA中的实现。并且引入了帧速的控制。相信各位看完本文,便会对XNA的简单2D动画有了一个全面的了解。 

本例源代码

To Be Continue....

转自 http://www.cnblogs.com/edwin1986/archive/2010/01/26/1656659.html
XNA教程(一) 作者:Mike Fleishauer & clayman本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。Blog:http://blog.youkuaiyun.com/soilworkclayman_joe@yahoo.com.cn  special thanks to Mike Fleishauer ^_^ 阅读详情

相关推荐

深入XNA 4.0框架:完整学习指南与源码解析

本文还有配套的精品资源,点击获取 简介:《XNA4.0学习指南随书源码》是一本针对游戏开发者的XNA 4.0框架实践教程。它包含多个章节的示例代码,系统覆盖了从基础图形渲染到高级游戏AI的关键技术和应用。开发者将通过详细的章节编码实践,如图像显示、声音处理、2D/3D图形操作、物理模拟、网络编程等,深入理解XNA 4.0框架,并提升游戏开发技能。本资源适合初学者和有经验的开...

weixin_42160645的博客 2223

XNA入门教程----(二) 移动控制

上一章,我们主要介绍了 何谓XNA 并且做了第一个XNA HelloWorld 本文,将紧接着上文. 继续我们的XNA之旅.   上篇的最后,我们通过 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->MouseS

learneryql的专栏 568

XNA 入门经典教程

XNA Game Studio Express 是专业跨平台整合型游戏开发套件「XNA Studio」的简化版

XNA入门教程(一)

何谓XNA:XNA Framework 是建置于 .NET Framework 2.0上,另外还加入了一些专注于游戏开发上类别库,在指定的平台上使程式码重用达之最大效果。XNA Framework 在一个特别为有管理式游戏运行的通用语言执行层(Common Language Runtime)版本上运行。这个执行层支援Windows XP、Windows Vista和XBox 3...

banshu2416的博客 856

XNA中文教程《XNA入门指南》第一章

国内第一本XNA教程中文《XNA入门指南》,经《A Beginners Guild to XNA》原作者 Mike Fleischauer 书面授权中国XNA开发网翻译!书中如有错误请访问www.ChinaXNA.com 或者 www.XNADev.cn

XNA中文手册 XNA中文手册

XNA中文手册XNA中文手册XNA中文手册XNA中文手册

XNA之简易时钟

首先创建XNA工程,然后编辑Game1.cs文件: using System;using System.Collections.Generic;using System.Linq;using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Audio;using Microsoft.Xna.Framework.Content;using...

weixin_30571465的博客 88

XNA3D游戏开发教程

xna游戏的开发介绍以及编程代码 是学习xna开发的必读之书

[翻译]XNA外文博客文章精选之sixteen(上)

PS:自己翻译的,转载请著明出处 外来侵略者 Nick Gravelyn前言介绍 ...

weixin_30532369的博客 255

wp7 xna开发最强教程

wp7 xna开发最强教程,让你最快的学习xna开发,能够写出一个小的游戏。

别再手动连线了!用Tessent IJTAG的SIB和TDR,5分钟搞定复杂芯片的DFT网络分区

本文探讨了如何利用Tessent IJTAG的SIB(Segment Insertion Bit)和TDR(Test Data Register)技术,高效解决复杂芯片DFT网络分区问题。通过智能化的扫描链管理和声明式定义,显著降低连接复杂度,提升测试覆盖率和良率,适用于超大规模SoC设计。

weixin_29251131的博客 300

XNA4.0学习笔记1:XNA解析及精灵动画

XNA框架及精灵动画          XNA是微软开发的一款用于window,xbox,windows phone等设备上的游戏开发框架,他的特点是方便快捷的开发游戏,提供给我们很多的游戏开发套件,摒弃了传统的游戏引擎多文件多目录的繁琐,使我们用起来容易上手,在wp8 SDK发布之后,目前微软已经表示wp8不再支持用XNA开发游戏,但是会完全兼容XNA游戏,所以XNA游戏还是可以在这些平台上运

K神丶的专栏 3616

阿里云百炼平台创建智能体-上传文档

阿里云百炼智能体-上传文档文件

weixin_43930851的博客 1356

XNA中的骨骼动画

XNA有个定义得很好的素材管道(Content Pipeline),它被分成了不同层次和导入器、处理器、编译器(content writers)和读取器(content readers)。因为XNA的素材管道对骨骼动画并不完成支持,你需要自己扩展素材管道添加对骨骼动画的支持。注意素材管道部分支持骨骼动画,因为它可以导入带有骨骼动画数据的X和FBX文件,但输出时并不处理所有的骨骼动画数据。图11-4

bluerain1987的专栏 1859

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2771

26版SPSS操作教程(高级教程第二十一章)

#专注方能成事 #本期内容:信度分析 #由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次高级教程第二十章的学习笔记,希望能得到一些指正和帮助~

你好! 1709

XNA游戏开发之2D游戏

摘要:以XNA为基础的游戏可以利用3D模型为游戏加入动画效果,也可以利用简单的程序技巧将2维图片显示成动画。虽然2维动画相对3维动画来说简单一些,但是制作出来的游戏其趣味性和挑战性也绝不逊色。今天我们就一块学习一下在使用XNA Framework开发2D游戏时的一些基础知识和注意事项。 主要内容: 1.2D游戏动画的基本原理 2.动画素材的准备 3.一个简单的2D动画 一、2D游戏动画的基本原理 在XNA中制作2D动画的过程很像翻卡通小人书,首先绘制好各种角色造型,然后以固定的时间间隔来显示不同

Kenshin Cui's Blog 7432

34、高效探索柔性蛋白质环构象空间的算法

本文介绍了一种高效探索柔性蛋白质环构象空间的算法,通过种子采样和变形采样两种技术,同时满足运动学闭合和避免空间位阻冲突的约束条件。种子采样能够在闭合无冲突构象空间中广泛生成构象,而变形采样则可以对“有趣”区域进行更密集的探索。实验结果表明,这两种方法在不同大小和受限程度的蛋白质环上均表现出色,运行时间在可接受范围内。相关算法已集成到工具包LoopTK中,可在https://simtk.org/home/looptk获取。

moon9的博客 127

XNA实现骨骼动画 归纳总结

用XNA实现蒙皮动画,基础是官方的程序例子Skinned Model http://create.msdn.com/en-US/education/catalog/sample/skinned_model 简单的中文解说在: http://shiba.hpe.sh.cn/jiaoyanzu/wuli/showArticle.aspx?articleId=673&classId=4 http

wind的笔记本 811

基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。

3万+

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1493

XNA入门教程----(一)

写在前面: 前阵子看到cnblogs上的牛人用silverlight/WPF写游戏,不由心血来潮也尝试写个。 众所周知,虽说从silverlight2开始ms就提供了Isolated Storage的支持,但是,对于游戏这种大玩意儿,1M空间明显是不够的。于是乎,在silverlight中做游戏,别的不说,其资源的调度就严重依赖于服务器及网络了。 其次,WPF,由于其渲染本身基于d...

aa_126621的博客 3290

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

XNA Kick Start (三)

第二章  XNA程序员手中的画笔——GraphicsDevice本文版权归我所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。由于本人水平有限,难免出错,欢迎大家和我交流。作者:claymanBlog:http://blog.youkuaiyun.com/soilworkclayman_joe@yahoo.com.cn        看过艺术家如何绘画吗?无论绘制油画或水彩画,他们总需要一只画

Clayman的专栏 3458

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: XNA入门教程----(二) 移动控制
下一篇: 光栅图像处理器
learneryql
博客等级 码龄16年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值