游戏粒子系统?什么是粒子系统?第一次听说这个东西,我再想这个东西是不是像化学原子分子那样的系统引擎。经过多年疑惑以及unity3d粒子系统使用,我才恍然明白原来这东西才是粒子系统。初中时候,化学老师告诉我们大千世界千物万物都是由分子原子组成,同样许多自然现象也是由很多微小的颗粒组成,它们都有很多相似的行为。如,烟花炮火,瀑布,喷泉,雪花飘飘,山崩地裂。游戏中的粒子系统是用来模拟这种自然现象,给人一种震感的动画效果。(原创:醉翁 )
顾名思义,粒子系统,他是多个部分组成的复杂系统。以unity3d游戏为例, 由粒子发射器,粒子渲染器,粒子动画器,粒子尾带器等组成,其中运用了美学,物理学动力等。我们先学粒子名专有名词:Particle粒子,ParticlesSystem粒子系统,emitter发射器。其原理就是再整个粒子系统生命周期中emitter发射器不断发射粒子,由粒子系统再生命周期每一帧不断使用物理力学地改变粒子的颜色、大小、角度达到一种变换无穷魅力效果。本文将以网页游戏粒子系统简单讲解粒子系统,我这里先看看烟花粒子效果,由于我的笔记本性能不好,运行效果并截图没有那么亮丽:
看看开源粒子系统源码:下载其开源源码这里http://github.com/flashhawk/Simple-Physics-Particle
粒子系统源码:请重点看看红色部分源码
public class ParticlesSystem extends EventDispatcher
{
private var _particlePool : ParticlePool;
private var _particles : Array = [];
private var l : int;
private var _renderBefore:Function;
private var _renderAfter:Function;
public static var STAGE:Stage;
public function ParticlesSystem(renderAfter:Function=null,renderBefore:Function=null)
{
_particlePool = new ParticlePool();
this._renderBefore=renderBefore;
this._renderAfter=renderAfter;
}
{
_particlePool = new ParticlePool();
this._renderBefore=renderBefore;
this._renderAfter=renderAfter;
}
public function createParticle(particleType : Class) : Particle
{
var p : Particle = _particlePool.get(particleType);
p.addEventListener(ParticleEvent.DEAD, removeDeadParticle, false, -1);
_particles.push(p);
return p;
}
//在这里就是粒子系统核心,在粒子系统生命周期不断调用粒子的update函数
来改变粒子
{
var p : Particle = _particlePool.get(particleType);
p.addEventListener(ParticleEvent.DEAD, removeDeadParticle, false, -1);
_particles.push(p);
return p;
}
//在这里就是粒子系统核心,在粒子系统生命周期不断调用粒子的update函数
来改变粒子
private function singleRender(event : Event) : void
{
if(_renderBefore!=null)_renderBefore();
l = _particles.length;
//_particles[l]是粒子发射器发射出来的粒子
while (l-- > 0) _particles[l].update();
if(_renderAfter!=null)_renderAfter();
}
{
if(_renderBefore!=null)_renderBefore();
l = _particles.length;
//_particles[l]是粒子发射器发射出来的粒子
while (l-- > 0) _particles[l].update();
if(_renderAfter!=null)_renderAfter();
}
//开始启动粒子系统:
public function startRendering() : void
{
STAGE.addEventListener(Event.ENTER_FRAME, singleRender);
}
............................
}
我们在看看粒子代码:
public class Particle extends EventDispatcher
{
public var position : Vector2D = new Vector2D();
public var point : Point = new Point();
//粒子开始速度,也就是说粒子往哪里运动
public var velocity : Vector2D = new Vector2D();
//加速度
public var acceleration : Vector2D = new Vector2D();
//粒子摩擦力,物理老师告诉我们摩擦力用来刹车用的
public var friction : Vector2D = new Vector2D(0.1, 0.1) ;
//粒子生命,每一阵减一
private var _life : Number;
private var _forces : Object = {};
//力综合:可能由重力Gravity、吸引力Attraction、旋转角力,排斥力Repulsion,布朗运动力SimpleBrownian
private var _sumForce : Vector2D = new Vector2D();
碰撞矩形边界,除了这个范围粒子生命周期就结束
public var boundary : Rectangle = null;
碰到边界时候的反弹强度系数,默认是2
public var bounceIntensity : Number = 2;
...........................
public function startRendering() : void
{
STAGE.addEventListener(Event.ENTER_FRAME, singleRender);
}
............................
}
我们在看看粒子代码:
public class Particle extends EventDispatcher
{
public var position : Vector2D = new Vector2D();
public var point : Point = new Point();
//粒子开始速度,也就是说粒子往哪里运动
public var velocity : Vector2D = new Vector2D();
//加速度
public var acceleration : Vector2D = new Vector2D();
//粒子摩擦力,物理老师告诉我们摩擦力用来刹车用的
public var friction : Vector2D = new Vector2D(0.1, 0.1) ;
//粒子生命,每一阵减一
private var _life : Number;
private var _forces : Object = {};
//力综合:可能由重力Gravity、吸引力Attraction、旋转角力,排斥力Repulsion,布朗运动力SimpleBrownian
private var _sumForce : Vector2D = new Vector2D();
碰撞矩形边界,除了这个范围粒子生命周期就结束
public var boundary : Rectangle = null;
碰到边界时候的反弹强度系数,默认是2
public var bounceIntensity : Number = 2;
...........................
}
如何实现烟花爆炸:
ParticlesSystem.STAGE=stage;
//设置粒子系统每帧回调函数,也就是这里不断改变粒子形状颜色位置等
ps=new ParticlesSystem(loop);
initCanvas();
private function loop() : void
{
canvasBmd.clear();
//找出所有粒子
l = ps.particles.length;
如何实现烟花爆炸:
ParticlesSystem.STAGE=stage;
//设置粒子系统每帧回调函数,也就是这里不断改变粒子形状颜色位置等
ps=new ParticlesSystem(loop);
initCanvas();
private function loop() : void
{
canvasBmd.clear();
//找出所有粒子
l = ps.particles.length;
while (l-- > 0)
{
var p:Particle=ps.particles[l];
if (ps.particles[l].extra.isFire)
{
//改变粒子位置大小以及颜色
canvasBmd.fillRect(new Rectangle(p.position.x, p.position.y, 4, 4), p.extra.color);
}
else
{
canvasBmd.fillRect(new Rectangle(p.position.x, p.position.y, 3, 3), ps.particles[l].extra.color);
}
}
//重画粒子模版
{
var p:Particle=ps.particles[l];
if (ps.particles[l].extra.isFire)
{
//改变粒子位置大小以及颜色
canvasBmd.fillRect(new Rectangle(p.position.x, p.position.y, 4, 4), p.extra.color);
}
else
{
canvasBmd.fillRect(new Rectangle(p.position.x, p.position.y, 3, 3), ps.particles[l].extra.color);
}
}
//重画粒子模版
blurBmd.draw(canvas, null, null, BlendMode.ADD);
//加上模糊特效
blurBmd.filter = blurFilter;
blurBmd.colorOffset(-5, -5, -5, 0);
postBmd.draw(blurBmp, matrix);
}
、//鼠标点击发射粒子
private function fire(e : MouseEvent) : void
{
var fireParticle : Particle = ps.createParticle(Particle);
//粒子活动范围,超过这个范围混灭粒子
fireParticle.init(canvasBmd.width / 2, canvasBmd.height, 2.6);
fireParticle.extra = {color:Math.random() * 0xffffff, isFire:true};
//这是开始粒子速度
fireParticle.velocity.reset(0, -(6.5 + Math.random() * 4));
//粒子旋转角度,也就是说我往左边或右边运动角度
fireParticle.velocity.rotate(15 - Math.random() * 30);
fireParticle.friction.reset(0, 0);
//加上重力,牛顿定律
fireParticle.addForce("g", gravity);
//烟花飞到空中开始毁灭自己,爆炸
fireParticle.addEventListener(ParticleEvent.DEAD, boom);
}
//这里开始爆炸
//加上模糊特效
blurBmd.filter = blurFilter;
blurBmd.colorOffset(-5, -5, -5, 0);
postBmd.draw(blurBmp, matrix);
}
、//鼠标点击发射粒子
private function fire(e : MouseEvent) : void
{
var fireParticle : Particle = ps.createParticle(Particle);
//粒子活动范围,超过这个范围混灭粒子
fireParticle.init(canvasBmd.width / 2, canvasBmd.height, 2.6);
fireParticle.extra = {color:Math.random() * 0xffffff, isFire:true};
//这是开始粒子速度
fireParticle.velocity.reset(0, -(6.5 + Math.random() * 4));
//粒子旋转角度,也就是说我往左边或右边运动角度
fireParticle.velocity.rotate(15 - Math.random() * 30);
fireParticle.friction.reset(0, 0);
//加上重力,牛顿定律
fireParticle.addForce("g", gravity);
//烟花飞到空中开始毁灭自己,爆炸
fireParticle.addEventListener(ParticleEvent.DEAD, boom);
}
//这里开始爆炸
private function boom(e : Event) : void
{
Particle(e.target).removeEventListener(ParticleEvent.DEAD, boom);
//这里是爆炸粒子数目
var fireNum : int = int(Math.random() * 100 + 200);
while (fireNum-- > 0)
{
// 想拥有你的特效吗请改变他 这里初始化爆炸粒子信息:速度,角速度,重力,摩擦力。改变这里你看到不一样的效果
var fireParticle : Particle = ps.createParticle(Particle);
fireParticle.init(e.target.position.x, e.target.position.y, 1.5);
fireParticle.extra = {color:e.target.extra.color, isFire:false,size:0.5};
fireParticle.velocity.reset(0, 2+Math.random()*2);
fireParticle.velocity.rotate(Math.random() * 360);
fireParticle.friction.reset(0.1, 0.1);
fireParticle.addForce("g", gravity);
}
}
这里是随便改变参数效果:
再看看其他粒子特效:火龙FireDragon
动动手,运用您的智慧,创造您的魅力来!
{
Particle(e.target).removeEventListener(ParticleEvent.DEAD, boom);
//这里是爆炸粒子数目
var fireNum : int = int(Math.random() * 100 + 200);
while (fireNum-- > 0)
{
// 想拥有你的特效吗请改变他 这里初始化爆炸粒子信息:速度,角速度,重力,摩擦力。改变这里你看到不一样的效果
var fireParticle : Particle = ps.createParticle(Particle);
fireParticle.init(e.target.position.x, e.target.position.y, 1.5);
fireParticle.extra = {color:e.target.extra.color, isFire:false,size:0.5};
fireParticle.velocity.reset(0, 2+Math.random()*2);
fireParticle.velocity.rotate(Math.random() * 360);
fireParticle.friction.reset(0.1, 0.1);
fireParticle.addForce("g", gravity);
}
}
这里是随便改变参数效果:
再看看其他粒子特效:火龙FireDragon
动动手,运用您的智慧,创造您的魅力来!
相关推荐
Direct3D游戏开发中的粒子系统是一种用于创建动态视觉效果的技术,如火焰、烟雾、水滴、爆炸等。粒子系统通常由大量简单的图形元素(粒子)组成,通过控制这些元素的位置、大小、颜色、透明度等属性,可以模拟出复杂...
在3D游戏开发和视觉特效制作中,粒子系统是不可或缺的工具。 在“粒子系统_喷泉”这个例子中,"fountain_ok_gl"很可能是一个已经编译好的可执行文件或者源代码,用于展示喷泉效果。这个程序可能使用了OpenGL,一个...
例如,你可以根据游戏事件动态改变粒子系统的参数,或者在特定条件下启动或停止粒子系统。 总的来说,Unity的粒子系统是一个强大且灵活的工具,它提供了丰富的选项来创建各种视觉特效。通过理解并熟练掌握各个子...
通过以上步骤,我们可以构建出一个展示“玫瑰花飞舞”效果的粒子系统。这种技术不仅限于玫瑰花,还可以应用于雪花飘落、烟花绽放等各种视觉特效。理解并掌握MFC和GDI+的使用,对于提升Windows平台下的图形编程能力...
在IT领域,粒子系统是一种广泛应用于游戏开发、图形渲染、动画制作等场景的技术,它可以模拟出各种复杂的视觉效果,如火焰、烟雾、水流、星光等。本篇将详细讲解Delphi实现的粒子生成系统实例,它能创建出逼真的瀑布...
粒子系统是一种模拟大量小对象行为的技术,常用于游戏开发和图形设计中,以创建动态的视觉效果。在Android中,我们可以利用Java或Kotlin编程语言,配合OpenGL ES或者Android的Canvas API来创建粒子系统。焰火和瀑布...
粒子系统通过大量小对象(粒子)的动态组合,模拟出复杂的视觉效果。每个粒子都有自己的属性,如位置、速度、大小、颜色等,并随着时间推移而变化。 气泡特效通常用于表现轻盈、欢快的场景。实现时,粒子应设置为...
粒子系统是Unity3D中一个内置的模块,专门用于创建复杂的视觉效果,如火焰、烟雾、水波、星光、魔法效果等。通过调整粒子的发射速度、形状、颜色、生命周期、大小变化等因素,开发者可以创建出各种各样的动态效果。 ...
在这个特定的项目中,"opengl 瀑布 waterfall" 是一个使用OpenGL实现的粒子系统,用于模拟逼真的瀑布效果。下面我们将深入探讨这个项目涉及的技术点。 首先,OpenGL粒子系统是创建动态图形效果的一种方法,比如火焰...
"烟花爆炸的粒子效果app"显然是一款利用粒子系统来模拟烟花绽放时的绚丽视觉效果的应用程序。接下来,我们将深入探讨粒子特效的基本概念、实现原理以及如何在移动应用中创建烟花爆炸效果。 粒子特效,简单来说,...
《3D游戏开发步步高系列课程》是一套深入浅出的教程,旨在引导学习者逐步掌握3D游戏开发的关键技术和流程。PDF版本的压缩包包含了丰富的教学内容,以电子书的形式提供,方便读者随时随地学习。其中,我们关注的焦点...
总的来说,这份资料深入浅出地介绍了如何利用现代优化技术解决实际工程问题,特别是在网络游戏的背景下,如何通过智能算法提高氢燃料发动机的性能,这对于游戏开发者、仿真工程师以及清洁能源领域的研究人员都具有很...
此外,还将介绍如何使用Cocos2D的粒子系统创建炫酷的特效,如火、烟雾或爆炸。 在资源管理和性能优化方面,读者将学习如何有效地加载和管理游戏资源,包括图片、音频和数据文件。同时,还会讨论内存管理和性能调优...
宣雨松的教程深入浅出地讲解了Unity3D的使用方法,旨在帮助开发者掌握这一技术。 Unity3D的游戏开发过程通常涉及以下几个关键知识点: 1. **Unity界面与工作流程**:学习Unity3D首先需要熟悉其编辑器界面,包括...
### 游戏引擎精粹——关键技术与...通过深入浅出的讲解,读者可以全面了解游戏引擎的核心技术和最佳实践,从而更好地应对游戏开发中的各种挑战。未来,随着更多游戏开发资源的陆续发布,这些知识将继续发挥重要作用。
这本书深入浅出地介绍了如何使用Unity和C#语言进行游戏开发。 Unity引擎的核心概念是其组件系统,它允许开发者通过组合不同的组件(如Transform、Mesh Renderer、Rigidbody等)来构建游戏对象。在《Unity 3D游戏...
总的来说,这份Unity游戏源码资源合集为学习者提供了多种类型的游戏案例,覆盖了Unity开发的多个方面,无论是新手还是有经验的开发者,都能从中获益匪浅。通过对这些源码的深入研究,你可以提升自己的Unity技能,...
本套教学PPT旨在深入浅出地讲解Cocos2d-x游戏开发的核心技术,帮助开发者快速掌握这一工具。 首先,"初识Cocos2d-x"章节将介绍Cocos2d-x的历史、特点、适用平台以及它与Cocos2d的关系。这部分会讲解Cocos2d-x的项目...
这些框架通常包含场景管理、粒子系统、物理引擎等模块,可以帮助开发者快速构建游戏。 最后,游戏设计原则和实践,包括游戏平衡性、用户体验设计、关卡设计等,是让游戏有趣且吸引人的关键。这些知识需要结合实际...
- **粒子系统**:通过Shader可以控制粒子的外观和行为,实现火焰、烟雾等特效。 - **物理模拟**:例如水波纹、软体物理等,Shader可以模拟这些自然现象的视觉效果。 4. **Awesome-Unity-Shader-master** 这个...