コード例 #1
0
    //draw generated map in Unity. This is before we replace some walls with decorative walls and some floors with painted floors
    void GenerateUnityMap()
    {
        for (int x = 1; x < width - 1; x++)
        {
            for (int y = 1; y < height - 1; y++)
            {
                GameObject t;
                if (levelMap[x, y] == true)   // if wall
                // case 1: this is non-terminating piece of a horizontal wall
                {
                    if (levelMap[x + 1, y] == true && levelMap[x - 1, y] == true && levelMap[x, y + 1] == false && levelMap[x, y - 1] == false)
                    {
                        t = Instantiate(wallTile_twoNeighbors_opposite, new Vector3(x, y, 0), Quaternion.identity);
                    }
                    // case 2: non-terminatin piece of vertical wall
                    else if (levelMap[x + 1, y] == false && levelMap[x - 1, y] == false && levelMap[x, y + 1] == true && levelMap[x, y - 1] == true)
                    {
                        t = Instantiate(wallTile_twoNeighbors_opposite, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 90));
                    }
                    // case 3: end piece, wall on left
                    else if (levelMap[x + 1, y] == true && levelMap[x - 1, y] == false && levelMap[x, y + 1] == false && levelMap[x, y - 1] == false)
                    {
                        t = Instantiate(wallTile_threeNeighbors, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 180));
                    }
                    // case 4: end piece, wall on right
                    else if (levelMap[x + 1, y] == false && levelMap[x - 1, y] == true && levelMap[x, y + 1] == false && levelMap[x, y - 1] == false)
                    {
                        t = Instantiate(wallTile_threeNeighbors, new Vector3(x, y, 0), Quaternion.identity);
                    }
                    // case 5: end piece, wall on top
                    else if (levelMap[x + 1, y] == false && levelMap[x - 1, y] == false && levelMap[x, y + 1] == true && levelMap[x, y - 1] == false)
                    {
                        t = Instantiate(wallTile_threeNeighbors, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 270));
                    }
                    // case 6: end piece, wall on bottom
                    else if (levelMap[x + 1, y] == false && levelMap[x - 1, y] == false && levelMap[x, y + 1] == false && levelMap[x, y - 1] == true)
                    {
                        t = Instantiate(wallTile_threeNeighbors, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 90));
                    }
                    // Only one neighboring floor, which is at top
                    else if (levelMap[x + 1, y] == true && levelMap[x - 1, y] == true && levelMap[x, y + 1] == false && levelMap[x, y - 1] == true)
                    {
                        t = Instantiate(wallTile_oneNeighbor, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 180));
                        //string wallName = "wall " + x + ", " + y;
                        //t.transform.name = wallName;
                    }
                    // Only one neighboring floor, which is at botton
                    else if (levelMap[x + 1, y] == true && levelMap[x - 1, y] == true && levelMap[x, y + 1] == true && levelMap[x, y - 1] == false)
                    {
                        t = Instantiate(wallTile_oneNeighbor, new Vector3(x, y, 0), Quaternion.identity);
                    }
                    // Only one neighboring floor, which is at right
                    else if (levelMap[x + 1, y] == false && levelMap[x - 1, y] == true && levelMap[x, y + 1] == true && levelMap[x, y - 1] == true)
                    {
                        t = Instantiate(wallTile_oneNeighbor, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 90));
                    }
                    // Only one neighboring floor, which is at right
                    else if (levelMap[x + 1, y] == true && levelMap[x - 1, y] == false && levelMap[x, y + 1] == true && levelMap[x, y - 1] == true)
                    {
                        t = Instantiate(wallTile_oneNeighbor, new Vector3(x, y, 0), Quaternion.Euler(0, 0, 270));
                    }
                    else
                    {
                        t = Instantiate(wallTile_plain, new Vector3(x, y, 0), Quaternion.identity);
                    }
                    string wallName = "wall " + x + ", " + y;
                    t.transform.name   = wallName;
                    t.transform.parent = tilesHolderInstance.transform;
                }
                else if (levelMap[x, y] == false)   // if floor
                {
                    t = Instantiate(floorCell, new Vector3(x, y, 0), Quaternion.identity);
                    //t.transform.parent = tilesHolderInstance.transform;
                    string floorName = "floor " + x + ", " + y;
                    t.transform.name   = floorName;
                    t.transform.parent = tilesHolderInstance.transform;
                }
            }
        }

        // put a few patches of dirt down lmao
        int dirtCount = 0;

        while (dirtCount < floorDecorations)
        {
            int dirtX = rand.getRandint(2, width - 4), dirtY = rand.getRandint(2, height - 5);
            if (
                levelMap[dirtX, dirtY] == false &&
                levelMap[dirtX, dirtY + 1] == false &&
                levelMap[dirtX + 1, dirtY] == false &&
                levelMap[dirtX + 1, dirtY + 1] == false &&
                levelMap[dirtX + 2, dirtY] == false &&
                levelMap[dirtX + 2, dirtY + 1] == false
                )
            {
                dirtCount++;
                GameObject d = Instantiate(floorDecor_dirt, new Vector3(dirtX, dirtY, 0), Quaternion.identity);
                d.transform.parent = tilesHolderInstance.transform;
            }
        }


        // draw top and bottom wall
        for (int x = 0; x < width; x++)
        {
            GameObject bWall = Instantiate(wallTile_bot, new Vector3(x, 0, 0), Quaternion.identity);
            GameObject tWall = Instantiate(wallTile_top, new Vector3(x, height - 1, 0), Quaternion.identity);
            string     bName = "bottom wall " + x;
            string     tName = "top wall" + x;
            bWall.transform.name   = bName;
            tWall.transform.name   = tName;
            bWall.transform.parent = tilesHolderInstance.transform;
            tWall.transform.parent = tilesHolderInstance.transform;
        }

        // draw left and right wall
        // We don't draw over the bottom walls drawn at corners so we start counting from y=1
        for (int y = 1; y < height; y++)
        {
            GameObject lWall = Instantiate(wallTile_side, new Vector3(0, y, 0), Quaternion.Euler(0, 0, 180));
            GameObject rWall = Instantiate(wallTile_side, new Vector3(width - 1, y, 0), Quaternion.identity);
            string     lName = "left wall" + y;
            string     rName = "right wall" + y;
            lWall.transform.name   = lName;
            rWall.transform.name   = rName;
            lWall.transform.parent = tilesHolderInstance.transform;
            rWall.transform.parent = tilesHolderInstance.transform;
        }

        // finally lay down some enemies and some potions
        if (currentLevel >= minLevel_ghost)
        {
            spawnObject(ghost, enemyHolderInstance, 1, mobGhosts);
        }
        if (currentLevel >= minLevel_wizard)
        {
            spawnObject(wizard, enemyHolderInstance, 1, mobWizards);
        }
        if (currentLevel >= minLevel_ogre)
        {
            spawnObject(ogre, enemyHolderInstance, 2, mobOgres);
        }

        spawnObject(healthPotion, potionsHolderInstance, 1, healthPotions);
        spawnObject(manaPotion, potionsHolderInstance, 1, manaPotions);
    }