2013-04-07 3 views
0

Создание панели заполненной формы, в которой я хочу, чтобы персонаж (представленный pictureBox) перемещался. Когда я нажимаю на PictureBox персонажа, я хочу выделить область, представляющую, насколько далеко может перемещаться этот символ.Как выделить конкретную область на сетке панелей

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

Current Highlighted area for a character with 2 movement

Персонаж двигается к панели по диагонали должен затрачивать 2 движение так, что если символ имеет 2 движения доступного ниже область должна быть выделена, когда PictureBox нажал на:

Desired Highlighted area for a character with 2 movement

Я понимаю, почему мой код выделяет квадрат вместо области, которую я хочу, но я не уверен, как ее исправить. Любая помощь будет оценена по достоинству; ниже приведен код, который я написал.

 foreach (Panel pan in grid) 
     { 
      if (pan.Left <= (selectedCharacter.PictureBox.Left + (selectedCharacter.Movement * 80)) 
       && pan.Left >= (selectedCharacter.PictureBox.Left - (selectedCharacter.Movement * 80))) 
      { 
       if (pan.Top <= (selectedCharacter.PictureBox.Top + (selectedCharacter.Movement * 100)) 
        && pan.Top >= (selectedCharacter.PictureBox.Top - (selectedCharacter.Movement * 100))) 
       { 
         pan.BackColor = selectedCharacter.PlayerHighlight; 
       } 
      } 
     } 

Не стесняйтесь задавать вопросы, если я не был достаточно

ответ

0

ясно Вот код, который я придумал, чтобы решить эту проблему. Не стесняйтесь комментировать, если вы можете увидеть более простой/другой способ решить эту проблему.

Panel[] highlightedMovement = new Panel[1]; //creates an array of panels to be highlighted 
highlightedMovement[0] = characterBeingHighlighted.CurrentPanel; //adds the panel the character is currently on to the array 

int z = 1; 

//highlights panels adjecent to those already highlighted for as many iterations as the character's movement stat 
for (int i = 0; i < characterBeingHighlighted.Movement; i++) 
{ 
    foreach (Panel highlightPanel in highlightedMovement) 
    { 
     //goes through all panels on the grid and adds them to the array if they are adjacent to any already in the array. 
     foreach (Panel gridPanel in grid) 
     { 
      //checks if the panel is adjacent to any already in the array 
      if ((gridPanel.Top == (highlightPanel.Top + 100) && gridPanel.Left == highlightPanel.Left) || 
       (gridPanel.Top == (highlightPanel.Top - 100) && gridPanel.Left == highlightPanel.Left) || 
       (gridPanel.Left == (highlightPanel.Left + 80) && gridPanel.Top == highlightPanel.Top) || 
       (gridPanel.Left == (highlightPanel.Left - 80) && gridPanel.Top == highlightPanel.Top)) 
      { 
       //adds it to the array but only if it isn't already in the array 
       if (!highlightedMovement.Contains(gridPanel)) 
       { 
        Array.Resize(ref highlightedMovement, highlightedMovement.Length + 1); 
        highlightedMovement[z] = gridPanel; 
        z++; 
       } 
      } 
     } 
    } 
} 

//highlights all the panels in the array 
foreach (Panel panel in highlightedMovement) 
{ 
    panel.BackColor = characterBeingHighlighted.PlayerHighlight; 
} 
Смежные вопросы