Как перегрузить метод с делегатом и возможно ли объявить массив за пределами MainWindow()?

128
16 февраля 2021, 04:00

Доброго времени суток.

Пишу игру как курсач. Возникла идея для реализации перемещения противников: создать структуру Enemy, включающую координаты X и Y, булевую переменную (для регистрации того, отрисован конкретный противник или нет), дамаг и hp противников и создать для них массив horde из пяти элементов, который объявляется в методе MainWindow(). Заполнение полей в элементах массива происходит в методе (содержащем цикл for) вызываемом в MainWindow():

private void Initialize_enemy(ref Enemy tom)
    {
        for (int i = 0; i <= 5; i++)
        {
            tom.y_enemies = 110;
            tom.hp_enemies = 5;
            tom.damage_enemies = 1;
            tom.have_enemies = false;
            //генерация координаты x противника
            Random rand = new Random();
            tom.x_enemies = rand.Next(70, 1200);
        }
    }

Планировалось, что один противник будет отрисовываться раз в 5 секунд методом Draw_Enemy (в который передаётся Y координата), вызываемом в событии тика таймера Enemy_Tick. По тику таймера Game_Tick объект менял бы свою Y координату и тем самым перемещался. Я подyмал что можно попытаться перегрузить Enemy_Tick и Game_Tick вот таким образом, ибо не видел других вариантов:

private void Enemy_Tick(object sender, EventArgs e, ref Enemy tom)
    {
        Draw_Enemy(ref horde[5]);
    }
private void Game_Tick(object sender, EventArgs e, ref Enemy tom)
        {
            if (have_enemy == true)
                Enemy_Timer.Start();
        for (int i = 0; i < 5; i++)
        {
            if (tom.have_enemies == true)
            {
                tom.y_enemies += 3;
                can.Children.Remove(/*имя фигyры*/);
                Draw_Enemy(ref horde[i]);
            }
        }
    }
    }

В итоге словил по 2 ошибки каждого вида:

CS0103 "Имя "horde" не существует в текущем контексте".

CS0123 "Нет перегруженного метода для "Enemy_Tick", который соответствует делегату "EventHandler"."

Попытался объявить массив как public Enemy[] horde; и вместо двух CS0103 поймал другую ошибку:

CS0052 "Несогласованность по доступности: доступность типа поля "MainWindow.Enemy[]" ниже доступности поля "MainWindow.horde"

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

Answer 1

Вынести массив в статический класс (public static ArrayEnemy). ref horde[5] - ссылка на объект "horde" который не известен(передайте в метод ref horde), по остальным не могу сказать...

READ ALSO
Существуют ли какие-то затраты на преобразование объектов?

Существуют ли какие-то затраты на преобразование объектов?

С преобразованием значимого типа в объект и обратно все понятно — там появляются допоперации на упаковку/распаковку

125
Изменить стиль выделения заголовка столбца DataGridView

Изменить стиль выделения заголовка столбца DataGridView

На скриншотах: первая строка ListView, вторая строка DataGridView

107
Как вывести в label.Text &ldquo;string&rdquo; значение (Windows Form Application)

Как вывести в label.Text “string” значение (Windows Form Application)

Всем привет, подскажите как вывести стринговое значение (string) в labelText (C#, Visual Studio 2017, Windows Form Application);

120
Изменить цвет строк в DataGridView

Изменить цвет строк в DataGridView

Пытаюсь изменить цвет строки там где значение penalty = 1

97