XNA 粒子特效
首先简绍Sprite(精灵)。精灵是一个2D图形,在需要绘制的时候始终在屏幕的最前端。Sprite常被用来绘制一些纹理(只有纹理,与3D物体无关的),例如本例中粒子,子弹,2D游戏中的人物等等。
注意:在绘制精灵的时候,我们的坐标系统和GDI一样,以屏幕左上角为原点,X轴向右递增,Y轴向下递增。
建立XNA工程后,系统便帮我们建立了一个SpriteBatch类的对象spriteBatch,我们就是利用这个对象来绘制精灵的。
关于spriteBatch,我们现在只了绘图函数。spriteBatch.Draw()有7个重载函数,具体可以到下面网址了解。http://hi.baidu.com/znacm/blog/item/60be0308d078b0286b60fbaf.html
- SpriteBatch.Draw( Texture2D texture,
- Vector2 vector,
- Color color)
以上是Sprite的简介。下面介绍一下XNA的基本流程。
XNA和一般消息驱动的应用程序不同,表面上并没有消息循环,取而代之的是有2个函数的无限循环Update和Draw。
前者负责处理所有逻辑,检查输入,并更新所以应该更新的东西。后者负责整个区域的绘制。这一个循环就完成了一帧,每一秒完成循环的次数就是游戏的FPS。XNA中FPS是一般固定的(Windows下是60帧,WindowsPhone是30帧),也可以根据需要修改,或者取消FPS限制。
如果在固定的FPS下当2个函数都执行完了却还有空余时间,程序便会等待直到此次循环时间结束。
也许大家对粒子特效没什么感觉,但他确实游戏特效中很重要的一个环节。例如爆炸,下雨,烟雾,子弹(弹幕)等待都是粒子特效。下面是本例中的雪花效果。
一、粒子
- 位置 Vector2 Position
- 大小(规模) float scale
- 速度 Vector2 Velocity
- 加速度 Vector2 Acceleration
- 自转速度 float rotation;
这些都是自然界中粒子所拥有的属性,在程序中我们还需要以下属性
- 生存周期 float lifetime
- 粒子被创建以后所经历的时间 float timeSinceStart
- public void Initialize(Vector2 position, Vector2 velocity, Vector2 acceleration,
- float lifetime, float scale, float rotationSpeed)
- {
- //设置所有的值
- this.Position = position;
- this.Velocity = velocity;
- this.Acceleration = acceleration;
- this.Lifetime = lifetime;
- this.Scale = scale;
- this.RotationSpeed = rotationSpeed;
- //重置TimeSinceStart,因为当我们要重复利用粒子.
- this.TimeSinceStart = 0.0f;
- //设置一个旋转的角度(0-2π)
- this.Rotation = ParticleHelpers.RandomBetween(0, MathHelper.TwoPi);
- }
- 判断是否粒子的活动函数 public bool Active()
- 更新粒子状态函数 void Update(float)
二、粒子系统
三、关于粒子特效的设置: 这里主要介绍通过修改配置文件来完成各种特效。
首先介绍配置文件的组成:
- public class ParticleSystemSettings
- {
- // 设置粒子数目的范围
- // 注意:这里是每一次产生效果的时候所产生粒子的数目
- // 并不是粒子的总数目!!!
- public int MinNumParticles;
- public int MaxNumParticles;
- // 粒子所用纹理效果的文件名(不要写后缀名)
- public string TextureFilename = null;
- // 这2个参数将会控制粒子运动的偏移角度.在XML文件中是用角度表示的,在实际运算中我们会转换成弧度
- public float MinDirectionAngle = 0;
- public float MaxDirectionAngle = 360;
- // 这2个参数将会控制粒子创建时的速度大小
- public float MinInitialSpeed;
- public float MaxInitialSpeed;
- // 设置加速度模式
- public AccelerationMode AccelerationMode = AccelerationMode.None;
- //当用EndVelocity模式的时候,将会利用下面的参数,即末速度.
- //改变这个大小将会影响粒子的生存周期.
- //如果设置为1,粒子将会一直保持原速度
- //如果设置为0,粒子将会在消失前停止.
- public float EndVelocity = 1f;
- //当使用Scale模式时,将会用下面2个参数决定其加速度的大小
- public float MinAccelerationScale = 0;
- public float MaxAccelerationScale = 0;
- // 当用Vector模式的时候,下面2个变量将会决定加速度的矢量值
- public Vector2 MinAccelerationVector = Vector2.Zero;
- public Vector2 MaxAccelerationVector = Vector2.Zero;
- //这个参数控制有多少粒子(百分比)在创建出来的时候就会赋予初速度
- public float EmitterVelocitySensitivity = 0;
- // 这2个参数决定粒子的自转(自旋)速度,同样在XML文件里面是角度,计算的时候会转换成弧度
- public float MinRotationSpeed = 0;
- public float MaxRotationSpeed = 0;
- // 这2个参数决定粒子的生存周期
- public float MinLifetime;
- public float MaxLifetime;
- // 这2个参数决定粒子的大小
- public float MinSize = 1;
- public float MaxSize = 1;
- // 控制重力对粒子的影响,这是一个矢量,我们除了在上面的加速度使用矢量外,也可以
- // 在这里利用重力描述出一个风的效果,例如雪花往左边飘
- public Vector2 Gravity = Vector2.Zero;
- // 这个参数决定粒子的Alpha值(透明度).我们所给定的默认值适合大多数粒子效果
- public Blend SourceBlend = Blend.One;
- public Blend DestinationBlend = Blend.InverseSourceAlpha;
- }
- <?xml version="1.0" encoding="utf-8"?>
- <XnaContent>
- <Asset Type="ParticlesSettings.ParticleSystemSettings">
- <MinNumParticles>5</MinNumParticles>
- <MaxNumParticles>8</MaxNumParticles>
- <TextureFilename>11</TextureFilename>
- <MinDirectionAngle>-90</MinDirectionAngle>
- <MaxDirectionAngle>90</MaxDirectionAngle>
- <MinInitialSpeed>10</MinInitialSpeed>
- <MaxInitialSpeed>50</MaxInitialSpeed>
- <AccelerationMode>None</AccelerationMode>
- <MinRotationSpeed>-45</MinRotationSpeed>
- <MaxRotationSpeed>45</MaxRotationSpeed>
- <MinLifetime>5</MinLifetime>
- <MaxLifetime>10</MaxLifetime>
- <MinSize>0.1</MinSize>
- <MaxSize>.3</MaxSize>
- <Gravity>10 40</Gravity>
- </Asset>
- </XnaContent>