Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Передвижение MovieClip по вектору (http://www.flasher.ru/forum/showthread.php?t=135986)

KirAmp 06.02.2010 16:18

Передвижение MovieClip по вектору
 
Здравствуйте, столкнулся с небольшой проблемой, которую впервые не смог решить сам...
Дело в том что мне надо переместить объект до определенной точки) но проблема в том что он перемещается по координатам (x y) а не по прямой линии (вектору).
Пожалуйста помогите! Напишите программу с помощью которой любой объект будет перемещаться из одной точки в любую другую по прямой линии (вектору)
Код AS1/AS2:

//У МЕНЯ СЕЙЧАС ТАК
if (this[select]._x<grib_x) {
        this[select]._x += 10;
}
if (this[select]._y>grib_x) {
        this[select]._x -= 10;
}
if (this[select]._y<grib_y) {
        this[select]._y += 10;
}
if (this[select]._y>grib_y) {
        this[select]._y -= 10;
}


samana 06.02.2010 17:16

Почему бы тебе не попробовать Tween классы?
Но можно и так:
функия go принимает параметры
1)какой клип перемещать
2)скорость передвижения
3)куда по X
4)куда по Y
-------------------------
Например в следующем коде клип с именем clip будет двигаться к мышке в одинаковой скоростью.

Код AS1/AS2:

_root.onEnterFrame = function() {
        go(clip,5,_xmouse,_ymouse);
};
function go(obj, step, targetX, targetY) {
        d = Math.sqrt(Math.pow(targetY - obj._y, 2) + (Math.pow(targetX - obj._x, 2)));
        y = targetY - obj._y;
        x = targetX - obj._x;
        sin = y / d;
        cos = x / d;
        if (d > step) {
                obj._x += cos * step;
                obj._y += sin * step;
        } else {
                obj._x = targetX;
                obj._y = targetY;
        }
}


udaaff 06.02.2010 17:17

Смысл устраивать голосование по вопросу на который дается однозначный ответ?

Код AS1/AS2:

onEnterFrame = onEnterFrameHandler;
var v:Number = 5;
 
function onEnterFrameHandler():Void
{
        var dx:Number = _xmouse - mc._x;
        var dy:Number = _ymouse - mc._y;
        var rad:Number = Math.atan2(dy, dx);
 
        mc._x += v * Math.cos(rad)
        mc._y += v * Math.sin(rad);
        mc._rotation = 180 * rad / Math.PI;
}


KirAmp 06.02.2010 22:11

Спасибо огромное! С детства не дружу с тригонометрией

wormaster 30.06.2010 06:48

Каким образом возможно реализовать привязку таскаемого объекта к линии. То есть нечто что можно потаскать мышкой(скроллер) и оно должно перемещаться по прямой но не вертикальной или горизонтальной, а диагональной.

rainbowrussia 30.06.2010 22:42

Цитата:

Сообщение от wormaster (Сообщение 918891)
Каким образом возможно реализовать привязку таскаемого объекта к линии. То есть нечто что можно потаскать мышкой(скроллер) и оно должно перемещаться по прямой но не вертикальной или горизонтальной, а диагональной.

Как вариант - разместить прозрачный мувик под/над нужным, повесить onPress, onRelease, onReleaseOutside на него, на событии onMouseMove отрисовывать нужный мувик в расчетной позиции, относительно положения прозрачного мувика. Можно прозрачному мувику задать границы перемещения (прямоугольник). В событиях onRelease, onReleaseOutside позиционировать прозрачный мувик на место нашего.

Maxio 02.07.2010 00:10

а как бы кто сделал, если бы надо было сделать движение непрямолинейное?
например, по траектории кривой (по-моему, 2го порядка, не помню), которые позволяет рисовать as2 метод - curveTo.

Есть клип, начальная точка, конечная, траектория между ними описывается кривой, параметры которой вы знаете (анкор известен) - кто бы к какой идее обратился?

rainbowrussia 02.07.2010 00:15

Я бы сделал так как написал выше, если формула кривой известна.

NoCD 02.07.2010 08:56

А если кривую разбить на пикселы, внести их в массив и уже по массиву двигаться?

Maxio 02.07.2010 12:27

ну да, тут задача креативнее получается, разные варианты возможны.
rainbowrussia, я имел в виду не двигать мышкой, ну хотя даже если двигать - вот, допустим, есть у нас
Код:

startX = startY = 0;
finX = finY = 100;
controlX = 100;
controlY = 0;
//кривая такого плана, например:
moveTo(startX, startY);
curveTo(controlX, controlY, finX, finY);

и вот теперь мувик, стоящий изначально в 0, 0, надо передвинуть по X, например, на 30. Но приэтом он должен быть отрисован на соответствующем Y, чтобы остаться НА нарисованной кривой.

Добавлено через 1 минуту
сейчас вот почитал про формулы этих кривых, всё сводится к параболам, я так понимаю. Но чтобы узнать параметры конкретно этой параболы... Эх, надо шевелить опять математику :)


Часовой пояс GMT +4, время: 15:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.