Помощь Улучшение создания карт

Недавно я впервые попытался внедрить систему генерации карт, и хотя она работает, она не работает точно так же, как я хочу, но я не уверен, какие изменения я могу сделать он генерирует тип карты, которую я хочу.

Это мой код генерации карты

///<summary>Generates a Room at a Start Position</summary>
    void GenerateMap(Vector2 roomStartPos)
    {
        Vector2 startPos = roomStartPos;

        int roomTileNum = random.Next(minRoomTiles, maxRoomTiles);
        for (int i = 0; i < roomTileNum; i++)
        {
            if (CheckTilePosValid(startPos)) //Checks if a position is taken by a tile already
            {
                Tile newTile = CreateTile(startPos); //Creates a Tile at a passed in Position
                startPos = GetRandomEdgeDirection(newTile.SpritePosition); //Gets a Random position next to the passed in Position

            }
            else
            {
                startPos = GetRandomEdgeDirection(startPos);
                i--;
            }
        }
    }

Скорее всего, это очень плохой способ создания карты. Он в основном получает случайное количество плиток для генерации, затем он кладет плитку в исходное положение и выбирает новое положение в случайном направлении (вверх, вниз, влево, вправо). Затем он поместит новую плитку в указанную новую позицию, затем будет просто прокручивать ее до тех пор, пока она не будет помещена в каждую плитку. Функция «CheckTilePosValid ()» используется для определения того, была ли полученная случайная позиция уже занята плиткой. Если позиция не будет выполнена, она создаст плитку и продолжит цикл, а если позиция будет занята, то она получит новую позицию и в основном продолжит делать это, пока не получит позицию, которая еще не была принята.

Это создает такие карты: введите описание изображения здесь

 введите описание изображения здесь>> </a> </p>

<p> Проблема в основном связана с первым изображением, поскольку, как вы можете видеть, карта очень растянута, что не то, что я хочу. Я бы хотел, чтобы карта была похожа на второе изображение, плитки намного ближе друг к другу и не так растянуты, но все равно достаточно случайны. </p>

<p> Я просто не знаю, как именно я могу это достичь, поэтому мне было интересно, сможет ли кто-нибудь помочь мне? Нужно ли мне полностью перерабатывать систему моего поколения или я могу просто внести простые изменения, чтобы исправить это?
Я очень благодарен за помощь:) </p></body></html>

4 голоса | спросил codelyoko373 5 Mayam18 2018, 04:06:32

1 ответ


1

Вы можете рассмотреть другой подход, когда вы размещаете некоторое количество узлов на своей карте, а затем присоединяете их вместе через коридоры. Это позволит вам создавать ваши комнаты в подходящих размерах, потому что вы будете фокусироваться на комнатах, а не на поколении.

Если вы ищете «Dead end», я бы просто использовал один из следующих двух вариантов:

  • Создайте несколько 0x0 комнат.

  • Создайте мертвые узлы (в основном такие же, как и выше, но один из них является особым случаем, а другой - взломом.)

Вы можете начать с ваших узлов, создать свои комнаты, а затем найти A * путь между вашими комнатами для вас. В любом случае, я думаю, этого достаточно, чтобы заставить ваш мозг двигаться.

EDIT: Я только что понял, что ответил на ваш родственный вопрос: Генерация базовой случайной черепицы

Извиняется, что этот совет несколько противоречит моему предыдущему совету, поскольку мое предыдущее было предположено, что вы не хотели «коридоров».

В любом случае оба совета зависят от создания комнаты , затем , связанной с дополнительной рандомизацией. Я бы буквально имел класс комнаты, что-то вроде:

class Room
{
    int width, height;
    Point TopLeftCorner;
    public static Room Generate()
    {
        Room room = new Room();
        Random rnd = new Random(/*timestamp or seed*/);

        // get our dimensions
        room.height = rnd.Next(2,6);
        room.width = rnd.Next(2,6);

        // create a point where the room can exist without hitting the edge
        TopLeftCorner = new Point(
                            rnd.Next(0,screenWidth-room.width),
                            rnd.Next(0,screenHeight-room.height));

        room.BuildRoom(); // where you place your tiles
    }

    void Buildroom()
    {
        //pseudo code cause I'm lazy
        for i in width
            for j in height
                placeTile(i,j)
    }

    // approximates center of room
    public Point RoomNode()
    {
        Point returnpt = new Point(width >> 1, height >> 1);
    }
}

После этого оставшийся код будет касаться выбора сторон, с которыми вы хотите соединиться с прихожей, а затем с помощью другой функции генерации, чтобы прокладывать плитки между комнатами.

ответил blurry 5 Mayam18 2018, 05:12:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132