java编写roguelike_RogueLike地牢生成算法Unity实现

最近几日闲来无事,后来看到了RogueLike的游戏,就像来试一下地牢生成算法。

网上看到了一篇文章写的挺好的。后面会有转载,不急哈。

先看一下我实现的效果图

3a0455ffd897b62439d11921d83f0955.png

生成过程:

9dc670ba8e7c5616b4a1b7d58f57d5f2.gif

地牢生成算法的思路是:

1.生成大量随机位置随机大小的房间2.通过物理碰撞将房间分散开3.通过阈值选取主要的房间4.对主房间进行三角剖分运算,得到房间之间的可选路径5.使用最小生成树选定房间之间的路径,并且保留少量回圈6.确定房间路路线7.路上经过的房间划入次要房间中8.绘制房间和路线.

随机生成房间

需要随机生成房间的初始位置,以及房间的长宽高

文章中提供了一种思路,在圆形中随机确定一个点,作为房间的初始位置。

而如何在圆形中随机生成一个点。

圆中生成随机点

先从一个三角形中入手

假设三角形ABC 且|AB| =|AC|。

在AB中找一个点X,在AC中找一个点Y,并用AX和AY做一个平行四边形XAYZ。那么这个随机点Z就找到了。

a7badf7f0a8b75901bb309014b0dbf16.png

那万一Z超出了三角形呢

没事,超出了三角形,就将点Z以BC翻折到三角形中。

ca6a10a92cbabbb57249c4dc106cc969.png

那我们该怎么运用在圆中呢?

其实这里去了一个极限,将一个圆细分成无数的等腰三角形

7da885fa8407c54b04f043b457d0dd1a.png

这样,我们只要在圆中选择一个三角形,再从三角形中随机选择一个点。

这样就能随机生成一个点了。

d7bed008a32df0bb3c00346b579a73e3.png

现在轮到房间大小了

房间大小可以利用上面的方法,在圆内生成一个点,再用这个点生成一个矩形。

可以有两种生成方法,如下图。

a4a28f36f2537d17d37a4efb8f35bc95.png

77e0fa45c39958251a69069baf84f7c9.png

分散房间

这里可以选择使用Unity中自带的Rigidbody分散,

因为Unity的碰撞不好控制,常常跑出来一堆小数,所以我选择自己写一个Rigidbody。

逻辑非常简单,只需要判断自己是否覆盖别人的房间,如果覆盖就移动到没有覆盖。

移动距离计算

假设房间1 和房间2发生碰撞,

对于房间1

Offset= pos1-pos2

如果选择竖直方向的移动

需要判断是向上还是向下

方向:dirY= offsetY>0?1:-1;

距离:dis= y1/2+y2/2– abs(offsetY)

pos1+= vector2.up*dirY*dis

水平方向移动同理。

a395d0f87cbd5e0f4328de80d9177faf.png

706367dd77a1e93ddd92160c73f4af88.png

aaa821586b9df079a7b84a4a63d37ab3.png

然后在FixUpdate中调用Simualeting。

筛选主房间

这里没什么好说的了,就是这个筛选房间可以在碰撞之前进行。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值