int CreatePassage(MAP.Vector2D doorPos, MAP.DIRECTION direction) { int dir = 0; int coord = 0; MAP.SPACE curSpace; if (direction == MAP.DIRECTION.UP || direction == MAP.DIRECTION.DOWN) { dir = direction == MAP.DIRECTION.UP ? -1 : 1; while (true) { ++coord; curSpace = Map[doorPos.y + (coord * dir)][doorPos.x]; Map[doorPos.y + (coord * dir)][doorPos.x - 1] = Map[doorPos.y + (coord * dir)][doorPos.x - 1] | MAP.SPACE.PASSAGE_WALL; Map[doorPos.y + (coord * dir)][doorPos.x] = Map[doorPos.y + (coord * dir)][doorPos.x] | MAP.SPACE.PASSAGE_FLOOR; Map[doorPos.y + (coord * dir)][doorPos.x + 1] = Map[doorPos.y + (coord * dir)][doorPos.x + 1] | MAP.SPACE.PASSAGE_WALL; if ((curSpace & MAP.SPACE.BLOCK) == MAP.SPACE.BLOCK) { break; } if ((curSpace & MAP.SPACE.PASSAGE_WALL) == MAP.SPACE.PASSAGE_WALL) { Map[doorPos.y + (coord * dir)][doorPos.x] = MAP.SPACE.PASSAGE_FLOOR; ++coord; break; } } coord = doorPos.y + (coord * dir); } else { dir = direction == MAP.DIRECTION.RIGHT ? -1 : 1; while (true) { ++coord; curSpace = Map[doorPos.y][doorPos.x + (coord * dir)]; Map[doorPos.y - 1][doorPos.x + (coord * dir)] = Map[doorPos.y - 1][doorPos.x + (coord * dir)] | MAP.SPACE.PASSAGE_WALL; Map[doorPos.y][doorPos.x + (coord * dir)] = Map[doorPos.y][doorPos.x + (coord * dir)] | MAP.SPACE.PASSAGE_FLOOR; Map[doorPos.y + 1][doorPos.x + (coord * dir)] = Map[doorPos.y + 1][doorPos.x + (coord * dir)] | MAP.SPACE.PASSAGE_WALL; if ((curSpace & MAP.SPACE.BLOCK) == MAP.SPACE.BLOCK) { break; } if ((curSpace & MAP.SPACE.PASSAGE_WALL) == MAP.SPACE.PASSAGE_WALL) { Map[doorPos.y][doorPos.x + (coord * dir)] = MAP.SPACE.PASSAGE_FLOOR; ++coord; break; } } coord = doorPos.x + (coord * dir); } return(coord); }
void ConnectRoom(MAP.ROOM lRoom, MAP.ROOM rRoom, MAP.DIRECTION lDir, MAP.DIRECTION rDir) { bool createLDoor = lRoom.CreateDoor(lDir); bool createRDoor = rRoom.CreateDoor(rDir); MAP.Vector2D lDoor = lRoom.GetDoorPosition(lDir); MAP.Vector2D rDoor = rRoom.GetDoorPosition(rDir); Map[lDoor.y][lDoor.x] = MAP.SPACE.ROOM_DOOR; Map[rDoor.y][rDoor.x] = MAP.SPACE.ROOM_DOOR; //직선인 경우 if (lDoor.y == rDoor.y) { int x = 1; do { Map[lDoor.y - 1][lDoor.x + x] = Map[lDoor.y - 1][lDoor.x + x] | MAP.SPACE.PASSAGE_WALL; Map[lDoor.y][lDoor.x + x] = Map[lDoor.y][lDoor.x + x] | MAP.SPACE.PASSAGE_FLOOR; Map[lDoor.y + 1][lDoor.x + x] = Map[lDoor.y + 1][lDoor.x + x] | MAP.SPACE.PASSAGE_WALL; ++x; } while (lDoor.x + x != rDoor.x); } else if (lDoor.x == rDoor.x) { int y = 1; do { Map[lDoor.y + y][lDoor.x - 1] = Map[lDoor.y + y][lDoor.x - 1] | MAP.SPACE.PASSAGE_WALL; Map[lDoor.y + y][lDoor.x] = Map[lDoor.y + y][lDoor.x] | MAP.SPACE.PASSAGE_FLOOR; Map[lDoor.y + y][lDoor.x + 1] = Map[lDoor.y + y][lDoor.x + 1] | MAP.SPACE.PASSAGE_WALL; ++y; } while (lDoor.y + y != rDoor.y); } //직선이 아닌 경우 else { int pos = 0; if (createLDoor) { pos = CreatePassage(lDoor, lDir); } if (createRDoor) { pos = CreatePassage(rDoor, rDir); } ConnectPassage(pos, lDoor, rDoor, lDir); } }
public void GeneratePassage(NODE lNode, NODE rNODE, MAP.DIVIDE divideDir) { MAP.DIRECTION lDir = MAP.DIRECTION.NONE; MAP.DIRECTION rDir = MAP.DIRECTION.NONE; switch (divideDir) { case MAP.DIVIDE.VERTICAL: lDir = MAP.DIRECTION.LEFT; rDir = MAP.DIRECTION.RIGHT; break; case MAP.DIVIDE.HORIZONTAL: lDir = MAP.DIRECTION.DOWN; rDir = MAP.DIRECTION.UP; break; } if (lDir != MAP.DIRECTION.NONE) { //Debug.Log(lDir + " , " + rDir); ConnectRoom(lNode.roomInfo, rNODE.roomInfo, lDir, rDir); } }
void ConnectPassage(int pos, MAP.Vector2D lDoor, MAP.Vector2D rDoor, MAP.DIRECTION lDir) { int coord = 0; int small = 0; int large = 0; //왼쪽 문 방향이 아래 = 횡으로 연결 if (lDir == MAP.DIRECTION.DOWN) { small = lDoor.x < rDoor.x ? lDoor.x : rDoor.x; large = lDoor.x > rDoor.x ? lDoor.x : rDoor.x; if ((Map[pos - 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[pos - 1][small + coord] = MAP.SPACE.PASSAGE_WALL; } if ((Map[pos + 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[pos + 1][small + coord] = MAP.SPACE.PASSAGE_WALL; } Map[pos][small + coord] = Map[pos][small + coord] | MAP.SPACE.PASSAGE_FLOOR; ++coord; while (true) { if (small + coord == large) { if ((Map[pos - 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[pos - 1][small + coord] = (Map[pos - 1][small + coord] | MAP.SPACE.PASSAGE_WALL); } if ((Map[pos + 1][small + coord] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[pos + 1][small + coord] = (Map[pos + 1][small + coord] | MAP.SPACE.PASSAGE_WALL); } Map[pos][small + coord] = Map[pos][small + coord] | MAP.SPACE.PASSAGE_FLOOR; break; } Map[pos - 1][small + coord] = Map[pos - 1][small + coord] | MAP.SPACE.PASSAGE_WALL; Map[pos][small + coord] = Map[pos][small + coord] | MAP.SPACE.PASSAGE_FLOOR; Map[pos + 1][small + coord] = Map[pos + 1][small + coord] | MAP.SPACE.PASSAGE_WALL; ++coord; } } else { small = lDoor.y < rDoor.y ? lDoor.y : rDoor.y; large = lDoor.y > rDoor.y ? lDoor.y : rDoor.y; if ((Map[small + coord][pos - 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[small + coord][pos - 1] = Map[small + coord][pos - 1] | MAP.SPACE.PASSAGE_WALL; } if ((Map[small + coord][pos + 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[small + coord][pos + 1] = Map[small + coord][pos + 1] | MAP.SPACE.PASSAGE_WALL; } Map[small + coord][pos] = Map[small + coord][pos] | MAP.SPACE.PASSAGE_FLOOR; ++coord; while (true) { if (small + coord == large) { if ((Map[small + coord][pos - 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[small + coord][pos - 1] = Map[small + coord][pos - 1] | MAP.SPACE.PASSAGE_WALL; } if ((Map[small + coord][pos + 1] & MAP.SPACE.PASSAGE_FLOOR) != MAP.SPACE.PASSAGE_FLOOR) { Map[small + coord][pos + 1] = Map[small + coord][pos + 1] | MAP.SPACE.PASSAGE_WALL; } Map[small + coord][pos] = Map[small + coord][pos] | MAP.SPACE.PASSAGE_FLOOR; break; } Map[small + coord][pos - 1] = Map[small + coord][pos - 1] | MAP.SPACE.PASSAGE_WALL; Map[small + coord][pos] = Map[small + coord][pos] | MAP.SPACE.PASSAGE_FLOOR; Map[small + coord][pos + 1] = Map[small + coord][pos + 1] | MAP.SPACE.PASSAGE_WALL; ++coord; } } }