天天看點

Silverlight C# 遊戲開發:絢麗的粒子特效-顔色粒子(一)

在遊戲中,有各種各樣特效,其中有一種特效是通過計算随機産生,而不是一張又一張的圖檔更換,通過模拟現實中的粒子實體規律得到有趣真實的效果,這種叫作粒子特效,它能大量的降低資源大小,咱們一起實作一個簡單的跟随滑鼠的粒子特效。

<a target="_blank" href="http://blog.51cto.com/attachment/201111/131123850.jpg"></a>

在flash中我不清楚是否好做,但是在Silverlight中實作粒子特效非常容易,今天咱們一起來做一個簡單的粒子特效。

現在需要将基本的粒子建立出來,先分析粒子最基本的運動方式和規律,粒子具備衰減的特性,然後就是移動行為,為了讓運動不具備規律還要加入例如XY軸随機向量和重力,具體分析請看下圖。

依據上面的分析建立全局參數,為了讓粒子效果看起來更加真實和不确定,這些包含了随機、透明度、粒子數、大小範圍等等,請參看下面的代碼:

public class GlobalValue  

{  

/// &lt;summary&gt; 

/// 全局随機函數,從時間取得種子,保證每次都不一樣  

/// &lt;/summary&gt; 

public static Random random = new Random((int)DateTime.Now.Ticks);  

/// 起始透明度  

public const double OPACITY = 1;  

/// 每次添加多少個粒子  

public const double FIREWORK_NUM = 2;  

/// 重力  

public const double GRAVITY = 0.1;  

/// 偏移X  

public const double X_VELOCITY = 5;  

/// 偏移Y  

public const double Y_VELOCITY = 5;  

/// 最小的半徑  

public const int SIZE_MIN = 1;  

/// 最大的半徑  

public const int SIZE_MAX = 10;  

/// 透明度衰減值  

public const double OpacityInc = -0.02;  

}  

然後建立基本粒子,我這裡偷懶了,簡單的寫了一個DOT類:

public class Dot: Canvas  

{   

public double XVelocity = 1;  

public double YVelocity = 1;  

public double Gravity = 1;  

public Dot(byte red, byte green, byte blue, double size)  

double opac = GlobalValue.OPACITY;  

size = GlobalValue.random.Next(GlobalValue.SIZE_MIN,GlobalValue.SIZE_MAX);  

//生成圓圈粒子  

Ellipse ellipse = new Ellipse();  

ellipse.Width = size;  

ellipse.Height = size;   

ellipse.Fill = new SolidColorBrush(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);  

public void RunFirework()  

XX = X + XVelocity;  

YY = Y + YVelocity;  

this.Opacity += GlobalValue.OpacityInc;  

YVelocity += Gravity;   

//制作一個綁定屬性  

public double X  

get { return (double)(GetValue(Canvas.LeftProperty)); }  

set { SetValue(Canvas.LeftProperty, value); }  

public double Y  

get { return (double)(GetValue(Canvas.TopProperty)); }  

set { SetValue(Canvas.TopProperty, value); }  

建立一個Colorful類也是從Canvas上繼承下來,它就是所有粒子的容器。

public class Colorful : Canvas  

private List&lt;Dot&gt; _dotGroup = new List&lt;Dot&gt;();  

private DispatcherTimer _timer;  

private static int IntervalTime = 20;   

public Colorful()  

this.Background = new SolidColorBrush(Colors.Gray);   

List&lt;Object&gt; array = new List&lt;Object&gt;();  

Object abc = new Object();  

Start();  

void loop_timer_Tick(object sender, EventArgs e)  

moveDots();  

void moveDots()  

for (int i = _dotGroup.Count - 1; i &gt;= 0; i--)  

Dot dot = _dotGroup[i];  

dot.RunFirework();  

if (dot.Opacity &lt;= 0.1)  

this.Children.Remove(dot);  

_dotGroup.Remove(dot);  

public virtual void addDotToGroup(double x, double y)  

int seed = (int)DateTime.Now.Ticks;  

for (int i = 0; i &lt; GlobalValue.FIREWORK_NUM; i++)  

double size = GlobalValue.SIZE_MIN + (GlobalValue.SIZE_MAX - GlobalValue.SIZE_MIN) * GlobalValue.random.NextDouble();  

byte red = (byte)(128 + (128 * GlobalValue.random.NextDouble()));  

byte green = (byte)(128 + (128 * GlobalValue.random.NextDouble()));  

byte blue = (byte)(128 + (128 * GlobalValue.random.NextDouble()));  

double xVelocity = GlobalValue.X_VELOCITY - 2 * GlobalValue.X_VELOCITY * GlobalValue.random.NextDouble();  

double yVelocity = -GlobalValue.Y_VELOCITY * GlobalValue.random.NextDouble();  

Dot dot = new Dot(red, green, blue, size);  

dot.X = x;  

dot.Y = y;  

dot.XVelocity = xVelocity;  

dot.YVelocity = yVelocity;  

dot.Gravity = GlobalValue.GRAVITY;  

_dotGroup.Add(dot);  

this.Children.Add(dot);  

public virtual void Start()  

_timer = new DispatcherTimer();  

_timer.Interval = TimeSpan.FromMilliseconds(IntervalTime);  

_timer.Tick += new EventHandler(loop_timer_Tick);  

_timer.Start();  

這是一個隻有執行邏輯的容器,addDot用來增加粒子,moveDots是移動粒子并且檢測是否消失,如果消失則從List和父結構中移除掉。  

生成邏輯通過面向對象的方式實作,建立一個Colorful_FollowMouse類:  

public class Colorful_FollowMouse : Colorful  

public Colorful_FollowMouse()  

MouseMove += new MouseEventHandler(Colorful_FollowMouse_MouseMove);  

void Colorful_FollowMouse_MouseMove(object sender, MouseEventArgs e)  

addDotToGroup(e.GetPosition(this).X, e.GetPosition(this).Y);  

添加到MainPage中LayoutRoot.Children.Add(new Colorful_ FollowMouse ());

運作看看效果吧:)滑鼠滑動一下看看

<a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0"> </a>

我在工程中加入了一個Colorful_ClickMouse類,是通過點選産生粒子的操作效果,可以更換看看點選的感覺如何:)

對于一個遊戲而言,如果粒子系統作的好,能夠為遊戲增加很多視覺樂趣,就如今天的顔色點特效,能夠應用到很多程式當中,并不隻是遊戲,而且這個類一旦寫好,就可以作為通用的方法為其他開發所用上,這個顔色點很有趣吧,以後後面咱們逐漸實作更佳“絢麗”的特效,例如火焰、爆炸等等:)

本文轉自nowpaper 51CTO部落格,原文連結:http://blog.51cto.com/nowpaper/712440