示例#1
0
    //Создать дерево разделения
    private void CreateBSP(SubDungeon subdungeon)
    {
        //Debug.Log("Splitting sub-dungeon " + subdungeon.debugId + ": " + subdungeon.rect);
        if (subdungeon.IAmLeaf())
        {
            if (splits < maxSplits)
            {
                if (subdungeon.rect.width > maxLeafSize || subdungeon.rect.height > maxLeafSize)
                {
                    if (subdungeon.Split(minLeafSize, maxLeafSize))
                    {
                        /*Debug.Log("Splitted sub-dungeon " + subdungeon.debugId + " in "
                         + subdungeon.left.debugId + ": " + subdungeon.left.rect + ", "
                         + subdungeon.right.debugId + ": " + subdungeon.right.rect);*/

                        CreateBSP(subdungeon.left);
                        CreateBSP(subdungeon.right);
                        return;
                    }
                    else
                    {
                        leaves.Add(subdungeon);
                        return;
                    }
                }
            }
            leaves.Add(subdungeon);
        }
    }
    public void DrawRooms(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }
        if (subDungeon.IAmLeaf())
        {
            for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
            {
                for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
                {
                    GameObject instance = Instantiate(floorTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, j] = instance;
                }
            }
            //////////

            ///////////
        }
        else
        {
            DrawRooms(subDungeon.left);
            DrawRooms(subDungeon.right);
        }
    }
示例#3
0
 public void DrawWallsRooms(SubDungeon subDungeon)
 {
     if (subDungeon == null)
     {
         return;
     }
     if (subDungeon.IAmLeaf())
     {
         int i = (int)subDungeon.room.x - 1;
         for (int j = ((int)subDungeon.room.y - 1); j < subDungeon.room.yMax + 1; j++)
         {
             SetInstance(wallTile, i, j);
         }
         i = (int)subDungeon.room.xMax;
         for (int j = ((int)subDungeon.room.y - 1); j < subDungeon.room.yMax + 1; j++)
         {
             SetInstance(wallTile, i, j);
         }
         i = (int)subDungeon.room.y - 1;
         for (int j = (int)subDungeon.room.x; j < subDungeon.room.xMax; j++)
         {
             SetInstance(wallTile, j, i);
         }
         i = (int)subDungeon.room.yMax;
         for (int j = (int)subDungeon.room.x; j < subDungeon.room.xMax; j++)
         {
             SetInstance(wallTile, j, i);
         }
     }
     else
     {
         DrawWallsRooms(subDungeon.left);
         DrawWallsRooms(subDungeon.right);
     }
 }
示例#4
0
    public void DrawRooms(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }
        if (subDungeon.IAmLeaf())
        {
            //tworzenie pokoju
            //sprawdzić które punkty to krawędzie i stawić tam inne klocki
            for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
            {
                for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
                {
                    SetInstance(floorTile, i, j);
                }
            }

            int Randx;
            int Randy;

            if (playerSetPosition)
            {
                int x = (int)Random.Range(1, 4);
                for (int i = 0; i < x; i++)
                {
                    do
                    {
                        Randx = (int)Random.Range(subDungeon.room.x, subDungeon.room.xMax);
                        Randy = (int)Random.Range(subDungeon.room.y, subDungeon.room.yMax);
                    }while (boardPositionsUnits[Randx, Randy] != null);

                    SetEnemy(enemy, Randx, Randy);
                }
            }
            else
            {
                Randx = (int)Random.Range(subDungeon.room.x, subDungeon.room.xMax);
                Randy = (int)Random.Range(subDungeon.room.y, subDungeon.room.yMax);

                SetPlayer(Randx, Randy);
            }

            float chance = Random.Range(1, 100);
            if (chance <= 50)
            {
                do
                {
                    Randx = (int)Random.Range(subDungeon.room.x, subDungeon.room.xMax);
                    Randy = (int)Random.Range(subDungeon.room.y, subDungeon.room.yMax);
                }while (boardPositionsUnits[Randx, Randy] != null);
                SetItem(chiken, Randx, Randy);
            }
        }
        else
        {
            DrawRooms(subDungeon.left);
            DrawRooms(subDungeon.right);
        }
    }
示例#5
0
    // Utility functions
    /// <summary> Gets a random position in the whole dungeon </summary>
    private void GetRandomPos(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            int randPosX, randPosY, findingPosAttempt = 0, maxAttemptLimit = 500;
            do
            {
                randPosX = Random.Range((int)subDungeon.room.x, (int)subDungeon.room.xMax);
                randPosY = Random.Range((int)subDungeon.room.y, (int)subDungeon.room.yMax);
                findingPosAttempt++;
            } while ((_dungeonTiles[randPosX, randPosY] != 1 || _objectSpawnPos[randPosX, randPosY] == 1) && findingPosAttempt <= maxAttemptLimit);
            _randomPos = new Vector3(randPosX, randPosY, 0);
        }
        else
        {
            if (Random.Range(0, 2) == 0)
            {
                GetRandomPos(subDungeon.left);
            }
            else
            {
                GetRandomPos(subDungeon.right);
            }
        }
    }
示例#6
0
    private void SpawnTraps(SubDungeon subDungeon, int dungeonLevel)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            if (_trapSpawnData.Current <= _trapSpawnData.Max)
            {
                int minTrapNumber         = (int)((subDungeon.room.width * subDungeon.room.height) / 12);
                int trapNumberForThisRoom = Random.Range(minTrapNumber, minTrapNumber + 1);
                for (int i = 0; i < trapNumberForThisRoom; i++)
                {
                    _randomPos = GetRandomPosInRoom(subDungeon.room);
                    // if the randomPos != invalidPos, then spawn the object
                    if (Vector3.Distance(_randomPos, _invalidPos) != 0)
                    {
                        int trapIndex = Random.Range(0, 2);

                        GameObject instance = Instantiate(GameConfigData.Instance.Traps[trapIndex], _randomPos, Quaternion.identity) as GameObject;
                        instance.transform.SetParent(Dungeon.transform.GetChild((int)Objects.Traps).gameObject.transform);
                        _trapSpawnData.Current++;
                        _objectSpawnPos[(int)_randomPos.x, (int)_randomPos.y] = 1;
                    }
                }
            }
        }
        else
        {
            SpawnTraps(subDungeon.left, dungeonLevel);
            SpawnTraps(subDungeon.right, dungeonLevel);
        }
    }
 public void DrawWalls(SubDungeon subDungeon)
 {
     if (subDungeon == null)
     {
         return;
     }
     if (subDungeon.IAmLeaf())
     {
         for (int i = (int)subDungeon.room.x - 1; i < subDungeon.room.xMax + 1; i++)
         {
             for (int j = (int)subDungeon.room.y - 1; j < subDungeon.room.yMax + 1; j++)
             {
                 if (i == subDungeon.room.x - 1 || j == subDungeon.room.y - 1 || i == subDungeon.room.xMax || j == subDungeon.room.yMax)
                 {
                     if (boardPositionsFloor[i, j] == null)
                     {
                         GameObject wall = Instantiate(wallTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                         wall.transform.SetParent(transform);
                         boardPositionsFloor[i, j] = wall;
                     }
                 }
             }
         }
     }
     else
     {
         DrawWalls(subDungeon.left);
         DrawWalls(subDungeon.right);
     }
 }
示例#8
0
    private void DrawRooms(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
            {
                for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
                {
                    if (!(i >= subDungeon.removedPiece.x && i <= subDungeon.removedPiece.xMax && j >= subDungeon.removedPiece.y && j <= subDungeon.removedPiece.yMax))
                    {
                        GameObject instance = Instantiate(GameConfigData.Instance.FloorTiles[(int)Random.Range(0, GameConfigData.Instance.FloorTiles.Length)], new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                        instance.transform.SetParent(Dungeon.transform.GetChild((int)Tiles.Floors).gameObject.transform);
                        _dungeonFloorPositions[i, j] = instance;
                        _dungeonTiles[i, j]          = 1;
                    }
                }
            }
        }
        else
        {
            DrawRooms(subDungeon.left);
            DrawRooms(subDungeon.right);
        }
    }
示例#9
0
    public void Drawtrashcan(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }
        if (subDungeon.IAmLeaf())
        {
            int x;
            int y;
            while (true)
            {
                x = (int)Random.Range(subDungeon.rect.x, subDungeon.rect.xMax);//현재 방 크기와 건물 크기에 맞춰 랜덤한 위치 선정
                y = (int)Random.Range(subDungeon.rect.y, subDungeon.rect.yMax);

                if (boardPositionsFloor[x, y].tag != building[0].tag)
                {
                    break;
                }
            }
            GameObject instance = Instantiate(trashcan, new Vector3(x, y, -1f), Quaternion.identity) as GameObject;
            instance.transform.SetParent(transform);
            thingPositionsFloor[x, y] = instance;
        }
        else
        {
            Drawtrashcan(subDungeon.left);
            Drawtrashcan(subDungeon.right);
        }
    }
示例#10
0
 public void DrawRooms(SubDungeon subDungeon)
 {
     if (subDungeon == null)
     {
         return;
     }
     if (subDungeon.IAmLeaf())
     {
         for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
         {
             for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
             {
                 GameObject instance = Instantiate(floorTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                 instance.transform.SetParent(transform);
                 boardPositionsFloor[i, j] = instance;
                 if (j == 5 && playerSpawned == false)
                 {
                     GameObject pObj = Instantiate(player, new Vector3(i + 3, j, 0f), Quaternion.identity) as GameObject;
                     playerSpawned             = true;
                     boardPositionsFloor[i, j] = pObj;
                 }
                 if (j == 7 && swordSpawned == false)
                 {
                     GameObject sObj = Instantiate(sword, new Vector3(i + 3, j, 0f), Quaternion.identity) as GameObject;
                     swordSpawned = true;
                     boardPositionsFloor[i, j] = sObj;
                 }
                 if (j == 30 && keySpawned == false)
                 {
                     GameObject kObj = Instantiate(key, new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                     keySpawned = true;
                     boardPositionsFloor[i, j] = kObj;
                 }
                 if (j == 32 && enemySpawned == false)
                 {
                     GameObject eObj = Instantiate(enemy, new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                     enemySpawned = true;
                     boardPositionsFloor[i, j] = eObj;
                 }
                 if (j >= 55 && flagSpawned == false)
                 {
                     GameObject fObj = Instantiate(flag, new Vector3(i + 5, j, 0f), Quaternion.identity) as GameObject;
                     flagSpawned = true;
                     boardPositionsFloor[i, j] = fObj;
                 }
             }
         }
     }
     else
     {
         DrawRooms(subDungeon.left);
         DrawRooms(subDungeon.right);
     }
 }
 public void ListRooms(SubDungeon root, List <SubDungeon> allRooms)
 {
     if (root.IAmLeaf())
     {
         Debug.Log("Added Room");
         allRooms.Add(root);
     }
     else
     {
         ListRooms(root.left, allRooms);
         ListRooms(root.right, allRooms);
     }
 }
示例#12
0
    public void DrawRoomWalls(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            //first we create holders for the rooms
            //room prefab
            GameObject  roomParent = Instantiate(_roomHolder, dungeonRoomsParent);
            DungeonRoom thisRoom   = new DungeonRoom(roomParent, dungeonRoomsParent.childCount, subDungeon.room);
            _dungeonRooms.Add(thisRoom);
            //wall holder of room prefab
            Transform roomWallHolder = roomParent.transform.GetChild(2);

            //room top walls
            for (int i = (int)subDungeon.room.x + 1; i < subDungeon.room.xMax - 1; i++)
            {
                DrawWall(dungeonWalls.top, i, (int)subDungeon.room.yMax - 1, roomWallHolder);
            }
            //room bottom walls
            for (int i = (int)subDungeon.room.x + 1; i < subDungeon.room.xMax - 1; i++)
            {
                DrawWall(dungeonWalls.bottom, i, (int)subDungeon.room.y, roomWallHolder);
            }
            //room left walls
            for (int i = (int)subDungeon.room.y + 1; i < subDungeon.room.yMax - 1; i++)
            {
                DrawWall(dungeonWalls.left, (int)subDungeon.room.x, i, roomWallHolder);
            }
            //room right walls
            for (int i = (int)subDungeon.room.y + 1; i < subDungeon.room.yMax - 1; i++)
            {
                DrawWall(dungeonWalls.right, (int)subDungeon.room.xMax - 1, i, roomWallHolder);
            }

            //room corner walls
            DrawWall(dungeonWalls.topLeftCorner, (int)subDungeon.room.x, (int)subDungeon.room.yMax - 1, roomWallHolder);
            DrawWall(dungeonWalls.topRightCorner, (int)subDungeon.room.xMax - 1, (int)subDungeon.room.yMax - 1, roomWallHolder);
            DrawWall(dungeonWalls.bottomLeftCorner, (int)subDungeon.room.x, (int)subDungeon.room.y, roomWallHolder);
            DrawWall(dungeonWalls.bottomRightCorner, (int)subDungeon.room.xMax - 1, (int)subDungeon.room.y, roomWallHolder);
        }
        else
        {
            DrawRoomWalls(subDungeon.leftDungeon);
            DrawRoomWalls(subDungeon.rightDungeon);
        }
    }
示例#13
0
 private void CreateBSP(SubDungeon subDungeon)
 {
     if (subDungeon.IAmLeaf())
     {
         if (subDungeon._rect.width > _maxRoomSize || subDungeon._rect.height > _maxRoomSize) // || Random.Range(0.0f, 1.0f) > 0.25)
         {
             if (subDungeon.Split(_minRoomSize, _maxRoomSize))
             {
                 CreateBSP(subDungeon._right);
                 CreateBSP(subDungeon._left);
             }
         }
     }
 }
示例#14
0
    // Szoba rajzolása
    public void DrawRooms(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }
        // ha a rész levél, akkor végigmegy rajza és lerak egységenként egy floorTilet
        if (subDungeon.IAmLeaf())
        {
            int typeOfRoom;
            typeOfRoom = Random.Range(0, 2);
            FurnishInterface furnisher;
            switch (typeOfRoom)
            {
            case 0:
                furnisher = new LampOnDesk();
                break;

            case 1:
                furnisher = new ChairBesideDesk();
                break;

            default:
                furnisher = new LampOnDesk();
                break;
            }
            furnisher.placeItems(subDungeon.room);
            GameObject lamp         = roomTemplates [Random.Range(0, 2)].lamp;
            Texture    floorTexture = roomTemplates[Random.Range(0, 3)].floorTexture;
            for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
            {
                for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
                {
                    //GameObject instance = Instantiate (floorTile, new Vector3 (i, j, 0f), Quaternion.Identity) as GameObject;
                    GameObject instance = Instantiate(floorTile, new Vector3(i, 0f, j), Quaternion.Euler(90, 0, 0)) as GameObject;
                    instance.GetComponent <MeshRenderer> ().material.mainTexture = floorTexture;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor [i, j] = instance;
                }
            }
            DrawWallsAround(subDungeon);
            //Instantiate(lamp,new Vector3((subDungeon.room.x+subDungeon.room.xMax)/2,0f,(subDungeon.room.y+subDungeon.room.yMax)/2),Quaternion.Euler(new Vector3(0,-90,0)));
        }
        else                            //ha nem levél, akkor halad tovább a gyerekeire
        {
            DrawRooms(subDungeon.left);
            DrawRooms(subDungeon.right);
        }
    }
示例#15
0
 public void CreateBSP(SubDungeon subDungeon)
 {
     if (subDungeon.IAmLeaf())
     {
         // Si el subdungeon es muy largo
         if (subDungeon.rect.width > maxRoomSize || subDungeon.rect.height > maxRoomSize || Random.Range(0.0f, 1.0f) > 0.25)
         {
             if (subDungeon.Split(minRoomSize, maxRoomSize))
             {
                 CreateBSP(subDungeon.left);
                 CreateBSP(subDungeon.right);
             }
         }
     }
 }
示例#16
0
 public void SpacePartition(SubDungeon subDungeon)
 {
     if (subDungeon.IAmLeaf())
     {
         //split subDungeon if it's large
         if (subDungeon.rectangle.width > _roomSideSize || subDungeon.rectangle.height > _roomSideSize)
         {
             if (subDungeon.Split(_roomSideSize))
             {
                 SpacePartition(subDungeon.leftDungeon);
                 SpacePartition(subDungeon.rightDungeon);
             }
         }
     }
 }
示例#17
0
 public void CreateBSP(SubDungeon subDungeon) // 트리 만들기
 {
     if (subDungeon.IAmLeaf())                //잎 노드일때
     {                                        //나눈 방이 많이 클 시
         if (subDungeon.rect.width > maxRoomSize ||
             subDungeon.rect.height > maxRoomSize ||
             Random.Range(0.0f, 1.0f) > 0.25)
         {
             if (subDungeon.Split(minRoomSize, maxRoomSize))
             {
                 CreateBSP(subDungeon.left);
                 CreateBSP(subDungeon.right);
             }
         }
     }
 }
示例#18
0
 public void CreateBSP(SubDungeon subDungeon)
 {
     if (subDungeon.IAmLeaf())                 // ha a rész levél
     //ha a rész magassága, vagy szélessége nagyobb mint a maximum megengedett
     {
         if (subDungeon.rect.width > maxRoomSize || subDungeon.rect.height > maxRoomSize || Random.Range(0.0f, 1.0f) > 0.25)
         {
             //szétválasztható
             if (subDungeon.Split(minRoomSize, maxRoomSize))
             {
                 //szétválasztani és meghívni a gyerekeire is
                 CreateBSP(subDungeon.left);
                 CreateBSP(subDungeon.right);
             }
         }
     }
 }
示例#19
0
    private void SpawnEnemies(SubDungeon subDungeon, int dungeonLevel)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            if (_enemySpawnData.Current <= _enemySpawnData.Max)
            {
                int minEnemyNumber         = (int)((subDungeon.room.width * subDungeon.room.height) / 8);
                int enemyNumberForThisRoom = Random.Range(minEnemyNumber, minEnemyNumber + 1);
                for (int i = 0; i < enemyNumberForThisRoom; i++)
                {
                    _randomPos = GetRandomPosInRoom(subDungeon.room);
                    // if the randomPos != invalidPos, then spawn the object
                    if (Vector3.Distance(_randomPos, _invalidPos) != 0)
                    {
                        int enemyIndex = 0;
                        do                                      // make sure that there is only one turret in a room
                        {
                            enemyIndex = (int)Random.Range(_enemyIndexes[dungeonLevel, 0], _enemyIndexes[dungeonLevel, 1] + 1);
                        } while (subDungeon.hasTurret && enemyIndex == 2);                                      // check if the room has a turret and new enemy is turret

                        GameObject instance = Instantiate(Enemies[enemyIndex], _randomPos, Quaternion.identity) as GameObject;
                        instance.transform.SetParent(Dungeon.transform.GetChild((int)Objects.Enemies).gameObject.transform);
                        _enemySpawnData.Current++;
                        _objectSpawnPos[(int)_randomPos.x, (int)_randomPos.y] = 1;
                        if (enemyIndex == 2)
                        {
                            subDungeon.hasTurret = true;
                        }
                    }
                }
            }
        }
        else
        {
            SpawnEnemies(subDungeon.left, dungeonLevel);
            SpawnEnemies(subDungeon.right, dungeonLevel);
        }
    }
    public void CreateBSP(SubDungeon subDungeon)
    {
        // Debug.Log("Splitting sub-dungeon " + subDungeon.debug + ": " + subDungeon.rect);
        if (subDungeon.IAmLeaf())
        {
            if (subDungeon.rect.width > minRoom || subDungeon.rect.height > minRoom)
            {
                if (subDungeon.Split(minRoom))
                {
                    // Debug.Log("Splitted sub-dungeon " + subDungeon.debug + " in "
                    //   + subDungeon.left.debug + ": " + subDungeon.left.rect + ", "
                    // + subDungeon.right.debug + ": " + subDungeon.right.rect);

                    CreateBSP(subDungeon.left);
                    CreateBSP(subDungeon.right);
                }
            }
        }
    }
示例#21
0
    private void CreateBSP(SubDungeon subDungeon)
    {
        //Debug.Log("Splitting sub-dungeon " + subDungeon.debugId + ": " + subDungeon.rect);
        if (subDungeon.IAmLeaf())
        {
            // if the subdungeon is too large
            if (subDungeon.rect.width > GameConfigData.Instance.MaxRoomSize || subDungeon.rect.height > GameConfigData.Instance.MaxRoomSize || Random.Range(0.0f, 1.0f) > 0.25)
            {
                if (subDungeon.Split(GameConfigData.Instance.MinRoomSize, GameConfigData.Instance.MaxRoomSize))
                {
                    //Debug.Log ("Splitted sub-dungeon " + subDungeon.debugId + " in " + subDungeon.left.debugId + ": " + subDungeon.left.rect + ", "
                    //+ subDungeon.right.debugId + ": " + subDungeon.right.rect);

                    CreateBSP(subDungeon.left);
                    CreateBSP(subDungeon.right);
                }
            }
        }
    }
示例#22
0
    public void CreateBSP(SubDungeon subDungeon)
    {
        Debug.Log("Splitting sub-dungeon " + subDungeon.debugId + ": " + subDungeon.rect);
        if (subDungeon.IAmLeaf())
        {
            if (subDungeon.rect.width > maxRoomSize ||
                subDungeon.rect.height > maxRoomSize ||
                Random.Range(0.0f, 1.0f) > 0.25)
            {
                if (subDungeon.Split(minRoomSize, maxRoomSize))
                {
                    Debug.Log("Splitted sub-dungeon " + subDungeon.debugId + " in "
                              + subDungeon.left.debugId + ": " + subDungeon.left.rect + ", "
                              + subDungeon.right.debugId + ": " + subDungeon.right.rect);

                    CreateBSP(subDungeon.left);
                    CreateBSP(subDungeon.right);
                }
            }
        }
    }
示例#23
0
 public void DrawRooms(SubDungeon subDungeon)
 {
     if (subDungeon == null)
     {
         return;
     }
     if (subDungeon.IAmLeaf())
     {
         for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
         {
             for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
             {
                 GameObject instance;
                 if (i == subDungeon.room.xMax - 1 || j == subDungeon.room.yMax - 1 || i == subDungeon.room.x || j == subDungeon.room.y)
                 {
                     //wall are created elsewhere
                     //instance = Instantiate(outerWallTile, new Vector3(i, j, 10f), Quaternion.identity);
                     instance = Instantiate(floorTile, new Vector3(i, j, 10f), Quaternion.identity);
                 }
                 else
                 {
                     if (playerSpawned == false)                         // spawn player on first tile
                     {
                         instance      = Instantiate(playerGameObj, new Vector3(i, j, 0f), Quaternion.identity);
                         playerSpawned = true;
                     }
                     instance = Instantiate(floorTile, new Vector3(i, j, 10f), Quaternion.identity);
                 }
                 instance.transform.SetParent(transform);
                 boardPositionsFloor[i, j] = instance;
             }
         }
     }
     else
     {
         DrawRooms(subDungeon.left);
         DrawRooms(subDungeon.right);
     }
 }
示例#24
0
    public void DrawRooms(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            for (int i = (int)subDungeon.room.x; i < subDungeon.room.xMax; i++)
            {
                for (int j = (int)subDungeon.room.y; j < subDungeon.room.yMax; j++)
                {
                    GameObject instance =
                        Instantiate(floorTile, new Vector3(i, j, 0f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, j] = instance;
                    RaycastHit2D hit = Physics2D.Raycast(new Vector2(i, j), new Vector2(i, j), 0);

                    //player
                    if (playerSpawn != 1)
                    {
                        if (hit.collider != null && hit.collider.gameObject.tag != "Wall")
                        {
                            Instantiate(Player,
                                        new Vector3(Convert.ToInt32((subDungeon.room.xMin + subDungeon.room.xMax) / 2), Convert.ToInt32((subDungeon.room.yMin + subDungeon.room.yMax) / 2), -1f), Quaternion.identity);
                            playerstartPos = new Vector2(Convert.ToInt32((subDungeon.room.xMin + subDungeon.room.xMax) / 2), Convert.ToInt32((subDungeon.room.yMin + subDungeon.room.yMax) / 2));
                            playerSpawn++;
                        }
                    }
                }
            }
        }
        else
        {
            DrawRooms(subDungeon.left);
            DrawRooms(subDungeon.right);
        }
    }
示例#25
0
 public void DrawRooms(SubDungeon subDungeon) // 주어진 공간에서 작은 방 만드는 함수
 {
     if (subDungeon == null)
     {
         return;
     }
     if (subDungeon.IAmLeaf()) // 잎 노드면 공간이 충분히 나눠 졌으므로 방 생성 시작
     {
         for (int i = (int)subDungeon.rect.x; i < subDungeon.rect.xMax; i++)
         {
             for (int j = (int)subDungeon.rect.y; j < subDungeon.rect.yMax; j++)
             {
                 GameObject instance = Instantiate(floorTile, new Vector3(i, j, 1f), Quaternion.identity) as GameObject;
                 instance.transform.SetParent(transform);
                 boardPositionsFloor[i, j] = instance;
             }
         }
     }
     else
     {
         DrawRooms(subDungeon.left);
         DrawRooms(subDungeon.right);
     }
 }
示例#26
0
    private void DrawRoom(SubDungeon subDungeon)
    {
        if (subDungeon == null)
        {
            return;
        }

        if (subDungeon.IAmLeaf())
        {
            obstacleList = new List <Coord>();
            // _room 좌표를 얻어와 장애물 생성에 필요한 좌표를 만들어 준다.
            for (int x = (int)subDungeon._room.x + 1; x < subDungeon._room.xMax - 1; ++x)
            {
                for (int y = (int)subDungeon._room.y + 1; y < subDungeon._room.yMax - 1; ++y)
                {
                    obstacleList.Add(new Coord(x, y));
                }
            }

            shuffledArray = new Queue <Coord>(Helper.SuffleArray(obstacleList.ToArray(), seed));

            // 장애물 생성
            int obstacleCount = 0;
            for (int i = 0; i < obstacleCount; ++i)
            {
                Coord      randomCoord = GetRandomCoord(shuffledArray);
                Vector3    position    = new Vector3(randomCoord._x, .5f, randomCoord._y);
                GameObject obstacle    = Instantiate(_obstaclePrefab, position, Quaternion.identity);
            }


            // 노드 생성
            for (int x = (int)subDungeon._room.x; x < subDungeon._room.xMax; ++x)
            {
                for (int y = (int)subDungeon._room.y; y < subDungeon._room.yMax; ++y)
                {
                    Node room = Instantiate(tile, new Vector3(x, 0, y), Quaternion.Euler(0, 0, 0), transform.Find("Node"));
                    //room.transform.SetParent(transform);
                    room.name = room.name + "||" + x + "::" + y;
                    room.SetNodeType(NodeType.None);
                    SetNodeType(room);
                    room.SetNode(x, y);
                    nodes[x, y] = room;
                }
            }

            // 적 생성
            if (totalCount < 15)
            {
                for (int i = 0; i < 1; ++i)
                {
                    Coord   randomCoord = GetRandomCoord(shuffledArray);
                    Vector3 position    = new Vector3(randomCoord._x, 0, randomCoord._y);
                    Enemy   enemy       = Instantiate(_enemyPrefab, position, Quaternion.identity, transform.Find("Enemy"));
                }
                ++totalCount;
            }

            if (_hereStart == false)
            {
                _hereStart = true;

                Coord   pos      = GetRandomCoord(shuffledArray);
                Vector3 position = new Vector3(pos._x, 0, pos._y);
                Player  player   = Instantiate(_playerPrefab, position, Quaternion.identity);
            }
            else if (_hereEnd == false)
            {
                _hereEnd = true;

                Coord      pos      = GetRandomCoord(shuffledArray);
                Vector3    position = new Vector3(pos._x, 1, pos._y);
                GameObject end      = Instantiate(_endPrefab, position, Quaternion.identity);
            }
        }
        else
        {
            DrawRoom(subDungeon._left);
            DrawRoom(subDungeon._right);
        }
    }
示例#27
0
    //Отрисовка комнат
    private void DrawRooms(SubDungeon subdungeon)
    {
        if (subdungeon == null)
        {
            return;
        }

        if (subdungeon.IAmLeaf())
        {
            GameObject toInstantiate;
            for (int i = (int)subdungeon.room.x; i < subdungeon.room.xMax; i++)
            {
                for (int j = (int)subdungeon.room.y; j < subdungeon.room.yMax; j++)
                {
                    toInstantiate = RandomTile(tiles[activeTileset].floorTiles, 0.15f);

                    if (i == subdungeon.room.x || i == subdungeon.room.xMax - 1 ||
                        j == subdungeon.room.y || j == subdungeon.room.yMax - 1)
                    {
                        if (i == subdungeon.room.xMax - 1)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[2];
                        }
                        else if (i == subdungeon.room.x)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[6];
                        }
                        else if (j == subdungeon.room.y)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[4];
                        }
                        else if (j == subdungeon.room.yMax - 1)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[0];
                        }


                        if (i == subdungeon.room.xMax - 1 && j == subdungeon.room.yMax - 1)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[1];
                        }
                        else if (i == subdungeon.room.xMax - 1 && j == subdungeon.room.y)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[3];
                        }
                        else if (i == subdungeon.room.x && j == subdungeon.room.y)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[5];
                        }
                        else if (i == subdungeon.room.x && j == subdungeon.room.yMax - 1)
                        {
                            toInstantiate = tiles[activeTileset].wallTiles[7];
                        }

                        CreateAt(i, j, toInstantiate);
                    }
                    else
                    {
                        if (i > subdungeon.room.x + 1 && i < subdungeon.room.xMax - 2 &&
                            j > subdungeon.room.y + 1 && j < subdungeon.room.yMax - 2)
                        {
                            freePositions.Add(new Vector2Int(i, j));
                        }
                        GameObject instance = CreateAt(i, j, toInstantiate);
                        RandomRotation(instance);
                    }
                }
            }
        }
        else
        {
            DrawRooms(subdungeon.left);
            DrawRooms(subdungeon.right);
        }
    }
示例#28
0
    public void DrawBuilding(SubDungeon subDungeon) //건물 생성 함수
    {
        hashClear();                                //건물 배치가 안되는(너무작은)방일 경우 빠져나가기 위한 해시 배열 초기화
        int  buildChoice;                           //랜덤 건물 선택 변수
        Rect buildSize;                             //현재 건물의 사이즈 표시
        bool isfull = false;                        //사이즈가 안되는 건물 표시
        int  num    = 0;

        if (subDungeon == null)
        {
            return;
        }
        if (subDungeon.IAmLeaf())
        {
            while (true)//방 사이즈와 건물 사이즈가 맞는지 검사
            {
                num         = 0;
                buildChoice = Random.Range(0, building.Length);//건물 번호 랜덤 생성
                if (buildHash[buildChoice] > 0)
                {
                    continue;                                                          //이미 선택된 건물일 경우 다시 검사
                }
                buildHash[buildChoice]++;                                              //현재 건물 번호의 해시 배열 증가 (예) 1번 건물 생성시 hash[1] 1증가
                buildSize = building[buildChoice].GetComponent <RectTransform>().rect; //건물 사이즈 저장
                if (buildSize.width < subDungeon.rect.width && buildSize.height / 2 < subDungeon.rect.height)
                {
                    break;                                                                                        //방의 크기에 건물이 들어가면 검사 종료
                }
                for (int i = 0; i < buildHash.Length; i++)
                {
                    if (buildHash[i] == 0)
                    {
                        num++;                   //해시 배열 검사
                    }
                }
                if (num > 0)
                {
                    continue;         //아직 모든 건물 확인하지 않았을 시 다시 검사
                }
                if (num == 0)
                {
                    isfull = true;//모든 건물을 검사했다면 검사 종료
                    break;
                }
            }
            if (!isfull)                                                                              //방 사이즈에 맞는 건물이 있을 경우
            {
                int x = (int)Random.Range(subDungeon.rect.x, subDungeon.rect.xMax - buildSize.width); //현재 방 크기와 건물 크기에 맞춰 랜덤한 위치 선정
                int y = (int)Random.Range(subDungeon.rect.y, subDungeon.rect.yMax - buildSize.height / 2);

                GameObject instance = Instantiate(building[buildChoice], new Vector3(x, y, 0f), Quaternion.identity) as GameObject;
                instance.transform.SetParent(transform);
                for (int i = x; i < (int)buildSize.width + x; i++)//위치 배열에 건물 정보 추가
                {
                    for (int j = y; j < (int)buildSize.height / 2 + y; j++)
                    {
                        boardPositionsFloor[i, j] = instance;
                    }
                }
            }
        }
        else
        {
            DrawBuilding(subDungeon.left);
            DrawBuilding(subDungeon.right);
        }
    }
示例#29
0
 public void DrawLamp(SubDungeon subDungeon)//가로등 생성 함수
 {
     if (subDungeon == null)
     {
         return;
     }
     if (!subDungeon.IAmLeaf())
     {
         string rname, buildname, tname;//차도, 건물, 가로등이 같은 구역에 있는지 확인할 변수
         rname     = vertTile[0].tag;
         buildname = building[0].tag;
         tname     = streetLamp.tag;
         if (subDungeon.isline == 1)                                                        //가로로 나눴을 경우
         {
             for (int i = (int)subDungeon.line.x; i < subDungeon.line.xMax; i++)            // y값 고정 후 x값을 1씩 올려 길을 만듦
             {
                 if (i % lampNum == 0)                                                      // 가로등을 위 아래 교차해서 생성.
                 {
                     string bname = boardPositionsFloor[i, (int)subDungeon.line.y - 1].tag; //현재 좌표
                     if (bname != rname && bname != tname && bname != buildname)            // 현제 좌표에 도로, 건물, 같은 가로등이 있는가?
                     {
                         GameObject instance = Instantiate(streetLamp, new Vector3(i, subDungeon.line.y - 1, -2), Quaternion.identity) as GameObject;
                         if (!IsNear(instance, lampNum)) // 현재 생성된 가로등의 주위에 다른 가로등이 있는가?
                         {
                             instance.transform.SetParent(transform);
                             thingPositionsFloor[i, (int)subDungeon.line.y - 1] = instance;
                         }
                         else
                         {
                             Destroy(instance);
                         }
                     }
                 }
                 if (i % lampNum == (int)(lampNum / 2))// 가로등을 위 아래 교차해서 생성.
                 {
                     string bname = boardPositionsFloor[i, (int)subDungeon.line.y + 8].tag;
                     if (bname != rname && bname != tname && bname != buildname)
                     {
                         GameObject instance = Instantiate(streetLamp, new Vector3(i, subDungeon.line.y + 8, -2), Quaternion.identity) as GameObject;
                         if (!IsNear(instance, lampNum))
                         {
                             instance.transform.SetParent(transform);
                             thingPositionsFloor[i, (int)subDungeon.line.y + 8] = instance;
                         }
                         else
                         {
                             Destroy(instance);
                         }
                     }
                 }
             }
         }
         else if (subDungeon.isline == 2)                                        //세로로 나눴을 경우
         {
             for (int i = (int)subDungeon.line.y; i < subDungeon.line.yMax; i++) //x값 고정 후 y값을 1씩 올려 길을 만듦
             {
                 if (i % lampNum == 0)                                           //가로등을 좌우로 배치
                 {
                     string bname = boardPositionsFloor[(int)subDungeon.line.x - 1, i].tag;
                     if (bname != rname && bname != tname && bname != buildname)
                     {
                         GameObject instance = Instantiate(streetLamp, new Vector3(subDungeon.line.x - 1, i, -2), Quaternion.identity) as GameObject;
                         if (!IsNear(instance, lampNum))
                         {
                             instance.transform.SetParent(transform);
                             thingPositionsFloor[(int)subDungeon.line.x - 1, i] = instance;
                         }
                         else
                         {
                             Destroy(instance);
                         }
                     }
                 }
                 if (i % lampNum == (int)(lampNum / 2))//가로등을 좌우로 배치
                 {
                     string bname = boardPositionsFloor[(int)subDungeon.line.x + 8, i].tag;
                     if (bname != rname && bname != tname && bname != buildname)
                     {
                         GameObject instance = Instantiate(streetLamp, new Vector3(subDungeon.line.x + 8, i, -2), Quaternion.identity) as GameObject;
                         if (!IsNear(instance, lampNum))
                         {
                             instance.transform.SetParent(transform);
                             thingPositionsFloor[(int)subDungeon.line.x + 8, i] = instance;
                         }
                         else
                         {
                             Destroy(instance);
                         }
                     }
                 }
             }
         }
     }
     DrawLamp(subDungeon.left);
     DrawLamp(subDungeon.right);
 }
示例#30
0
    public void DrawLines(SubDungeon subDungeon) //길 까는 함수
    {
        if (subDungeon == null)
        {
            return;
        }
        if (!subDungeon.IAmLeaf())                                                  // 서브 던전 클래스에 있는 라인에 대한 정보를 이용하여 길을 그림. 방을 나누지 않았으면(즉 잎 노드이면) 이 정보가 없음.
        {
            if (subDungeon.isline == 1)                                             //가로로 나눴을 경우
            {
                for (int i = (int)subDungeon.line.x; i < subDungeon.line.xMax; i++) // y값 고정 후 x값을 1씩 올려 길을 만듦
                {
                    GameObject instance = Instantiate(horiTile[0], new Vector3(i, subDungeon.line.y, 1f), Quaternion.Euler(0, 180, 180)) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y] = instance;

                    instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 1, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y + 1] = instance;

                    instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 2, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y + 2] = instance;

                    instance = Instantiate(horiTile[2], new Vector3(i, subDungeon.line.y + 3, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y + 3] = instance;

                    instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 4, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y + 4] = instance;

                    instance = Instantiate(horiTile[1], new Vector3(i, subDungeon.line.y + 5, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y + 5] = instance;

                    instance = Instantiate(horiTile[0], new Vector3(i, subDungeon.line.y + 6, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[i, (int)subDungeon.line.y + 6] = instance;
                }
            }
            else if (subDungeon.isline == 2)                                        //세로로 나눴을 경우
            {
                for (int i = (int)subDungeon.line.y; i < subDungeon.line.yMax; i++) //x값 고정 후 y값을 1씩 올려 길을 만듦
                {
                    GameObject instance = Instantiate(vertTile[0], new Vector3(subDungeon.line.x, i, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x, i] = instance;

                    instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 1, i, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x + 1, i] = instance;

                    instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 2, i, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x + 2, i] = instance;

                    instance = Instantiate(vertTile[2], new Vector3(subDungeon.line.x + 3, i, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x + 3, i] = instance;

                    instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 4, i, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x + 4, i] = instance;

                    instance = Instantiate(vertTile[1], new Vector3(subDungeon.line.x + 5, i, 1f), Quaternion.identity) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x + 5, i] = instance;

                    instance = Instantiate(vertTile[0], new Vector3(subDungeon.line.x + 6, i, 1f), Quaternion.Euler(180, 0, 180)) as GameObject;
                    instance.transform.SetParent(transform);
                    boardPositionsFloor[(int)subDungeon.line.x + 6, i] = instance;
                }
            }
            Vehicle(subDungeon);
        }

        DrawLines(subDungeon.left);  // 길을 그린 후 다음 방의 길 연결
        DrawLines(subDungeon.right); // 왼쪽 노드 그린 후 오른쪽 노드 길 연결
    }