public void IntoRoom(RoomInfo roomInfo) { IsInRoom = true; CurrentX = roomInfo.X; CurrentY = roomInfo.Y; CurrentDir = CommonDefine.MoveDirection.None; ChangeCurrentPoint(roomInfo); //roomInfo.IsHere = true; OnPropertyChanged <RoomInfo>(ROOMIN, roomInfo); }
/// <summary> /// 在指定的x,y和dir下创建一条路 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="dir"></param> /// <returns>成功返回true,失败返回false</returns> private RoadInfo MakeRoad(int x, int y, CommonDefine.MoveDirection dir) { RoadInfo road = new RoadInfo(); road.X = x; road.Y = y; road.BuildDir = dir; m_roads.Add(road); return(road); }
/// <summary> /// 离开此房间,去往下一个房间 /// </summary> /// <param name="targetRoom"></param> public void OutRoom(RoomInfo targetRoom) { //在路上时不能操纵去哪个房间 if (!IsInRoom) { return; } //只能去隔壁房间,不能一下子去很远的房子 RoomInfo curRoom = GetRoomByXY(CurrentX, CurrentY); int distance = Mathf.Abs(targetRoom.X - curRoom.X) + Mathf.Abs(targetRoom.Y - curRoom.Y); if (distance != 1) { return; } //判断去的房间的方向,从而取得去的路 IsInRoom = false; if (targetRoom.X > CurrentX) { CurrentDir = CommonDefine.MoveDirection.East; } else if (targetRoom.Y > CurrentY) { CurrentDir = CommonDefine.MoveDirection.North; } else if (targetRoom.X < CurrentX) { CurrentDir = CommonDefine.MoveDirection.West; } else if (targetRoom.Y < CurrentY) { CurrentDir = CommonDefine.MoveDirection.South; } else { CurrentDir = CommonDefine.MoveDirection.None; } RoadInfo currentRoad = GetRoadByXYAndDir(CurrentX, CurrentY, CurrentDir); //通知更新UI OnPropertyChanged <RoadInfo>(ROOMOUT, currentRoad); }
/// <summary> /// 递归创建随机地图 /// </summary> /// <param name="previousX"></param> /// <param name="previousY"></param> /// <returns></returns> private bool CreateMap(int previousX, int previousY) { for (int i = 0; i < 30; i++) { if (CheckCreateMapFinished()) { return(true); } CommonDefine.MoveDirection dir = (CommonDefine.MoveDirection)(Random.Range(0, 100) % 4); int tmpX = previousX; int tmpY = previousY; switch (dir) { case CommonDefine.MoveDirection.East: tmpX += 1; break; case CommonDefine.MoveDirection.South: tmpY -= 1; break; case CommonDefine.MoveDirection.West: tmpX -= 1; break; case CommonDefine.MoveDirection.North: tmpY += 1; break; } if (TryMakeRoom(tmpX, tmpY)) { RoomInfo prevRoom = GetRoomByXY(previousX, previousY); RoadInfo road = MakeRoad(previousX, previousY, dir); prevRoom.AddNeibourRoads(road); road.AddNeibourRoom(prevRoom); RoomInfo curRoom = MakeRoom(tmpX, tmpY); curRoom.AddNeibourRoads(road); road.AddNeibourRoom(curRoom); CreateMap(tmpX, tmpY); } } return(false); }
/// <summary> /// 根据X,Y,DIR取得路 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="dir"></param> /// <returns></returns> public RoadInfo GetRoadByXYAndDir(int x, int y, CommonDefine.MoveDirection dir) { foreach (RoadInfo r in m_roads) { if (x == r.X && y == r.Y && dir == r.BuildDir) { return(r); } if (Mathf.Abs(r.BuildDir - dir) == 2) { int tmpX = -1; int tmpY = -1; switch (r.BuildDir) { case CommonDefine.MoveDirection.East: tmpX = r.X + 1; tmpY = r.Y; break; case CommonDefine.MoveDirection.North: tmpX = r.X; tmpY = r.Y + 1; break; case CommonDefine.MoveDirection.South: tmpX = r.X; tmpY = r.Y - 1; break; case CommonDefine.MoveDirection.West: tmpX = r.X - 1; tmpY = r.Y; break; } if (tmpX == x && tmpY == y) { return(r); } } } return(null); }
public RoomInfo GetNeibourRoom(CommonDefine.MoveDirection dir) { int tmpX = -1; int tmpY = -1; switch (dir) { case CommonDefine.MoveDirection.East: tmpX = DungeonGenerator.Instance.CurrentX + 1; tmpY = DungeonGenerator.Instance.CurrentY; break; case CommonDefine.MoveDirection.North: tmpX = DungeonGenerator.Instance.CurrentX; tmpY = DungeonGenerator.Instance.CurrentY + 1; break; case CommonDefine.MoveDirection.South: tmpX = DungeonGenerator.Instance.CurrentX; tmpY = DungeonGenerator.Instance.CurrentY - 1; break; case CommonDefine.MoveDirection.West: tmpX = DungeonGenerator.Instance.CurrentX - 1; tmpY = DungeonGenerator.Instance.CurrentY; break; } foreach (RoomInfo room in m_neighbourRooms) { if (tmpX == room.X && tmpY == room.Y) { return(room); } } return(null); }