(原创 untiy) 随机地牢生成算法
Posted m_f_s
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(原创 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
以上是关于(原创 untiy) 随机地牢生成算法的主要内容,如果未能解决你的问题,请参考以下文章