2014-02-09 4 views
-1

Я постараюсь сохранить это как можно более конкретным.Для каждого контура управления, затрагивающего только один элемент управления

Это мой код:

foreach (Control c in this.Controls) 
{ 
    if (c.Height > 25) 
    { 
     c.BackColor = Color.Red; 
     pictureBox1.Location = new Point(x1, y1); 
     if (pictureBox1.Bounds.IntersectsWith(c.Bounds)) 
     { 
      isCollide = true; 
      label1.Text = "true"; 
      c.BackColor = Color.Green; 
     } 
     else 
     { 
      isCollide = false; 
      label1.Text = "false"; 
     } 

    } 
} 

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

Переменная «isCollide», которая имеет значение «true», просто делает ее так, что я не могу ее пропустить.

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

Мой вопрос:, почему цвет влияет на все элементы управления, через которые прошел мой код, но обнаружение конфликтов не работает на всех них? Это потому, что переменная isCollide установлена ​​одновременно на «ложь» и «истина» из-за столкновения с одной стеной и одновременно не сталкивается с другим?

Как я могу исправить эту проблему?

Это код, который использует «isCollide»:

public void move(string Direction) 
    { 
     if (Direction == "Up") 
     { 
      //b = x/a = y 
      reset(); 
      x1 = x; 
      y1 = y - 5; 
      isCollided(); 
      if (isCollide == false) 
      { 
       y -= 5; 
      } 


     } 

* Примечание: Не конец кода, аналогичный код был применен ко всем направлениям (сверху, слева, справа, снизу)

+0

Покажите мне код, который использует isCollide, и на нем основана логика. В этом коде вы устанавливаете isCollide. Я хочу посмотреть, как вы используете isCollide –

+0

Edit *: выглядит грязно. Я буду обновлять исходный пост. – user3126288

+0

этот код является синтаксически неправильным для начала. isCollide - это поле не метод, поэтому вы не можете его вызывать с помощью '()', как будто у вас есть Collided() –

ответ

0

Конечное значение isCollide будет основано на столкновении последнего элемента управления, который повторяется в цикле foreach. Если вам не важно, с каким объектом сталкивается столкновение, я рекомендую выйти из цикла после обнаружения столкновения. Что-то вроде этого.

foreach (Control c in this.Controls) 
{ 
    if (c.Height > 25) 
    { 
     c.BackColor = Color.Red; 
     pictureBox1.Location = new Point(x1, y1); 
     if (pictureBox1.Bounds.IntersectsWith(c.Bounds)) 
     { 
      isCollide = true; 
      label1.Text = "true"; 
      c.BackColor = Color.Green; 
      break; 
     } 
     else 
     { 
      isCollide = false; 
      label1.Text = "false"; 
     } 
    } 
} 
+0

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

+0

Это сделало !, спасибо человеку!: D – user3126288

0

Его, потому что isCollide является просто локальными переменной и не свойством вашего контроля, как ваш c.BackColor это.

Вам нужно определить isCollide на классе управления, чтобы сохранить состояние isCollide для каждого объекта управления в списке элементов управления:

public class Control 
{ 
    public bool isCollide {get; set;} 
    public string BackColor {get; set;} 
    public int Height {get; set;} 
} 

foreach (Control c in this.Controls) 
     { 
      if (c.Height > 25) 
      { 
       c.BackColor = Color.Red; 
       pictureBox1.Location = new Point(x1, y1); 
       if (pictureBox1.Bounds.IntersectsWith(c.Bounds)) 
       { 
        c.isCollide = true; 
        label1.Text = "true"; 
        c.BackColor = Color.Green; 
       } 
       else 
       { 
        c.isCollide = false; 
        label1.Text = "false"; 
       } 

      } 
     } 
+0

Спасибо за ваш ответ! : D У меня есть цикл внутри моего основного кода (являющийся основным классом формы) Я не могу создать свойство для элемента управления, так как я могу применить этот метод в своей проблеме? :) – user3126288

+0

Почему вы не можете добавить свойство к элементу управления? –

+0

Что вы хотите, чтобы установить, когда isCollide установлен? Ему нужно установить другое свойство управления, тогда я предполагаю, что –

0

Другой причиной может быть, что элементы управления на форме вложены в контейнеры (например, GroupBox). В этом случае вам придется рекурсивно проверять элементы в ихControl.

Смежные вопросы