Просмотр полной версии : Изменение координаты одной из точек направляющей линии.
cerber412
24.09.2017, 20:55
Доброго времени суток.
Помогите с ответом на вопрос.
У меня есть файл анимации, где кружок двигается по направляющей.
Направляющая представляет собой ломаную линию из двух отрезков.
Подскажите - можно ли скриптом - изменить координату средней точки этой ломаной направляющей ?
ZackMercury
24.09.2017, 21:42
Нет.
Только, если анимировать программно.
cerber412
25.09.2017, 09:17
ZackMercury, понятно - направляющую скриптом изменить нельзя.
Тогда можно ли заменить анимацию по координатам направляющей - на координаты заданные в скрипте ?
То есть - чтобы кружок двигался не по направляющей, заданной в документе, а по трем координатам точек - заданных в скрипте. (Движение начинается в координатах х1у1, идет к координатам х2у2, затем к х3у3, а потом повтор)
caseyryan
25.09.2017, 16:47
Тогда можно ли заменить анимацию по координатам направляющей - на координаты заданные в скрипте ?
Можно. Если это кривая линия, то точек там на самом деле больше. Тебе придется изучить как строится кривая безье. Если линия ломаная и точек действительно 3, то достаточно рассчитать вектор направленный от одной точки к другой, нормализовать его, и каждый кадр добавлять к нему определенную скорость. Ну или использовать библиотеку типа TweenMax. С ней все намного проще
cerber412
25.09.2017, 17:19
caseyryan, мне нужно всего три точки.
А как выглядит скрипт который двигает фигуру по этим трем точкам ?
ZackMercury
25.09.2017, 19:06
//Создаём квадрат
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;
}
cerber412
26.09.2017, 11:46
ZackMercury, спасибо за ответ.
Теперь ясно как происходит этот процесс.
ZackMercury
26.09.2017, 14:57
Ну, кода с помощью твиновой библиотеки будет всего строк 5 максимум.
cerber412
26.09.2017, 17:23
ZackMercury, заранее извиняюсь за вопрос:
А что такое - твиновая библиотека и для его она нужна ?
ZackMercury
26.09.2017, 17:58
Твиновая библиотека - это просто набор методов/классов, которые уже заранее написаны за вас сотню раз разными людьми, с помощью которых можно плавно изменять любые свойства в течении некоторого времени.
Нужна для программной анимации, там просто вызываешь метод, передаёшь ему объект и параметры, которые хочешь анимировать, всё остальное она делает за тебя. Ну и время, которое нужно на это потратить.
Делает она примерно то же, что и код выше.
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 секунда, на одно перемещение из одной точки в другую.
В моём же примере мы указываем скорость перемещения объекта, и она будет одинаковой для всех промежутков. Можно использовать и дробную, если целочисленных значений вам недостаточно.
cerber412
29.09.2017, 13:45
ZackMercury, теперь мне все стало ясно.
Спасибо за ответ.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.