可以看到新的房间周围又有三个可选,在三个可选中又随机选中1~3个房间(浅绿色)。
在选出的房间里面随机选择一个房间,重复上一步操作,重复两次(你想重复几次都可以啦反正我重复两次)在选出的房间里面随机选择一个房间作为终点(蓝色), 房间布局就随机出来啦~
实现代码如下:
/// 统计可选房间 public void AddRange(int roomVector)
{
int[] vec = new int[4];
vec[0] = roomVector / 5 == 0 ? -1 : roomVector - 5;
vec[1] = roomVector / 5 == 4 ? -1 : roomVector 5;
vec[2] = roomVector % 5 == 0 ? -1 : roomVector - 1;
vec[3] = roomVector % 5 == 4 ? -1 : roomVector 1;
range.Clear();
for (int i = 0; i < vec.Length; i )
{
if (vec[i] != -1 && map[vec[i] / 5, vec[i] % 5] == 0)
{
range.Add(vec[i]);
}
}
}
/// 生成新的房间方位 ///房间数量 ///房间类型 public void AddRoom(int roomCount, RoomType roomType)
{
num;
while (roomCount > 0)
{
int b = Random.Range(0, range.Count);
//加为子节点,修改map值为1 map[range[b] / 5, range[b] % 5] = num;
ranroom.AddNextRoom(new Room(range[b], roomType));
range.Remove(range[b]);
--roomCount;
}
ranRoom = ranRoom.nextRooms[Random.Range(0, ranRoom.nextRooms.Count)];
}
3、生成完整地图
上文的房间布局是用一个5*5的二位数组存储起来的,而完整的地图则需要一个足够大的二维数组,这个足够大是多大呢,就是你最大的房间有多大,再预留一点空间作为走廊的大小,再乘以五就是大地图的边长了。
虽然是个随机房间的游戏,但是房间的格局可不是可以随便长的,布局信息可以通过excel设计之后转为二维数组数据,我比较懒就直接在脚本里面码出来了(代码在文末网盘),这样一来就可以随机房间的样式了。
道理都懂了,怎么动笔呢?这里就要用到之前提到的树结构了,我声明了一个类,在生成房间布局的时候对每个房间新建一个对应的对象,这个对象又记住了自己的子房间,形成一颗树,比如上面的房间布局生成推演可以生成出一颗这样的树。
这样的好处一方面是在绘制房间之间的通道的时候直接从父节点向子节点计算路径(其实就是画直线)就可以了,一方面在绘制房间的时候不需要遍历整个房间格局二维数组,直接从“起点”往下找每个节点就可以了。
/// 在大地图中绘制房间 ///起点 private void AddRoomForMap(Room room)
{
SetRoomInArray(room);
if (room.nextRooms.Count != 0)
{
foreach (Room item in room.nextRooms)
{
AddRoomForMap(item);
}
}
}
/// 在大地图中绘制路径 ///起点 private void AddPathForMap(Room room)
{
foreach (Room item in room.nextRooms)
{
SetPathInArray(room, item);
}
foreach (Room item in room.nextRooms)
{
if (item.nextRooms.Count != 0)
{
AddPathForMap(item);
}
}
}
起点和终点的房间样式是固定的,其他房间则是随机一个“其他房间样式”,通过简单的数学计算得到房间在完整地图上的坐标之后将房间样式二维数组赋值到完整地图的对应位置,再在房间之间画上路径,一个完整地图二维数组就生成好了。
最后遍历完整地图二维数组,根据数组中的数据在Tilemap上绘制瓦片就可以生成最终效果了,再换几套贴图~每次都有新感觉~
链接:https://pan.baidu.com/s/1dSxD-h7dmm0jSxH0G4jVjw
提取码:ow9w
~~~分割线~~~
欢迎加入游戏开发群欢乐搅基:610475807
对游戏开发感兴趣的童鞋可戳这里进一步了解:http://www.levelpp.com/