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

XNA4.0 RPG游戏开发:从入门到实战 游戏开发框架是构建电子游戏的基础架构,XNA作为微软推出的轻量级框架,通过托管代码和内容管道简化了2D/3D游戏开发流程。其核心原理基于.NET平台,提供图形渲染、输入处理和音频管理等模块化组件。在RPG游戏开发领域,XNA特别适合实现角色系统、地图渲染和对话管理等典型功能,通过Texture Atlas优化和对象池技术可有效提升性能。本教程以实际工程实践为例,详解如何使用XNA4.0开发完整RPG项目,包含角色属性设计、Tile-based地图实现等热频技术点,并分享跨平台移植到MonoGame的解决方案 阅读详情

 

                                                         XNA框架及精灵动画

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

 

         学习要求:XNA游戏开发主要是采用C#语言,但是要求不是很高,只需要我们掌握基础的语法 加上一定的利用API开发的经验就可以开始学习了!本博文系列的教材是《XNA4.0入门指南》,算是总结性质的吧,结合教材看效果更佳!

 

        我的系统环境是windows 8,开发IDE用的是windows phone7.1 SDK,该开发包里面已经集成了XNA4.0的开发套件,也集成了简易的开发环境VS2010 express for windows phone!所以没有必要再VS2010的基础上安装7.1SDK,对于开发环境的搭建网上已有很多教程,在这里我就不累述了.这里附上windows phone 7.1SDK的官方下载地址   windows phone 7.1 SDK   接下来开始我们的XNA游戏开发之旅:

 

  1:第一个XNA程序

 工程创建:新建项目—XNA game studio 4.0—windows游戏 完成之后工作区如图所示

在这几个目录中,我们暂时只需要关注两个目录,一个是Programs.cs和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 Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WindowsGame5
{
    /// <summary>
    /// 这是游戏的主类型
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// 允许游戏在开始运行之前执行其所需的任何初始化。
        /// 游戏能够在此时查询任何所需服务并加载任何非图形
        /// 相关的内容。调用 base.Initialize 将枚举所有组件
        /// 并对其进行初始化。 
        /// </summary>
        protected override void Initialize()
        {
            // TODO: 在此处添加初始化逻辑

            base.Initialize();
        }

        /// <summary>
        /// 对于每个游戏会调用一次 LoadContent,
        /// 用于加载所有内容。
        /// </summary>
        protected override void LoadContent()
        {
            // 创建新的 SpriteBatch,可将其用于绘制纹理。
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: 在此处使用 this.Content 加载游戏内容
        }

        /// <summary>
        /// 对于每个游戏会调用一次 UnloadContent,
        /// 用于取消加载所有内容。
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: 在此处取消加载任何非 ContentManager 内容
        }

        /// <summary>
        /// 允许游戏运行逻辑,例如更新全部内容、
        /// 检查冲突、收集输入信息以及播放音频。
        /// </summary>
        /// <param name="gameTime">提供计时值的快照。</param>
        protected override void Update(GameTime gameTime)
        {
            // 允许游戏退出
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();          
            // TODO: 在此处添加更新逻辑

            base.Update(gameTime);
        }

        /// <summary>
        /// 当游戏该进行自我绘制时调用此项。
        /// </summary>
        /// <param name="gameTime">提供计时值的快照。</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: 在此处添加绘图代码

            base.Draw(gameTime);
        }
    }
}

在这段代码中您会注意到自动提供了几个类成员变量,还有Game1的构造方法和其它五个 方法。其中第 1 个类成员变量是GraphicsDeviceManager类的对象。这是一个非常重要的 对象,它为开发者提供了一种访问 PC、Xbox 360 或者 Windows Phone 7 上的图形设备的途径。 GraphicsDeviceManager的GraphicDevice属性代表了机器上实际的图形设备。图形设 备对象在 XNA 游戏和显卡(或更准确的说,显卡上的 GPU10)之间起中介作用,XNA 游戏在屏 幕上做的任何事情都要通过这个对象来执行!

第 2 个类成员变量是SpriteBatch类的实例,这是一个您将用来绘制精灵(Sprite)的核 心对象。

Initialize 方法被用来初始化变量和其它与 Game1 对象相关的对象。

LoadContent 方法在 Initialize 方法之后被调用,另外在任何需要重新载入游戏图形 内容的时候也会被调用, LoadContent 方法中,将会载入游戏所需要的一切图形及其它内容,包括图像、模型和音效等。当然UnLoadContent方法就是用来清理一些资源的!

当 LoadContent 方法调用完成后,Game1 对象将进入游戏循环。。在 XNA 中,游戏循环只包含两个方法:Update 方法和 Draw 方法。目前您可以这样理解游戏循 环:所有影响游戏的逻辑都将在 Update 方法或 Draw 方法中完成。其中drew用来绘制图形 update用来更新图形!

以下便是XNA程序执行的顺序:

 

我们先运行一下该项目看看什么效果:

我们可以看到屏幕就是一个窗口,什么都没有,而且屏幕背景颜色的蓝色的,顾名思义,这个蓝色肯定跟我们的draw方法脱不了干系,我们回过头看看draw的代码,发现这样一句:

GraphicsDevice.Clear(Color.CornflowerBlue);

他表示利用了当前的图形设备对象的一个成员函数clear,并且在参数中使用了蓝色,如果在这里把蓝色改成黑色,背景就自然的变成黑色了

 2:在项目中添加一个精灵

在这里可以自己找一张图片,在解决方案资源管理器中的WindowsGameContent中新建一个文件夹Images,然后在我们创建的文件夹里面添加一张图片,XNA支持的格式多样,常见的都可以,在Images目录下会有一个图片文件,但是没有扩展名,这是XNA默认的去掉扩展名 作为该图片的ID,下面就可以添加到代码中了:

1:在 Game1.cs 代码文件中的 GraphicDevice Manager 和 SpriteBatch 的变量声明下面添加一个 Texture2D 变量: Texture2D texture;

其中Texture2D是一个存储2D文件的对象

2:就像之前说的那样,所有图像、声音和其它内容资源的加载都在 LoadContent 方法中完 成。添加以下代码到 LoadContent 方法中: 

texture = Content.Load<Texture2D>(@"Images/logo");

这里也可以这样写,效果是一样的:

texture = Content.Load<Texture2D>("Images//logo"); 就是指初始化texture变量!接下来就可以直接使用texture变量表示这张图片了!

3:XNA 中所有的绘制工作都要在 Draw 方法中完成,因此请添加以下三行代码到 Draw 方法中,位于 Clear 方法的调用之后:

spriteBatch.Begin();
spriteBatch.Draw(texture, Vector2.Zero, Color.White);
spriteBatch.End();

相信有过win32 SDK编程经验的都熟悉这种写法,在win32 SDK编程中对于WM_PAINT消息响应都是一个begin 一个end 之间写出需要响应的窗口重绘代码,这里的spriteBatch

是在您创建项目的时候被声明,然后在 LoadContent 方法中被 初始化。 这里发生的事情就是 XNA 用 SpriteBatch 对象的 Begin 和 End 方法通知图形 设备将要发送一个精灵(或 2D 图像),这个可以死记!

第二行的Draw方法中第一个是需要绘制的2D对象,第二个是绘制的位置,这里Vector2是一个2D矢量类,zero是她的一个成员,默认为0,也就在左上角(0,0),第三个参数表示是否需要用颜色覆盖2D对象,这里的White表示不覆盖!

 

好了,运行一下程序:

在这里我把clear的颜色变为了黑色,然后用PS把图片编辑为透明背景的,所以出现这个结果!运行就看到了XNA的logo,挺漂亮的!

 

居中问题:

如果需要把图片居中,我们只需要改变draw第二个参数,该参数表示显示位置,指的是图片的左上角顶点的位置,这里需要利用两个新的成员,

 spriteBatch.Draw(

texture,
                new Vector2(Window.ClientBounds.Width/2 - texture.Width/2,
                    Window.ClientBounds.Height/2 - texture.Height/2),
                Color.White

);

这里把第二个参数改为了自定义的坐标,其中windows.ClientBounds表示屏幕窗口的尺寸类,利用它的width和height就可以得到屏幕的长和宽,Texture2D对象内部本身也有标示2D对象的长和宽,利用这些成员,我们就可以把图片显示在屏幕中间!

 

3:关于精灵的一些属性变换(旋转,多张重叠,透明度,缩放)

上面在draw函数中利用了spriteBatch的成员函数draw的一个相对简单的版本,实际上他有很多重载版本,下面我们看看他的另一个版本:

 

Texture Texture2D                                           要绘制的纹理.

Position Vector2                                               绘制图像的左上角坐标.

SourceRectangle Rectangle                            允许您绘制原始图像的一部分,这里使用 null.

 Color Color                                                     染色颜色. Rotation float   旋转图像,现在使用 0.

Origin Vector2                                                 指定旋转的参照点.现在使用 Vector2.Zero.

 Scale float                                                      缩放比例,使用 1 代表按照原始尺寸绘制,1.5f 表示放大图像到 150%.

 Effects SpriteEffects                                      使用 SpriteEffects 枚举来垂直或水平翻转图 像.

LayerDepth float                                             允许您指定图像的层叠次序(哪张图像在其它图 像之上).现在使用 0. 。0 相当于 Z 次序的前面,1 表示 Z 次序的后面。

 

可以看到他们的参数是很多的,对于透明度我们都是用PS来加工,所以一般不使用,缩放扩大也很简单,我主要说一下多张图片在一起重叠的时候是什么个情况!

按照同样的方法再多加一张图片到我们的项目,并用texture1来存储,经过LoadContent函数之后,draw函数里面的代码如下所示:

protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin(SpriteSortMode.BackToFront,BlendState.AlphaBlend); 
            spriteBatch.Draw(texture,
                new Vector2(Window.ClientBounds.Width / 2 - texture.Width / 2,
                    Window.ClientBounds.Height / 2 - texture.Height / 2),
                null,
                Color.White,
                0,
                Vector2.Zero,
                1.5f,
                SpriteEffects.None,
                0);

           
            spriteBatch.Draw(texture1,
                new Vector2(Window.ClientBounds.Width / 2 - texture1.Width / 2,
                    Window.ClientBounds.Height / 2 - texture1.Height / 2),
                null,
                Color.White,
                0,
                Vector2.Zero,
                1f,
                SpriteEffects.None,
                1);
            spriteBatch.End();

            // TODO: 在此处添加绘图代码

            base.Draw(gameTime);
        }
    }
}


我们把透明背景的那张扩大为1.5倍,这样方便看出效果,把最后一个参数设置为0和1,一张在前面,一张被覆盖在后面,这里我们透明在前,不透明在后,运行结果:

可以看到运行结果并不是我们想的那样,为什么会这样勒?结果是先绘制的被后绘制的覆盖,显然不合我们的程序,经过查看Z次序详细说明,我们知道了要使用Z次序排列图片的重合问题,需要在begin函数中说明需要使用Z次序!

修改程序代码begin:

spriteBatch.Begin( SpriteSortMode.FrontToBack, BlendSate.AlphaBlend);

这里的第一个参数表示Z次序的状态,另一个参数在使用透明图片的时候这样来设置,

再次编译运行:

结果运行就符合我们最初的想法了!(注:由于篇幅有限,这里很多东西参考MSDN)

 

4:开始简单的移动精灵

前面我们介绍过游戏画面的移动都是在循环里执行的,这里的循环不需要我们自己写,因为她提供给了我们draw和update函数,draw函数参数里面传递了一个gameTime参数,他实际表示帧率,即每一秒重绘多少次,系统默认的是60次,也就是说1秒钟内调用了60次draw函数,每次调用draw函数之后又会调用update函数,一共调用了120次函数来不停的刷新游戏画面,所以我们只需要在update里面加入移动的代码,精灵就会移动起来!

 

为了移动精灵,我们需要再加入两个Vector2变量来指示当前位置,并用两个float变量表示每一帧的移动速度,整体代码如下(其实也只有初始化,draw和update函数有一定的变化)

namespace WindowsGame4
{
    /// <summary>
    /// 这是游戏的主类型
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture;
        Texture2D texture1;
        Vector2 pos1 = Vector2.Zero;      //表示图片的初始位置
        Vector2 pos2 = Vector2.Zero;

        float speed1 = 2f;               //表示图片每一帧的移动速度
        float speed2 = 3f;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        
        protected override void Initialize()
        {
            // TODO: 在此处添加初始化逻辑

            base.Initialize();
        }

        
        protected override void LoadContent()
        {
            // 创建新的 SpriteBatch,可将其用于绘制纹理。
            spriteBatch = new SpriteBatch(GraphicsDevice);
            texture = Content.Load<Texture2D>("image//logo_trans");
            texture1 = Content.Load<Texture2D>("image//logo"); 
            // TODO: 在此处使用 this.Content 加载游戏内容
        }

        
        protected override void UnloadContent()
        {
            // TODO: 在此处取消加载任何非 ContentManager 内容
        }

       
        protected override void Update(GameTime gameTime)
        {
            // 允许游戏退出
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            pos1.X += speed1;
            if(pos1.X == Window.ClientBounds.Width-texture.Width || pos1.X < 0)
            {
                speed1 *= -1; 
            }

            pos2.Y += speed2;
            if (pos2.Y == Window.ClientBounds.Height - texture1.Height || pos2.Y < 0)
                speed2 *= -1;
            // TODO: 在此处添加更新逻辑

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin(SpriteSortMode.BackToFront,BlendState.AlphaBlend); 
            spriteBatch.Draw(texture,
                pos1,
                null,
                Color.White,
                0,
                Vector2.Zero,
                1f,
                SpriteEffects.None,
                0);

           
            spriteBatch.Draw(texture1,
                pos2,
                null,
                Color.White,
                0,
                Vector2.Zero,
                1f,
                SpriteEffects.None,
                1);
            spriteBatch.End();

            // TODO: 在此处添加绘图代码

            base.Draw(gameTime);
        }
    }
}


那么我们运行就可以看到图片在上下移动:

这里没什么复杂的东西,只是多了绘制更新的代码而已    如果需要图片更加复杂的运动,原理也是一样,只是多了复杂的数学运算!!

 

5:简单的动画效果

  也许大家都知道,动画的形成也只是不停的绘制精灵,使他们形成连续播放的效果,在这里我们插入这样一张图片:


可以看到这张图片的每个小位图,连在一起是不是很像动画了,我们现在要做的就是分别把他们显示出来,在这里我们新建一个项目,采取同样的方法加载进这张图片,并用texture变量保存!(同上,不在演示了)

我们在上面的程序中都是讲整张图片显示出来,在这里我们又需要用draw函数的一个参数了,上面已经给出了参数列表,其中有一个我们一直用null,表示全部显示出来,这里我们就需要用到它了!

为了编写这个算法,我们还需要知道这些:

• 精灵位图中每个单独图像(或称为帧)的宽和高(frameSize)。  

• 精灵位图的行与列的总数(sheetSize)。 

 • 指示接下来精灵位图中将要绘制的精灵帧在精灵位图中所处的行与列的位置的索引 (currentFrame)。

在我们这里,每个位图的长和宽都是75像素,有8行6列,接下里我们用一个矩形来代替上面的null,但是一个矩形需要知道它的左顶点以及长和宽,为此我们定义如下变量:

Point frameSize = new Point(75, 75);
Point currentFrame = new Point(0, 0);
Point sheetSize = new Point(6, 8);

之所以利用点集,是因为我们这里只是需要成对的存储元素,所以point足够了!

下面请看全部函数的代码:

namespace WindowsGame6
{
    /// <summary>
    /// 这是游戏的主类型
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture;
        Point frameSize = new Point(75, 75);              //表示每个位图的长和宽
        Point currentFrame = new Point(0, 0);             //表示当前该轮到哪个位图绘制
        Point sheetSize = new Point(6, 8);                //指示了最大的长和宽 

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            // TODO: 在此处添加初始化逻辑

            base.Initialize();
        }

        protected override void LoadContent()
        {
            // 创建新的 SpriteBatch,可将其用于绘制纹理。
            spriteBatch = new SpriteBatch(GraphicsDevice);
            texture = Content.Load<Texture2D>("Images//threerings");             //加载位图资源
            // TODO: 在此处使用 this.Content 加载游戏内容
        }

        protected override void UnloadContent()
        {
            // TODO: 在此处取消加载任何非 ContentManager 内容
        }

        protected override void Update(GameTime gameTime)
        {
            // 允许游戏退出
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            ++currentFrame.X;                             //这里执行更新 看不清楚可以一步一步分析
            if (currentFrame.X >= sheetSize.X)
            {
                currentFrame.X = 0;
                ++currentFrame.Y;
                if (currentFrame.Y >= sheetSize.Y)
                    currentFrame.Y = 0;
            }
            // TODO: 在此处添加更新逻辑

            base.Update(gameTime);
        }

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

            spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);
            spriteBatch.Draw(
                texture,Vector2.Zero,
                new Rectangle(currentFrame.X * frameSize.X,   //这里新创一个矩形
                currentFrame.Y * frameSize.Y,
                frameSize.X, frameSize.Y),
                Color.White,
                0,
                Vector2.Zero,
                1,
                SpriteEffects.None,
                0);
            spriteBatch.End();

            // TODO: 在此处添加绘图代码

            base.Draw(gameTime);
        }
    }
}

运行就可以看到三个圈在转动:


这样我们的简单动画就完成了!





 

 

 

 

 

 

 


 



 

 

 

 

 

 

 


 

 

 

 

XNA4.0 RPG游戏开发入门与核心技术解析 游戏开发框架是构建电子游戏的基础工具集,XNA作为微软推出的经典框架,采用组件化设计理念和高效的Content Pipeline资源管线。其核心原理基于游戏循环(Update/Draw)模型,通过SpriteBatch实现高性能2D渲染,特别适合开发角色扮演游戏(RPG)。在工程实践层面,开发者需要掌握角色系统、瓦片地图、回合制战斗等RPG核心模块的实现方法,同时优化资源加载与内存管理。本教程以XNA4.0为例,详解如何构建完整的RPG游戏框架,包含角色属性管理、任务系统设计等实用开发技巧,即使面对已停止维 阅读详情

相关推荐

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

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

weixin_42160645的博客 2223

微软公布“XNA Studio”开发工具

   。       XNA是一个整合了PC/XBOX/手机游戏开发的未来整合型游戏开发环境,将以最完整的游戏开发函数库、技术、套装中介软件工具、金流付费、安全、网络等不同领域的关键核心,提供游戏开发人员一个最全面、最有效率的整体性游戏开发工具,将让游戏开发人员能最有效率的投入游戏开发工作。而在今年的GDC会议上微软甚至公布了“XNA”工具的进化版本“XNA Studio”,把整个游戏开发环境更加

csdn_gamedev的专栏 2058

XNA4.0 游戏开发框架中文教程及源码

XNA 4.0游戏开发框架是微软推出的一款用于简化游戏开发的中间件,它为游戏开发者提供了一套全面的工具和服务。作为一个专为Windows、Xbox 360以及Windows Phone平台设计的游戏开发环境,XNA 4.0为游戏的图形渲染、音频播放、用户输入处理、网络通信以及内容管理提供了丰富的API支持。本章将首先对XNA 4.0框架的设计理念、架构特点进行简要介绍,然后展开讨论其主要组件以及它们在游戏开发中的应用。

weixin_42097508的博客 980

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

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

learneryql的专栏 568

XNA游戏开发SDK安装包

XNA游戏开发SDK安装包,安装后在Visual Studio中可以做XNA游戏项目

使用Eggjs做服务端获取微信小程序云开发数据库的access_token

最近自己想写了一个微信小程序,恰巧里面有个云开发,恰巧里面有个数据库,那懒人的我,就直接用云开发里面的数据库了,做测试或者正式也好,对于刚开始来说,免费的配额是够用的。 后来想到在小程序云开发上面的数据怎么看才方便?刚好微信小程序有一个服务端API,那就方便很多了,那就直接敲个服务端来获取云开发上数据库的数据出来到自己的后台上面,那以后管理起来也方便很多。 看了一下服务端api之后,发现有三个重要...

kalenE992的博客 1705

XNA入门教程(一)

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

banshu2416的博客 856

Nano Banana 2哪里使用?Nano Banana 2提示词合集和使用教程

收集最强的Nano Banana 2提示词合集,以及Nano Banana 2哪里使用的教程,并且有10个免费使用渠道。

qq_42927225的博客 1987

在Visual Studio 2012中使用XNA 4.0

XNA 4.0默认是将项目模板安装到VS2010中的,并不能够自动安装到VS2012,所以需要一些操作来让VS2012中也可以使用XNA 4.0模板。 1、下载XNA 4.0 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=27599 2、安装好VS2012和XNA 4.0 (这步就不说什么了。。) 3、复制XNA...

weixin_34239592的博客 225

单点DToF激光测距传感器各家产品的比较

汇总DToF 单点测距传感器的相关信息

Linux 设备驱动概述及开发环境构建 (一) 1773

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 876

XNA4.0学习笔记2:控制精灵和碰撞检测

精灵的控制和碰撞检测         上一节我们了解了精灵的绘制,移动以及动画的实现,并且在最后我们实现了三个环的简单动画,今天我们学习下如何通过设备控制精灵,这一节的内容比较简单,很好理解,在这里我先把控制精灵的全部代码贴上来,方便接下来的学习! using System; using System.Collections.Generic; using System.Linq;

K神丶的专栏 6626

Arduino粉尘传感器DIY:打造智能PM2.5监测仪

本文详细介绍了如何利用Arduino和粉尘传感器DIY一个智能PM2.5监测仪。从硬件选购、接线步骤到代码编写,提供了完整的制作指南,帮助读者以低成本打造透明可靠的空气质量监测设备,并探讨了数据解读与智能升级方案。

i3j4k5的博客 390

Silverlight.XNA(C#)跨平台3D游戏研发手记:(九)3D 骨骼动画

Silverlight 5和Windows Phone 7.1都已具备SL.XNA模式,这意味着我们可以在相关平台上制作高性能的3D游戏及软件产品而无需二次编码。本节,我将借助一些工具的为大家讲解SL.XNA的3D实现原理,并演示如何加载并解析一个功能齐全带贴图和骨骼动画的角色模型。从今天开始,通向3D之大门正全方位为您开启!关于传统3D游戏的原理并不是本文的重点,不再赘述。我们更迫切的需要了解X

6606

MAX31865三线PT100测温实战:配置、接线与代码全解析

本文详细解析MAX31865三线PT100测温的配置、接线与代码实现。通过实战经验分享,介绍如何利用MAX31865芯片实现高精度温度测量,重点讲解三线制接法的自动误差补偿功能,并提供完整的寄存器配置、SPI通信和温度转换算法,帮助开发者快速解决工业测温中的常见问题。

ss78901的博客 757

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

XNA那些事二 舞动的精灵(上)

介绍了XNA当中精灵的相关知识!

Python爱好者的专栏 5873

【信息科学与工程学】【物理/化学科学和工程技术】第八篇 光学07

对于光源-探测器距离 ρ, 稳态漫反射率 R(ρ) ≈ (1/(4π)) [ z₀ (μ_eff + 1/r₁) exp(-μ_eff r₁)/r₁² + (z₀ + 2z_b) (μ_eff + 1/r₂) exp(-μ_eff r₂)/r₂² ], 其中 μ_eff = √(3μ_a(μ_a+μ_s’)), z₀=1/μ_s’, z_b 与边界条件有关。通过测量光纤各点的布里渊频移 ν_B(z) 来得到应变/温度分布:Δν_B(z) = C_ν,ε Δε(z) + C_ν,T ΔT(z)。

weixin_49199313的博客 327

Learning XNA 4.0 1-3章 答案

问答与练习参考答案 第1章:XNA 4.0有哪些新特性? 问答答案   1. 在XNA 4.0中对XNA文件夹结构进行了什么重大改变?  解决方案中的Content节点,之前是您的游戏项目的子文件夹,而现在它在解决方案中拥有自己的项目。它使您可以轻松的通过多平台项目共享内容。   2. XNA 4.0支持什么游戏平台?  XNA 4.0支持在Windows、Xbox 360与Wi...

weixin_30471065的博客 153

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CCSprite 精灵动画

本文转自 http://www.th7.cn/Program/Android/201211/111119.shtml 记得以前学习XNA游戏开发的时候,操作精灵角色的攻击或者行走动作都是给出特定的几张序列图或者一张长序列图然后通过切割来作一帧一帧的切片动画播放。  开始  关于精灵sprite我从网上摘录了一段话如下 说白一点,精灵就是将图形资源加载到内存中,并根据游戏需要将其

dongw1023的专栏 966

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何在WP7上用XNA写2D游戏(五)

第 4 章XNA里的2D动画 4.1 播放游戏精灵动画 第二章里我们提到了如何把2D的纹理用SpriteBatch显示。对于游戏而言,一个精灵(sprite,在游戏编程里指一个对象的原型,比如一个战士,一个怪物)不可能不做动作,就拿简单的走动来说,手脚一定会是要动的,那么如...

a736893007的博客 172

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Windows Phone开发如何播放游戏精灵动画?

《Windows Phone开发实战体验(应用+游戏)》详细介绍及源代码下载: http://www.devdiv.com/%E3%80%8AWindows_Phone%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E4%BD%93%E9%AA%8C_%E5%BA%94%E7%94%A8_%E6%B8%B8%E6%88%8F_%E3%80%8B%E5%BC%80%E5%

wjxiaolv的专栏 810

从零开发游戏需要学习的c#模块,第二十一章(精灵动画 —— 让角色走起来)

今天我们要学习的内容是理解精灵图集的原理加载精灵图集并切帧实现四方向行走动画静止时显示待机帧。

m0_74775605的博客 516

XNA开发2D游戏中关于精灵图片的写法

此为原创,转载请注明作者和出处,谢谢! 以上图片正是我们要将它变成动态的图片,Sprite sheets本文译作精灵图,表示包含若干精灵的一张大图。您使用的SpriteBatch.Draw重载版本有一个参数(第三个)允许您指定一个源矩形,使原图只有这部分被绘制。到目前为止您都是为该参数指定null值来告诉XNA绘制整幅图像,编写这样的一个算法: 精灵图中每个单独图像(或称为帧)的宽和高(f...

weixin_30608503的博客 127
上一篇: 贪心算法详解
下一篇: 递归算法详解
lloil
博客等级 码龄14年 382粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值