Здравствуйте! Есть задача по анимации фигуры с изменением координат. Есть класс, в котором описана моя кастомная фигура, состоящая из двух объектов 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 показать, что фигура движется?
}
Можно действительно, как говорят в комментариях, использовать методы
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());
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Допустим у меня есть координата мышки относительно окна рендераИ зная масштаб матрицы и её смещение, надо найти координаты мышки относительно...
Я хочу сделать прыжок в Unity3D, но движение у меня реализовано через CharacterControllerКогда я добавляю Rigidbody к игроку, то игрока начинает колбасить
Есть вариант с созданием префаба в котором лежит GUIText со скриптом, но тут свои трудности