|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2017
Сообщений: 9
|
Изменение координаты одной из точек направляющей линии.
Доброго времени суток.
Помогите с ответом на вопрос. У меня есть файл анимации, где кружок двигается по направляющей. Направляющая представляет собой ломаную линию из двух отрезков. Подскажите - можно ли скриптом - изменить координату средней точки этой ломаной направляющей ? |
|
|||||
Регистрация: Sep 2017
Сообщений: 9
|
ZackMercury, понятно - направляющую скриптом изменить нельзя.
Тогда можно ли заменить анимацию по координатам направляющей - на координаты заданные в скрипте ? То есть - чтобы кружок двигался не по направляющей, заданной в документе, а по трем координатам точек - заданных в скрипте. (Движение начинается в координатах х1у1, идет к координатам х2у2, затем к х3у3, а потом повтор) |
|
|||||
Можно. Если это кривая линия, то точек там на самом деле больше. Тебе придется изучить как строится кривая безье. Если линия ломаная и точек действительно 3, то достаточно рассчитать вектор направленный от одной точки к другой, нормализовать его, и каждый кадр добавлять к нему определенную скорость. Ну или использовать библиотеку типа TweenMax. С ней все намного проще
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Sep 2017
Сообщений: 9
|
caseyryan, мне нужно всего три точки.
А как выглядит скрипт который двигает фигуру по этим трем точкам ? |
|
|||||
//Создаём квадрат var quad:Shape = new Shape(); quad.graphics.beginFill(0x000000); quad.graphics.drawRect(0, 0, 32, 32); addChild(quad); var points:Array = [ new Point(10, 10), new Point(200, 100), new Point(50, 300), new Point(300, 300), new Point(0,0), new Point(200, 10)]; //Перечисляем через запятую любое кол-во точек var position:Number = 0; // позиция анимации var speed:Number = 1; // пикселей в кадр var distance = calculateDistance(points); // Общая длина пути this.addEventListener(Event.ENTER_FRAME, update); function calculateDistance(arr:Array):Number { var distance = 0; for(var i:int = 1; i < arr.length; i++) distance += Point.distance(arr[i] , arr[i-1]); return distance; } function update(e:Event):void { //Эта функция будет вызываться каждый кадр if(position > distance) return; var distanceSum:Number = 0; for(var i:int = 1; i < points.length; i++) { var currDist = Point.distance(points[i], points[i-1]); if(distanceSum + currDist > position) //Мы нашли промежуток, в котором находимся { var pos:Point = Point.interpolate(points[i], points[i-1], (position - distanceSum)/currDist); quad.x = pos.x; // quad меняем на кастомную фигуру quad.y = pos.y; break; } distanceSum += currDist; } position += speed; }
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 25.09.2017 в 20:47. |
|
|||||
Регистрация: Sep 2017
Сообщений: 9
|
ZackMercury, спасибо за ответ.
Теперь ясно как происходит этот процесс. |
|
|||||
Регистрация: Sep 2017
Сообщений: 9
|
ZackMercury, заранее извиняюсь за вопрос:
А что такое - твиновая библиотека и для его она нужна ? |
|
|||||
Твиновая библиотека - это просто набор методов/классов, которые уже заранее написаны за вас сотню раз разными людьми, с помощью которых можно плавно изменять любые свойства в течении некоторого времени.
Нужна для программной анимации, там просто вызываешь метод, передаёшь ему объект и параметры, которые хочешь анимировать, всё остальное она делает за тебя. Ну и время, которое нужно на это потратить. Делает она примерно то же, что и код выше. import com.greensock.TweenLite; var points:Array = [ new Point(10, 10), new Point(200, 100), new Point(50, 300), new Point(300, 300), new Point(0,0), new Point(200, 10)]; //Перечисляем через запятую любое кол-во точек quad.pos.x = points[0].x; quad.pos.y = points[0].y; var curr:int = 0; function onTweenOver() { if(curr + 1 < points.length) TweenLite.to(quad, 1, { x: points[++curr].x, y: points[++curr].y, onComplete: onTweenOver }); } onTweenOver(); https://greensock.com/tweenlite-as Однако здесь скорость объекта будет меняться в зависимости от расстояния. Т.е. там указывается время - 1 секунда, на одно перемещение из одной точки в другую. В моём же примере мы указываем скорость перемещения объекта, и она будет одинаковой для всех промежутков. Можно использовать и дробную, если целочисленных значений вам недостаточно.
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 26.09.2017 в 21:23. |
Часовой пояс GMT +4, время: 18:44. |
|
« Предыдущая тема | Следующая тема » |
|
|