3.5 RandomHelper類
看一下輔助類中的RandomHelper類,在單一項目中它用得不是很多,但幾乎任何一個遊戲都會需要產生一些隨機數讓遊戲內容看上去沒有太多的周期性,並讓遊戲富於變化。
在Breakout遊戲中,您就需要一些隨機數,這裡的磚塊(block)就是隨機產生的。第一級的隨機機率是10%,第二級是20%,以此類推,這樣遊戲層級不斷提升,遊戲也就變得更難。當然您可以使用Random類,調用Next方法來產生一個新的隨機數,但如果您想產生一個隨機標準化向量,就得使用下面的代碼:
Random randomGenerator = new Random((int)DateTime.Now.Ticks);
Vector3 randomNormalVector = new Vector3(
(float)randomGenerator.NextDouble() * 2.0f - 1.0f,
(float)randomGenerator.NextDouble() * 2.0f - 1.0f,
(float)randomGenerator.NextDouble() * 2.0f - 1.0f);
randomNormalVector.Normalize();
如果不想一次次地重複這段代碼,使用類似RandomHelper的輔助類會很有協助。圖3-8顯示了RandomHelper類的內部結構。
圖3-8
可以看到這個類的方法都很簡單,花幾分鐘就可以寫出這個類。但這個類非常有用,使用內部的Random類的靜態執行個體globalRandomGenerator,RandomHelper類在產生隨機數的時候比每次需要隨機數都建立一個新的Random執行個體快得多。
產生隨機向量
下面是RandomHelper類的一個方法,用來獲得二維隨機向量:/// <summary>
/// Get Random Vector2
/// </summary>
/// <param name="min">Minimum for each component</param>
/// <param name="max">Maximum for each component</param>
/// <returns>Vector2</returns>
public static Vector2 GetRandomVector2(float min, float max)
{
return new Vector2(
GetRandomFloat(min, max),
GetRandomFloat(min, max));
} // GetRandomVector2(min, max)
測試RandomHelper類中的方法沒有太大意義,因為所有的方法傳回值都是隨機數,沒有必要檢查GetRandomVector2方法返回的是不是一個二維向量,基本上不會出錯。