Silverlight C# 游戏开发:绚丽的粒子特效-颜色粒子(一)

2016-08-20 11:08:15来源:http://nowpaper.blog.51cto.com/3893223/712440作者:nowpaper人点击


在游戏中,有各种各样特效,其中有一种特效是通过计算随机产生,而不是一张又一张的图片更换,通过模拟现实中的粒子物理规律得到有趣真实的效果,这种叫作粒子特效,它能大量的降低资源大小,咱们一起实现一个简单的跟随鼠标的粒子特效。






在flash中我不清楚是否好做,但是在Silverlight中实现粒子特效非常容易,今天咱们一起来做一个简单的粒子特效。
现在需要将基本的粒子创建出来,先分析粒子最基本的运动方式和规律,粒子具备衰减的特性,然后就是移动行为,为了让运动不具备规律还要加入例如XY轴随机向量和重力,具体分析请看下图。


依据上面的分析建立全局参数,为了让粒子效果看起来更加真实和不确定,这些包含了随机、透明度、粒子数、大小范围等等,请参看下面的代码:


publicclassGlobalValue { ///<summary>///全局随机函数,从时间取得种子,保证每次都不一样 ///</summary>publicstaticRandomrandom=newRandom((int)DateTime.Now.Ticks); ///<summary>///起始透明度 ///</summary>publicconstdoubleOPACITY=1; ///<summary>///每次添加多少个粒子 ///</summary>publicconstdoubleFIREWORK_NUM=2; ///<summary>///重力 ///</summary>publicconstdoubleGRAVITY=0.1; ///<summary>///偏移X ///</summary>publicconstdoubleX_VELOCITY=5; ///<summary>///偏移Y ///</summary>publicconstdoubleY_VELOCITY=5; ///<summary>///最小的半径 ///</summary>publicconstintSIZE_MIN=1; ///<summary>///最大的半径 ///</summary>publicconstintSIZE_MAX=10; ///<summary>///透明度衰减值 ///</summary>publicconstdoubleOpacityInc=-0.02; }


然后建立基本粒子,我这里偷懒了,简单的写了一个DOT类:

publicclassDot:Canvas { publicdoubleXVelocity=1; publicdoubleYVelocity=1; publicdoubleGravity=1; publicDot(bytered,bytegreen,byteblue,doublesize) { doubleopac=GlobalValue.OPACITY; size=GlobalValue.random.Next(GlobalValue.SIZE_MIN,GlobalValue.SIZE_MAX); //生成圆圈粒子 { Ellipseellipse=newEllipse(); ellipse.Width=size; ellipse.Height=size; ellipse.Fill=newSolidColorBrush(Color.FromArgb(255,red,green,blue)); ellipse.Opacity=opac; ellipse.SetValue(Canvas.LeftProperty,-ellipse.Width/2); ellipse.SetValue(Canvas.TopProperty,-ellipse.Height/2); this.Children.Add(ellipse); } } publicvoidRunFirework() { XX=X+XVelocity; YY=Y+YVelocity; this.Opacity+=GlobalValue.OpacityInc; YVelocity+=Gravity; } //制作一个绑定属性 publicdoubleX { get{return(double)(GetValue(Canvas.LeftProperty));} set{SetValue(Canvas.LeftProperty,value);} } publicdoubleY { get{return(double)(GetValue(Canvas.TopProperty));} set{SetValue(Canvas.TopProperty,value);} } }


DOT从Canvas继承,它只是一个非常简单的点,然后依照颜色生成,那么现在将点放入到一个循环体中,制作相关的逻辑,我们这次一次使用了游戏循环方式中的链条式循环,基础理论请参看这里:http://nowpaper.blog.51cto.com/3893223/712448
建立一个Colorful类也是从Canvas上继承下来,它就是所有粒子的容器。

publicclassColorful:Canvas { privateList<Dot>_dotGroup=newList<Dot>(); privateDispatcherTimer_timer; privatestaticintIntervalTime=20; publicColorful() { this.Background=newSolidColorBrush(Colors.Gray); List<Object>array=newList<Object>(); Objectabc=newObject(); Start(); } voidloop_timer_Tick(objectsender,EventArgse) { moveDots(); } voidmoveDots() { for(inti=_dotGroup.Count-1;i>=0;i--) { Dotdot=_dotGroup[i]; dot.RunFirework(); if(dot.Opacity<=0.1) { this.Children.Remove(dot); _dotGroup.Remove(dot); } } } publicvirtualvoidaddDotToGroup(doublex,doubley) { intseed=(int)DateTime.Now.Ticks; for(inti=0;i<GlobalValue.FIREWORK_NUM;i++) { doublesize=GlobalValue.SIZE_MIN+(GlobalValue.SIZE_MAX-GlobalValue.SIZE_MIN)*GlobalValue.random.NextDouble(); bytered=(byte)(128+(128*GlobalValue.random.NextDouble())); bytegreen=(byte)(128+(128*GlobalValue.random.NextDouble())); byteblue=(byte)(128+(128*GlobalValue.random.NextDouble())); doublexVelocity=GlobalValue.X_VELOCITY-2*GlobalValue.X_VELOCITY*GlobalValue.random.NextDouble(); doubleyVelocity=-GlobalValue.Y_VELOCITY*GlobalValue.random.NextDouble(); Dotdot=newDot(red,green,blue,size); dot.X=x; dot.Y=y; dot.XVelocity=xVelocity; dot.YVelocity=yVelocity; dot.Gravity=GlobalValue.GRAVITY; dot.RunFirework(); _dotGroup.Add(dot); this.Children.Add(dot); } } publicvirtualvoidStart() { _timer=newDispatcherTimer(); _timer.Interval=TimeSpan.FromMilliseconds(IntervalTime); _timer.Tick+=newEventHandler(loop_timer_Tick); _timer.Start(); } }这是一个只有执行逻辑的容器,addDot用来增加粒子,moveDots是移动粒子并且检测是否消失,如果消失则从List和父结构中移除掉。 生成逻辑通过面向对象的方式实现,建立一个Colorful_FollowMouse类: publicclassColorful_FollowMouse:Colorful { publicColorful_FollowMouse() { MouseMove+=newMouseEventHandler(Colorful_FollowMouse_MouseMove); } voidColorful_FollowMouse_MouseMove(objectsender,MouseEventArgse) { addDotToGroup(e.GetPosition(this).X,e.GetPosition(this).Y); } }



添加到MainPage中LayoutRoot.Children.Add(new Colorful_ FollowMouse ());
运行看看效果吧:)鼠标滑动一下看看




我在工程中加入了一个Colorful_ClickMouse类,是通过点击产生粒子的操作效果,可以更换看看点击的感觉如何:)
对于一个游戏而言,如果粒子系统作的好,能够为游戏增加很多视觉乐趣,就如今天的颜色点特效,能够应用到很多程序当中,并不只是游戏,而且这个类一旦写好,就可以作为通用的方法为其他开发所用上,这个颜色点很有趣吧,以后后面咱们逐步实现更佳“绚丽”的特效,例如火焰、爆炸等等:)

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台