C# Анимация фигуры. Передвижение по Canvas

883
11 декабря 2017, 13:08

Здравствуйте! Есть задача по анимации фигуры с изменением координат. Есть класс, в котором описана моя кастомная фигура, состоящая из двух объектов geometry. У нее есть свойство "начальная точка" и метод, который возвращает эту фигуру как объект Path. Надо как-то добавить анимацию, чтобы фигура двигалась по экрану и координаты созданного экземпляра класса этой фигуры соответственно менялись. Есть идея менять координаты и перерисовать фигуру, при этом удалив старую, но как найти старую фигуру, если исходных может быть несколько? Если кратко, весь вопрос в том, как анимировать мою кастомную фигуру, чтобы, изменяя свое положение, ее свойства (координаты) тоже менялись? Например есть класс Figure

public class Figure
{
public Figure(Point startPoint)
{
StartPoint = startPoint
}
public Point StartPoint {get; set;}
public Path CreateFigure()
{
//создание каких-либо примитивов и их передача в CombinedGeometry и path.Data
return path;
}
public Path Move()//движение фигуры по горизонтали
{
StartPoint.X += 1;
}

В классе MainWindow есть метод движения фигуры

public void MoveFigure()
{
Figure figure = new Figure(new Point (1,1));
Path path = figure.CreateFigure();
canvas.Children.Add(path);
//как дальше применяя метод Move показать, что фигура движется?
}
Answer 1

Можно действительно, как говорят в комментариях, использовать методы Canvas.SetTop()/Canvas.SetLeft().

Тогда вам нужно добавить в метод CreateFigure() явную установку расположения фигуры на холсте

Canvas.SetLeft(path, 0);

Дальше - анимация.

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

Но вернемся к первому способу

Все что здесь нужно - подписаться на событие CompositionTarget.Rendering

CompositionTarget.Rendering += CompositionTarget_Rendering

и затем правильно его обработать:

foreach(var x in canvas.Children.OfType<Path>())
{
    var left = Canvas.GetLeft(x);
    Canvas.SetLeft(x, left  + 1);
}

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

Описание фигуры из примера

Point secondPoint = new Point(StartPoint.X + 5, StartPoint.Y + 5);
Size size = new Size(10, 10);
CombinedGeometry cg = new CombinedGeometry();
cg.Geometry1 = new RectangleGeometry(new Rect(StartPoint, size));
cg.Geometry2 = new RectangleGeometry(new Rect(secondPoint, size));
cg.GeometryCombineMode = GeometryCombineMode.Xor;

Ваш вариант с удалением старой фигуры и отображением новой тоже имеет право на существование. Код будет аналогичным за исключением того, что не будет манипуляций со свойствами Canvas.Left/CanvasTop

Для начала исправьте метод Move в классе Figure в текущем варианте смысла он не имеет

public void MoveFigure()
{
    StartPoint = new Point(StartPoint.X + 1, StartPoint.Y);
}

Затем создайте список фигур и отобразите на холсте. При перерисовке очистите холст, передвиньте фигуры путем вызова Move и отрисуйте их заново

canvas.Children.Clear();
foreach (Figure figure in figures)
{
    figure.MoveFigure();
    canvas.Children.Add(figure.CreateFigure());
}
READ ALSO
Перевод оконных координат в мировые

Перевод оконных координат в мировые

Допустим у меня есть координата мышки относительно окна рендераИ зная масштаб матрицы и её смещение, надо найти координаты мышки относительно...

207
Прыжок в Unity3D

Прыжок в Unity3D

Я хочу сделать прыжок в Unity3D, но движение у меня реализовано через CharacterControllerКогда я добавляю Rigidbody к игроку, то игрока начинает колбасить

412
Распарсить json и получить результат

Распарсить json и получить результат

Здравствуйте, делаю get запрос

325
Как сделать поле ввода на Unity 4.1.2?[C#]

Как сделать поле ввода на Unity 4.1.2?[C#]

Есть вариант с созданием префаба в котором лежит GUIText со скриптом, но тут свои трудности

220