Делаю мини игру на wpf
Есть проблема - не знаю как привязать ребра к вершинам графа. Т.е. если сейчас синий игрок нажмёт на красную вершину, то нужно, чтобы красные ребра к этой (уже синей) вершине разрывались
Текущий код выглядит так:
private void Btn_Lines(object sender, RoutedEventArgs e)
{
Point btn1Point = ((Button)sender).TransformToAncestor(main).Transform(new Point(-25, 0));
for (int i = 0; i < 36; i++)
{
if (((Button)sender).Margin.Top - buttons[i].Margin.Top <= 300 &&
((Button)sender).Margin.Left - buttons[i].Margin.Left <= 300 &&
((Button)sender).Margin.Top - buttons[i].Margin.Top >= -300 &&
((Button)sender).Margin.Left - buttons[i].Margin.Left >= -300 &&
buttons[i].Foreground == ((Button)sender).Foreground)
{
Line l = new Line();
if (buttons[i].Foreground.ToString() == "#FFFF0000")
{
l.Stroke = new SolidColorBrush(Colors.Red);
}
else if (buttons[i].Foreground.ToString() == "#FF0000FF")
{
l.Stroke = new SolidColorBrush(Colors.Blue);
}
l.StrokeThickness = 2.0;
Point btn2Point = buttons[i].TransformToAncestor(main).Transform(new Point(25, 0));
l.X1 = btn1Point.X + ((Button)sender).ActualWidth;
l.X2 = btn2Point.X;
l.Y1 = btn1Point.Y + ((Button)sender).ActualHeight / 2;
l.Y2 = btn2Point.Y + buttons[i].ActualHeight / 2;
main.Children.Add(l);
}
}
}
Пытался добавить Dictionary<int, List<Line>>, где int - номер кнопки, а List - его вершины (до 6 на каждую вершину, т.к. в одной строке вершины не связываются), но получил ошибку. Да и думаю, что дальше не разберусь.
В общем проблема заключается в следующем: как сделать так, чтобы при захвате чужой вершины, ее ребра разрывались?
Хотел сделать так, но ошибка...
public static Dictionary<int, List<Line>> chains = new Dictionary<int, List<Line>>(6);
private void Btn_Lines(object sender, RoutedEventArgs e)
{
Point btn1Point = ((Button)sender).TransformToAncestor(main).Transform(new Point(-25, 0));
List<Line> ll = new List<Line>(6);
for (int i = 0; i < 36; i++)
{
for(int k = 0; k < 6; k++)
{
if (((Button)sender).Margin.Top - buttons[i].Margin.Top <= 300 &&
((Button)sender).Margin.Left - buttons[i].Margin.Left <= 300 &&
((Button)sender).Margin.Top - buttons[i].Margin.Top >= -300 &&
((Button)sender).Margin.Left - buttons[i].Margin.Left >= -300)
{
Line l = new Line();
l.Stroke = new SolidColorBrush(Colors.Black);
l.StrokeThickness = 2.0;
Point btn2Point = buttons[i].TransformToAncestor(main).Transform(new Point(25, 0));
l.X1 = btn1Point.X + ((Button)sender).ActualWidth;
l.X2 = btn2Point.X;
l.Y1 = btn1Point.Y + ((Button)sender).ActualHeight / 2;
l.Y2 = btn2Point.Y + buttons[i].ActualHeight / 2;
ll.Add(l);
}
}
chains.Add(i, ll);
}
for (int i = 0; i < 36; i++)
{
if (buttons[i].Foreground == ((Button)sender).Foreground)
{
foreach (List<Line> p in chains.Values)
foreach(Line l in p)
main.Children.Add(l);
}
}
}
В общем, сделал все как и хотел. Не знаю насколько это ужасно выглядит. Если кто-то может подсказать правильное решение, буду очень благодарен
private static List<Line> ch = new List<Line>();
private void Btn_Lines(object sender, RoutedEventArgs e)
{
int peak_chains = 0;
for (int i = 0; i < 36; i++)
{
if (((Button)sender).Margin.Top - buttons[i].Margin.Top <= 300 &&
((Button)sender).Margin.Left - buttons[i].Margin.Left <= 300 &&
((Button)sender).Margin.Top - buttons[i].Margin.Top >= -300 &&
((Button)sender).Margin.Left - buttons[i].Margin.Left >= -300 &&
((Button)sender).Foreground == buttons[i].Foreground)
{
Line l = new Line();
Point btn1Point = ((Button)sender).TransformToAncestor(main).Transform(new Point(-25, 0));
Point btn2Point = buttons[i].TransformToAncestor(main).Transform(new Point(25, 0));
l.StrokeThickness = 2.0;
l.X1 = btn1Point.X + ((Button)sender).ActualWidth;
l.X2 = btn2Point.X;
l.Y1 = btn1Point.Y + ((Button)sender).ActualHeight / 2;
l.Y2 = btn2Point.Y + buttons[i].ActualHeight / 2;
ch.Add(l);
l.Stroke = ((Button)sender).Foreground;
peak_chains++;
main.Children.Add(l);
if (((Button)sender).Foreground == Brushes.Red)
{
for (int z = 0; z < ch.Count; z++)
{
if (((l.X1 == ch[z].X1 && l.Y1 == ch[z].Y1) ||
(l.X2 == ch[z].X2 && l.Y2 == ch[z].Y2))
&& ch[z].Stroke != Brushes.Red)
{
main.Children.Remove(ch[z]);
ch.RemoveAt(z);
z = 0;
}
}
}
else if (((Button)sender).Foreground == Brushes.Blue)
{
for (int z = 0; z < ch.Count; z++)
{
if (((l.X1 == ch[z].X1 && l.Y1 == ch[z].Y1) ||
(l.X2 == ch[z].X2 && l.Y2 == ch[z].Y2))
&& ch[z].Stroke != Brushes.Blue)
{
main.Children.Remove(ch[z]);
ch.RemoveAt(z);
z = 0;
}
}
}
}
}
if(peak_chains > 3)
{
MessageBox.Show((peak_chains - 1).ToString());
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости