(原創 untiy) 隨機地牢生成算法(一)


轉載注明出處: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM