粒子系统Particle示例

本示例介绍了粒子系统的原理,展示了如何SpriteBatch使用粒子效果,包含两个粒子效果:爆炸和烟雾。

原文地址:http://creators.xna.com/en-US/sample/particle。

示例概览

粒子系统(Particle systems)通常用来绘制流体,在游戏中通常用于烟雾、火焰、火花和水花。例如,在Spacewar 游戏中的爆炸效果就是一个粒子系统。

粒子系统是由一定数量的小粒子构成的。每个粒子都有自己的物理性质,通常包含位置、速度和加速度。更复杂的粒子包含更多的物理属性。粒子的创建和初始化是由粒子系统决定的,但一旦开始了一个粒子效果,粒子的行为就是独立的了。粒子通常用2D alpha混合的sprites进行绘制。大量的独立更新的粒子一个在另一个之上被绘制,粒子系统就表现出一种混沌或自然的外观。

这个示例的粒子系统以Spacewar游戏的粒子系统为基础。但是,它还介绍了如何进行预先设置以避免垃圾回收。而且,本示例的粒子系统从DrawableGameComponent继承,而不是像Spacewar游戏中那样从SceneItem继承,这样我们可以很容易地将粒子系统插入到游戏中去。

最小Shader配置

Vertex Shader Model 1.1

Pixel Shader Model 1.1

示例控制

本示例使用以下键盘和手柄控制

动作 键盘控制 手柄控制
切换粒子特效 空格键 A
退出 ESC或ALT+F4 BACK

工作原理

ParticleSampleGame类是示例的主类。它展示了两种粒子特效:爆炸和上升的烟雾。爆炸特效使用了两个独立的粒子系统:一个系统绘制火焰,一个系统绘制烟雾。要使用这些特效,ParticleSampleGame创建了三个粒子系统:ExplosionParticleSystem, ExplosionSmokeParticleSystem和SmokePlumeParticleSystem。ParticleSampleGame类有一个state对应现在显示的特效,并拥有一个计时器用于处理何时开始一个新特效。

本示例中最关键的类是ParticleSystem,它是一个抽象类,包含粒子系统的核心功能。调用ParticleSystem的AddParticles方法可以添加一个新的粒子效果。AddParticles使用几个常数初始化粒子。这些常数都应该被子类设置,让每个粒子系统都有不同的表现。子类可以重写ParticleSystem 中的虚拟方法,这样就能更加灵活地控制粒子的创建。

要注意的一个关键点是所有粒子都是在程序开始时分配的,然后就可以根据需要重用,在运行时无需重新实例化。这样可以避免在运行期间的垃圾回收。但是,这会带来一个问题:有可能在调用AddParticles方法时,所有粒子仍在使用中。在这种情况中,AddParticles会添加尽量多的粒子,然后停止添加,这会导致一个期望的特效可能不会被显示。解决方法是在ParticleSystem构造函数中添加一个参数,这个整数类型的参数指定需要的最大特效数量,这样使用粒子系统的开发者就可以指定特效的最小数量获取最好的效果。

源代码ParticleSample.rar下载(注释已翻译成简体中文)。

文件下载(已下载 1237 次)

发布时间:2010/6/12 下午1:25:56  阅读次数:9994

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号