Я пытаюсь устроить взрыв бомбардировщика в своем клоне бомбардировщика. У меня есть все необходимые классы, реализованные в игре, такие как Player, Tilemap, Bomb, Grass, Stone и т. Д. Однако мне трудно остановить / остановить взрыв после того, как он попадает в блок. Под этим я подразумеваю, что взрыв (иногда) продолжается даже после того, как он попадает в столкнувшуюся плитку (камень, ящик и т. Д.).

Что я наделал?

Как я уже говорил выше, я не делал рекурсивного взрыва. Вместо этого я выбрал другой подход.

Я сделал два класса: класс огня и класс взрыва. Класс Fire - это взрыв на одной конкретной плитке. Итак, если я установлю объект Fire на (1,1) в сетке Tilemap. Он взорвется только на этой конкретной плитке. Класс огня проверяет наличие столкновений в своей функции Update (). Если он обнаруживает коллизию, он устанавливает для HasHitWall значение true.

Класс Explosion прост, но я не могу заставить его работать должным образом. Класс Explosion содержит список экземпляров Fire . Эти экземпляры Fire устанавливаются в конструкторе:

fires = new List<Fire>();
int counter = 1;

for (int x = 0; x < length * 4; x+=4) {
    fires.Add(new Fire(position + new Vector2(-Tile.tileSize.X * counter * InGameScreen.scale,0)));   //Left;
    fires.Add(new Fire(position + new Vector2(Tile.tileSize.X * counter * InGameScreen.scale, 0)));   //Right;
    fires.Add(new Fire(position + new Vector2(0, -Tile.tileSize.Y * counter * InGameScreen.scale)));   //Up;
    fires.Add(new Fire(position + new Vector2(0,Tile.tileSize.Y * counter * InGameScreen.scale)));   //Down;

    counter++;
}

В цикле for есть четыре разных огня, идущих в разных направлениях. Я прокомментировал, в каком направлении они движутся.

Первый объект Fire, инициализированный в конструкторе, - это огонь, идущий в левом направлении. Этот объект Fire имеет индекс 0, так как он помещается первым в списке. Когда добавляется следующий слева заголовок огненного объекта, он будет иметь индекс 4. Следующий за ним будет иметь индекс 8 и так далее.

Я вижу образец того, что существует разница в четыре индекса между каждым огнем в одном направлении. Чтобы уточнить, первый объект Fire, идущий влево, имеет индекс 0, следующий объект Fire, идущий влево, будет иметь индекс 4 и так далее.

Я использовал эту концепцию в функции Update (), где я пытаюсь удалить все объекты огня в одном направлении после столкновения огня с плиткой.

for (int x = 0; x < fires.Count; x++) {
    fires[x].Update(gameTime);

    if (fires[x].HasHitWall == true) {
        for (int i = x; i < fires.Count; i += 4) {
            fires.RemoveAt(i);
        }
    }
}

Однако это не работает, он удаляет объекты огня повсюду. Мне нужна помощь в решении этой проблемы. Как я могу убрать все огни в одном направлении после того, как конкретный огонь столкнулся с плиткой?

Это может быть расплывчатый и трудный для понимания вопрос, однако я не знаю, как объяснить его по-другому.

Изображение того, что происходит:

Pictue of the issue

В чем может быть проблема?

Я думал, что проблема может заключаться в том, что я использую список. Однако я попробовал это с массивом, и это тоже не сработало. Индексы должны быть там, где они есть. Если индекс 4 удален, то индекс 5 не может стать индексом 4. Он должен оставаться индексом 5.

0
DubstepZedd 9 Фев 2021 в 11:54

1 ответ

Лучший ответ

Хочу заявить, что решил эту проблему благодаря @PallarDue и @NicoSchertler.

Мне пришлось реорганизовать свой код и немного поиграть, но, наконец, он заработал. Я постараюсь подвести итоги.

Идея проста, у меня есть оператор if, который проверяет, не столкнулось ли ранее направление пожаров, к которому он принадлежит. Допустим, индекс 4 в моем массиве fires сталкивается с ящиком. Тогда я не хочу, чтобы в этом конкретном направлении разжигались новые пожары.

После этого я создаю объект Fire и проверяю, сталкивается ли хитбокс этого объекта Fire с любым из хитбоксов коллайдера, используя IsFireColliding (огонь огня) . Этот метод перебирает все столкновения и возвращает истину или ложь в зависимости от того, обнаружено ли какое-либо столкновение.

Если IsFireColliding возвращает false, я добавляю огонь в свой список пожаров.

Если он возвращает true, я добавляю объект в свой список и устанавливаю направление bool (directionContinue [x]) равным false. Установка для bool значения false препятствует возникновению каких-либо пожаров в этом направлении.

Вот код класса, который это делает:

    private void AddFire(Vector2 offset, int directionContinueIndex) {

    if (directionContinue[directionContinueIndex])
    {
        Fire fire = new Fire(position + offset);   

        if (!IsFireColliding(fire))
        {
            fires.Add(fire);
        }
        else if (IsFireColliding(fire) && directionContinue[directionContinueIndex] == true)
        {
            fires.Add(fire);
            directionContinue[directionContinueIndex] = false;

        }

    }

}

Вот код метода IsFireColliding, который просматривает и проверяет столкновения:

    private bool IsFireColliding(Fire fire) {
   
    foreach (ICollidable c in InGameScreen.collidables) {

        if (fire.hitboxRectangle.Intersects(c.hitboxRectangle))
        {
            return true;
        }
      
            
    }
 
    return false;
}

Чтобы это работало во всех направлениях, мне нужно выполнить метод AddFire () четыре раза (в четырех разных направлениях). Я также хочу упомянуть, что я использую массив bool длиной четыре, чтобы отслеживать, какие направления столкнулись.

    public Explosion(Vector2 position, int length) : base(position) {
    
    fires = new List<Fire>();
    

    //Test code
    for (int x = 0; x < length * 4; x+=4) { //Check if you need to create a fire

        AddFire(new Vector2(-Tile.tileSize.X * counter * InGameScreen.scale, 0), 0);

        AddFire(new Vector2(Tile.tileSize.X * counter * InGameScreen.scale, 0), 1);

        AddFire(new Vector2(0, -Tile.tileSize.Y * counter * InGameScreen.scale), 2);

        AddFire(new Vector2(0, Tile.tileSize.Y * counter * InGameScreen.scale), 3);

        counter++;
    }


}

Надеюсь, это помогло кому-то, кто находится в одной лодке со мной!

0
DubstepZedd 9 Фев 2021 в 17:00