webabcd - 专注于asp.net, html5, silverlight

ASP.NET
从现在开始 一切都不晚
posts - 290, comments - 7901, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

梦想成真 XNA (4) - 动画

Posted on 2011-07-04 08:12 webabcd 阅读(3456) 评论(22) 编辑 收藏
[源码下载] 


梦想成真 XNA (4) - 动画


作者:webabcd


介绍
XNA: 动画


示例
1、让精灵运动起来的 Demo(按键盘 F 键加载此 Demo)
Component/Sprite/Animation.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 Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace XNA.Component.Sprite
{
    public class Animation : Microsoft.Xna.Framework.DrawableGameComponent
    {
        // 精灵绘制器
        SpriteBatch _spriteBatch;

        // 精灵对象
        Texture2D _sprite;

        // 描述精灵的位置
        Vector2 _spritePosition = Vector2.Zero;

        // 描述精灵的速度:_spriteSpeed.X 为 X 轴方向上每帧移动的像素数,_spriteSpeed.Y 为 Y 轴方向上每帧移动的像素数
        Vector2 _spriteSpeed = new Vector2(3, 10);

        public Animation(Game game)
            : base(game)
        {

        }

        public override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            _spriteBatch = new SpriteBatch(Game.GraphicsDevice);
            _sprite = Game.Content.Load<Texture2D>("Image/Son");
        }

        public override void Update(GameTime gameTime)
        {
            // 根据速度更新精灵的位置
            _spritePosition.X += _spriteSpeed.X;
            _spritePosition.Y += _spriteSpeed.Y;

            // X 轴方向上,如果精灵碰到了左右边界,则 X 轴速度变为相反的方向
            if (_spritePosition.X > Game.Window.ClientBounds.Width - _sprite.Width || _spritePosition.X < 0)
                _spriteSpeed.X *= -1;

            // Y 轴方向上,如果精灵碰到了上下边界,则 Y 轴速度变为相反的方向
            if (_spritePosition.Y > Game.Window.ClientBounds.Height - _sprite.Height || _spritePosition.Y < 0)
                _spriteSpeed.Y *= -1;

            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            Game.GraphicsDevice.Clear(Color.CornflowerBlue);

            // 在指定的位置上绘制精灵
            _spriteBatch.Begin();
            _spriteBatch.Draw(_sprite, _spritePosition, Color.White);
            _spriteBatch.End();

            base.Update(gameTime);
        }
    }
}


2、 通过 Sprite Sheet 实现精灵动画的 Demo(按键盘 G 键加载此 Demo)
Component/Sprite/AnimatingSprite.cs
/*
 * 本例使用的 Sprite Sheet 图详见:XNAContent/SpriteSheet/Smurf.png
 */

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace XNA.Component.Sprite
{
    public class AnimatingSprite : Microsoft.Xna.Framework.DrawableGameComponent
    {
        // 精灵绘制器
        SpriteBatch _spriteBatch;

        // 精灵对象
        Texture2D _sprite;

        // 在 Sprite Sheet 中每个独立图像的尺寸
        Point _frameSize = new Point(128, 128);

        // 当前独立图像在 Sprite Sheet 中的位置
        Point _currentFrame = new Point(0, 0);

        // Sprite Sheet 的行数和列数
        Point _sheetSize = new Point(4, 4);

        // 精灵动画的帧率
        const int SPRITE_FPS = 10;
       
        // 精灵动画中,当前时间距离显示上一帧独立图像所经历的时间,单位:毫秒
        int _elapsedTime = 0;

        public AnimatingSprite(Game game)
            : base(game)
        {
            // Game.TargetElapsedTime 的默认值为 new TimeSpan(0, 0, 0, 0, 16),即近似 60 fps(frames per second)

            // 修改帧率的方法如下,其意味着每 100 毫秒 1 帧,即每秒 10 帧
            // game.TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 100);
        }

        public override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            _spriteBatch = new SpriteBatch(Game.GraphicsDevice);
            _sprite = Game.Content.Load<Texture2D>("SpriteSheet/Smurf");
        }

        public override void Update(GameTime gameTime)
        {
            /*
            * GameTime - 游戏的当前时间对象
            *     GameTime.ElapsedGameTime - 当前距离上一次调用 Update() 方法所经历的时间
            *     GameTime.IsRunningSlowly - 是否跳帧,true 则表示 XNA 不能跟上指定的帧率
            *     GameTime.TotalGameTime - 游戏开始后到此时所经历的总共时间
            */

            _elapsedTime += gameTime.ElapsedGameTime.Milliseconds;
            if (_elapsedTime > 1000 / SPRITE_FPS)
            {
                _elapsedTime -= 1000 / SPRITE_FPS;
                ++_currentFrame.X; 
                if (_currentFrame.X >= _sheetSize.X)
                {
                    _currentFrame.X = 0; 
                    ++_currentFrame.Y;
                    if (_currentFrame.Y <= _sheetSize.Y)
                    {
                        _currentFrame.Y = 0;
                    }
                }
            }

            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            Game.GraphicsDevice.Clear(Color.CornflowerBlue);

            _spriteBatch.Begin();

            _spriteBatch.Draw(
                // 精灵对象
                _sprite,

                // 让精灵的位置在游戏窗口的正中间
                new Vector2((Game.Window.ClientBounds.Width - _frameSize.X) / 2, (Game.Window.ClientBounds.Height - _frameSize.Y) / 2),

                // 显示 Sprite Sheet 中的指定的独立图像
                new Rectangle(
                    _currentFrame.X * _frameSize.X, 
                    _currentFrame.Y * _frameSize.Y,
                    _frameSize.X, 
                    _frameSize.Y
                ), 

                // 不做染色处理
                Color.White
            );

            _spriteBatch.End();

            base.Update(gameTime);
        }
    }
}


OK 
[源码下载]

Feedback

#1楼  回复 引用 查看   

2011-07-04 11:11 by 风海迷沙      
嗯,正在研究3D动画

#2楼  回复 引用 查看   

2011-07-04 11:26 by Ray.Yan      
磊哥加油,Surface是基于xna框架的吗?还真不知道。。。。孤陋寡闻了。

#3楼[楼主]  回复 引用 查看   

2011-07-04 12:46 by webabcd      
@风海迷沙
:)
好好学习,天天向上

#4楼[楼主]  回复 引用 查看   

2011-07-04 12:47 by webabcd      
@Ray.Yan
wpf和xna都可以做surface开发,我们公司的一个surface项目黄了,也就先不研究了,等待机会中。。。

#5楼  回复 引用 查看   

2011-07-06 17:32 by Ray.Yan      
@webabcd
。。。。。。咋黄了,那么你还是在做flash呢。

#6楼  回复 引用 查看   

2011-07-06 18:00 by woiwoqq      
我下了你的源代码,怎么打不开啊,还要装什么

#7楼  回复 引用 查看   

2011-07-06 18:00 by woiwoqq      
我下了你的源代码,怎么打不开啊,还要装什么

#8楼  回复 引用 查看   

2011-07-06 18:00 by woiwoqq      
我下了你的源代码,怎么打不开啊,还要装什么

#9楼[楼主]  回复 引用 查看   

2011-07-07 08:06 by webabcd      
@Ray.Yan
咳,没办法,忽悠的本领还没到家,等有机会继续忽悠
争取拿到surface和kinect的项目

#10楼[楼主]  回复 引用 查看   

2011-07-07 08:06 by webabcd      
@woiwoqq
刷屏吗?
装了Microsoft XNA Game Studio 4.0没有

#11楼  回复 引用 查看   

2011-07-07 11:14 by Ray.Yan      
@webabcd
呵呵 Kinect很有吸引力呢。可惜我赶项目要忙疯了,没时间研究。过年还准备买xbox360+kinect一套回去的,无奈老婆和老妈都反对,看来只能买wp7了。

#12楼[楼主]  回复 引用 查看   

2011-07-07 12:52 by webabcd      
@Ray.Yan
:)
呵呵,同命相连啊,我只是想买个kinect都被老婆反对,wp7手机也别想,你挺幸福的了

#13楼  回复 引用 查看   

2011-07-07 13:35 by 今朝-TODAY      
引用Ray.Yan:
@webabcd
呵呵 Kinect很有吸引力呢。可惜我赶项目要忙疯了,没时间研究。过年还准备买xbox360+kinect一套回去的,无奈老婆和老妈都反对,看来只能买wp7了。

引用webabcd:
@Ray.Yan
:)
呵呵,同命相连啊,我只是想买个kinect都被老婆反对,wp7手机也别想,你挺幸福的了

哎,刚下了120GSSD订单来武装我的小Y,kinect计划又得搁置了。:(

#14楼[楼主]  回复 引用 查看   

2011-07-07 17:08 by webabcd      
@今朝-TODAY
120G的SSD,太奢侈了吧,羡慕,嫉妒

#15楼  回复 引用 查看   

2011-07-07 17:58 by 今朝-TODAY      
引用webabcd:
@今朝-TODAY
120G的SSD,太奢侈了吧,羡慕,嫉妒

哎,本来是一直看80g的。
后来发现120g的这个优惠600rmb,而且是25nm的,看了几次心动了。
本本硬盘是瓶颈啊。

#16楼[楼主]  回复 引用 查看   

2011-07-11 08:39 by webabcd      
@今朝-TODAY
还是奢侈啊,什么时候出个2T的SSD并且降到1K以内我考虑买一块

#17楼  回复 引用 查看   

2011-07-12 10:06 by 今朝-TODAY      
引用webabcd:
@今朝-TODAY
还是奢侈啊,什么时候出个2T的SSD并且降到1K以内我考虑买一块

那得到什么时候哦。另外SSD的提升真的是谁用谁知道。

#18楼[楼主]  回复 引用 查看   

2011-07-12 11:54 by webabcd      
@今朝-TODAY
呵呵,等到我儿子赚钱的时候
现在有点闲钱还是给孩子买奶粉吧,话说奶粉最近又涨价了

#19楼  回复 引用 查看   

2011-07-12 15:17 by 今朝-TODAY      
所以要坚持迟点要小孩。哈哈

#20楼[楼主]  回复 引用 查看   

2011-07-13 07:53 by webabcd      
@今朝-TODAY
:)
我后悔要晚了,早点要的话成本也不会这么高

#21楼  回复 引用 查看   

2011-07-13 09:58 by 今朝-TODAY      
引用webabcd:
@今朝-TODAY
:)
我后悔要晚了,早点要的话成本也不会这么高

迟点好,儿子竞争少。

#22楼[楼主]  回复 引用 查看   

2011-07-13 11:48 by webabcd      
@今朝-TODAY
:)
嗯,顺其自然吧
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2097037 P4xhyQ/Wx4c=