首页 > 代码库 > (原创 untiy) 随机地牢生成算法(一)

(原创 untiy) 随机地牢生成算法(一)

转载注明出处:http://www.cnblogs.com/m-f-s/p/6509135.html

 

根据http://www.gamelook.com.cn/2015/12/239245 翻译整理  进行实现:

 

技术分享

 

生成房间

首先,你要生成一些宽和高不同的房间,随机地放在一个圈内。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

 

(原创 untiy) 随机地牢生成算法(一)