轉載注明出處:http://www.cnblogs.com/m-f-s/p/6509135.html
根據http://www.gamelook.com.cn/2015/12/239245 翻譯整理 進行實現:
我最終在unity里面隨機出的地牢,因為我不需要走廊所以就沒有做:
生成房間
首先,你要生成一些寬和高不同的房間,隨機地放在一個圈內。TKdev的算法用了比較常見的方法隨機生成房間尺寸,我認為這是一個不錯的想法,因為它可以為你帶來更多的參數可供使用,使用不同的寬高比例和標准偏差可以帶來外觀不同的副本地牢。
我采用此函數來返回一個半徑為_r圓內的隨機點:
public static Vector2 RandomByCircle(float _r)
{
float a = Random.Range(0, 1f); //a、b 隨機角度畫圓
float b = Random.Range(0, 1f);
float temp = 0;
if (b < a)
{
temp = a;
a = b;
b = temp;
}
//計算坐標
float x = b * _r * Mathf.Cos(2 * Mathf.PI * a / b); //x、y 相當於房間寬高 / 位置坐標
float y = b * _r * Mathf.Sin(2 * Mathf.PI * a / b);
Vector2 pos = new Vector2((int)x, (int)y);
return pos;
}
這樣你就可以得到房間的位置,再次用此函數隨機就可以得到房間的長寬,當然也可以另外用Random.Range方法隨機房間長寬。
這里需要對返回的pos進行取整、消0處理(房間長寬為整數,防止房間長或寬為0),我是這樣做的:
//對點進行向上取整(讓坐標無小數)
Size.x = Mathf.Ceil(gSize.x);
Size.y = Mathf.Ceil(gSize.y);
//防止出現取整為0的情況
if (gSize.x == 0) Size.x = Mathf.Ceil(Random.Range(4, 10));
if (gSize.y == 0) Size.y = Mathf.Ceil(Random.Range(4, 10));
最后房間生成處理好的數需要取其絕對值防止取負:
room.GetComponent<BoxCollider2D>().size = new Vector2((int)Mathf.Abs(Size.x), (int)Mathf.Abs(Size.y));
這樣你就可以得到這種圖:
你可以設置一個預設的圖片,像這樣:
以便進行下一步對房間進行分散處理。
轉載注明出處:http://www.cnblogs.com/m-f-s/p/6509135.html