C #.Как я могу присвоить всем меткам в моей форме одно и то же имя, чтобы, если объект привязан к одной из меток, он что-то показывал - PullRequest
0 голосов
/ 23 января 2019

Я делаю небольшую игру с C #.Но у меня в форме много меток, и если объект граничит с одной из меток, он больше всего возвращает текстовое поле, но для написания этого слишком много кода.Итак, как я могу дать всем меткам одно имя?

Это то, что у меня есть сейчас, но когда я переместлю свой объект (метку), он покажет MessageBoxes без границ с другими метками:

private void timer1_Tick(object sender, EventArgs e)
        {
            if (mUp == true) player.Top -= 1;
            if (mDown == true) player.Top += 1;
            if (mLeft == true) player.Left -= 1;
            if (mRight == true) player.Left += 1;

            foreach (var allLabels in this.Controls)
                if (allLabels is Label)
                    if (player.Bounds.IntersectsWith((allLabels as Label).Bounds))
                    {
                        MessageBox.Show("hi");
                        break;
                    }
        }

это то, что происходит, если я устанавливаю точку останова в строке MessageBox.Show.

1 Ответ

0 голосов
/ 23 января 2019

Применяется ли эта логика к каждому Label в форме? Если так, то вы можете найти их динамически в коллекции Controls. Возможно, что-то вроде этого:

foreach (var label in this.Controls)
    if (label is Label)
        if (player.Bounds.IntersectsWith((label as Label).Bounds))
        {
            MessageBox.Show("hi");
            break;
        }

или без петель и вложенности:

if (this.Controls.Where(c => c is Label).Any(c => player.Bounds.IntersectsWith((c as Label).Bounds)))
    MessageBox.Show("hi");

Или, если существует только подмножество меток, к которым это относится, вы можете явно сохранить их в коллекции класса (возможно, в конструкторе) и затем выполнить цикл по этой коллекции. Та же логика, но вы перебираете свою коллекцию вместо this.Controls.

В зависимости от того, насколько вы хотите абстрагироваться, другим вариантом может быть создание собственного класса (возможно, называемого чем-то вроде IntersectableLabel), который наследуется от Label. Сделайте все ваши соответствующие экземпляры меток этого класса вместо Label. (Честно говоря, я не уверен, какое влияние это может оказать на конструктор форм. Прошло очень много времени с тех пор, как я использовал Windows Forms.) Затем вы можете перебрать this.Controls и искать is IntersectableLabel, что приведет к фильтрации любые ярлыки, которые вы не хотите использовать.

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

...