Я создаю местность, которая перекрывается, хотя и не должна

#c# #class #random #monogame

#c# #класс #Случайный #моногейм

Вопрос:

Я создаю простой платформер в MonoGame с процедурно сгенерированными островами в качестве местности. У меня есть 4 важных класса: AllIslands, Islands, Ground и GroundBlocks. AllIslands — это класс, который управляет островами и вызывает их процедурную генерацию. Islands — это класс, который создает остров со случайной длиной и положением. Ground — это класс, который управляет и создает ряды наземных блоков.

Я пытаюсь сгенерировать острова с пространством между ними, для этого я использую переменную RightXOfLastIsland , эта переменная содержит крайнее правое значение X острова. Я смотрю на RightXOfLastIsland, а затем добавляю к нему случайную величину для определения положения нового острова. Моя проблема в том, что острова перекрываются, и я понятия не имею, почему.

 class AllIslands
{
    public List<Island> ListOfIslands = new List<Island>(0);
    public int RightXOfLastIsland = 0;

    public AllIslands()
    {

    }

    public void CreateIsland(Ground ground)
    {
        if (ListOfIslands.Count > 0)
        {
            Island previousIsland = ListOfIslands[ListOfIslands.Count - 1];
            RightXOfLastIsland = previousIsland.RightXOfLastIsland;
        }
        Island island = new Island(ground, RightXOfLastIsland);
        ListOfIslands.Add(island);
    }
    public void ProcedurallySpawnIslands(Player player, Ground ground)
    {
        if (player.Position.X > RightXOfLastIsland - 200)
        {
            CreateIsland(ground);
        }
    }
}

class Island
{
    public int RightXOfLastIsland;

    public Island(Ground ground, int rightXOfLastIsland)
    {
        RightXOfLastIsland = rightXOfLastIsland;

        Random random = new Random();

        int tempRightX = RightXOfLastIsland / 100;

        int locationX = random.Next(tempRightX   5, tempRightX   10);
        int locationY = random.Next(5, 9);
        int lengthRowOfBlocks = random.Next(5, 10);

        Vector2 location = new Vector2(locationX * 100, locationY * 100);

        ground.CreateGroundBlocks(location, lengthRowOfBlocks);

        RightXOfLastIsland = RightXOfLastIsland   (lengthRowOfBlocks * 100);
    }
}
 

Комментарии:

1. Местоположение Vector2 содержит значение x для LeftX для вновь созданного острова, верно? Если это так, вы не добавляете его значение в RightXOfLastIsland в последней строке, кроме предыдущего значения и длины блоков? Вы пробовали рисовать / рисовать это на листе бумаги?