Новичок здесь, нужна помощь, чтобы сделать «действие» всего один раз

#c#

Вопрос:

У меня есть код игры, он работает и выполняет: * Создает одно животное в плитке пола, когда плитка принята, но выполняет все принятые плитки. Я хочу, чтобы скрипт делал это только один раз, вот код:

 public static void Generate( Rectangle2D region )
    {
        int OakTree = 0x12B9;
        
        for ( int rx = 0; rx < region.Width;   rx )
        {
            for ( int ry = 0; ry < region.Height;   ry )
            {
                int vx = rx   region.X;
                int vy = ry   region.Y;

                StaticTile[] tiles = m_Map.Tiles.GetStaticTiles( vx, vy );

                for ( int i = 0; i < tiles.Length;   i )
                {
                    StaticTile tile = tiles[i];

                    int id = tile.ID;
                    id amp;= 0x3FFF;
                    int z = tile.Z;

                    if ( IsRock( id ) )
                    {
                        AddAnimalSpawner( vx   1, vy, z );
                    }
                }
            }
        }
    }
 

Каков правильный способ сделать это только один раз?Я думаю, что проблема в том for ( int i = 0; i < tiles.Length; i ) .
Спасибо!

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

1. Если вы хотите сделать это только один раз, почему бы вам просто не выйти: for ( int i = 0; i < tiles . Длина; i) ???

Ответ №1:

Если я правильно вас понял, вы хотите вызвать AddAnimalSpawner только один раз.

Вы можете просто использовать break ключевое слово. (https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/keywords/break ), чтобы вернуться к внешним циклам или return выйти из Generate(Rectangle2D region) функции.

Пример:

 for ( int i = 0; i < tiles.Length;   i )
{
    StaticTile tile = tiles[i];
 
    int id = tile.ID;
    id amp;= 0x3FFF;
    int z = tile.Z;

    if ( IsRock( id ) )
    {
        AddAnimalSpawner( vx   1, vy, z );
        break;
    }
}
 

или

 for ( int i = 0; i < tiles.Length;   i )
{
    StaticTile tile = tiles[i];
 
    int id = tile.ID;
    id amp;= 0x3FFF;
    int z = tile.Z;

    if ( IsRock( id ) )
    {
        AddAnimalSpawner( vx   1, vy, z );
        return;
    }
}
 

Ответ №2:

Как вы уже упоминали: вы получаете коллекцию плиток (вызывая GetStaticTiles), а затем добавляете животное ко всем из них после проверки того, что плитка является камнем (я предполагаю, что это связано с другими типами плиток, такими как вода, где животное нельзя поместить, верно?). Чтобы сделать это только один раз, вам нужно прервать for look после добавления animal в первый раз. Здесь у вас есть несколько вариантов. Один из них — переписать ваш код, чтобы лучше описать, что вы делаете, но более простым вариантом, который у вас есть, может быть просто установить

 i = tiles.Length;
 

после вызова AddAnimalSpawner. Это завершит цикл for на следующей итерации (т. Е. Почти Сразу) после размещения только одного животного.

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