Форум 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)
-   -   Перетаскивание объекта с инерцией (http://www.flasher.ru/forum/showthread.php?t=174329)

Televizeur 23.01.2012 01:19

Перетаскивание объекта с инерцией
 
Перерыл кучу всего, пытался подставлять разные коды, но толком так и не понял, как это делается.
Мне предстоит сделать интерфейс для тачскрина на подобии разных устройств, где при отпускании пальца страница продолжает некоторое время двигаться по инерции.
На данный момент сделал так, чтобы мувик можно было двигать по горизонтали, но то, что при отпускании он останавливается как вкопанный выглядит не круто. Надо, чтоб маленько присутствовала инерция.
Сейчас такой код:
Код AS1/AS2:

my_mc.onPress = function() {
        this.startDrag(false,0,200,550,200);
};
my_mc.onRelease = my_mc.onReleaseOutside=function () {
        this.stopDrag();
};
onMouseMove = function () {
        updateAfterEvent();
};

Что надо сюда дописать, чтоб появилась инерция?

NikolyA 23.01.2012 01:27

http://www.kirupa.com/forum/archive/.../t-276367.html - тут смотри решение

mooncar 23.01.2012 01:53

Вложений: 1
ТС, возможно, лучше будет, чтобы страница при останове все же позиционировалась там, где пользователь отжал палец, но зато сам останов сделать инерциальным?
Можно попробовать в таком случае использовать класс TweenLite, для упрощения инерционной анимации. Параметр инерционности в секундах можно менять.
И onReleaseOutside тоже добавить, если что.

PS. Метод startDrag нельзя использовать так, чтобы была инерция.

mooncar 23.01.2012 02:23

Вложений: 1
Ну уж если нужен все-таки проезд страницы дальше точки отпускания, то можно добавить некую добавочную дельту и сделать ее зависимой от того, насколько "сильно" (читай - далеко) протащили курсор.
Пример во вложении. obj1 - просто для удобства, можно в простую переменную запоминать положение мыши при нажатии. А вот obj2 используется для правильного расчета добавки.

Televizeur 23.01.2012 13:54

Это очень похоже на то, что надо! Спасибо за советы.

Добавлено через 2 часа 25 минут
Появилась другая проблема. В двигающемся мувике должны располагаться кнопки со ссылками. Делаю в нем кнопки, а они как кнопки не распознаются. Курсор на них просто не реагирует. В чем тут дело?

mooncar 23.01.2012 17:14

Да, возникает конфликт.
Можно, например, использовать hitTest + onMouseDown и onMouseUp вместо кнопочных событий на самой "странице", то есть эмулировать их. Тогда заработают кнопки внутри.
Код AS1/AS2:

import com.greensock.*;
import com.greensock.easing.*;
 
var inertTime:Number = 1;
var deltaXratio:Number = 0.5;
mc.onMouseDown = mcMouseDown;
mc.onMouseUp = mcMouseUp;
var obj1:Object ;
var obj2:Object ;
 
function  mcMouseDown()
{
        if(this.hitTest(_root._xmouse, _root._ymouse)  && !this.moved)
        {
                obj1 = { x:_root._xmouse, y:_root._ymouse };
                obj2 = { x:_root._xmouse, y:_root._ymouse };
                mc.globalToLocal(obj2);
                this.onMouseMove = mcMouseMove;
                this.moved = true ;
        }
}
 
function mcMouseUp()
{
        if(this.moved)
        {
                delete this.onMouseMove ;
                this.moved = false ;
        }
}
 
function mcMouseMove()
{
        var deltaX:Number = _root._xmouse -  obj1.x;
        var newX:Number_root._xmouse - obj2.x + deltaX * deltaXratio;
        TweenLite.to(mc, inertTime, {_x:newX, ease:Expo.easeOut});
}


Televizeur 23.01.2012 18:55

Понял, попробуем.
А вот еще такой вопрос. Каким образом мне зафиксировать передвижение МС в пределах определенной области?
В моем варианте было так:
Код AS1/AS2:

this.startDrag(false,0,200,550,200);

То есть, смысл в том, что имеется большой мувик длиной 1100 пикселов, в котором располагаются кнопки и по мере перетаскивания надо, чтоб он останавливался в пределах границы видимой области.
Куда мне в вашем коде эти параметры вставить?

И ещё, у вас в коде имеется ссылка на папку, в которой лежит куча всяких файлов с кодами. Это для чего?

ПС: Простите за столько ламерских вопросов, просто довольно редко приходится с флэшом работать.

mooncar 23.01.2012 19:11

По поводу папки - там находятся компоненты стороннего класса TweenLite который облегчает анимацию , некоторые необходимы при компиляции. Просто из проекта в проект переносятся.

Что касается пределов - нужно ставить проверку на конечную координату newX в onMouseMove. Попробуйте пока сами.
Что-то вроде if (newX > maxX) newX = maxX

UPD. Вот например, впишите в функцию onMouseMove
Код AS1/AS2:

        var deltaX:Number = _root._xmouse -  obj1.x;
        var newX:Number_root._xmouse - obj2.x + deltaX * deltaXratio;
        if (newX > maxX) newX = maxX; //проверка на макс. предел
        TweenLite.to(mc, inertTime, {_x:newX, ease:Expo.easeOut});

А вначале задайте, к примеру
Код AS1/AS2:

var maxX:Number = 300;

Аналогичную проверку сделайте и для минимального предела.

Televizeur 23.01.2012 22:00

Все сделал как вы пишете. Задал maxX:Number = 0
Мувик слева прилип к левой стороне окна и двигается только влево (вправо не двигается). Это то, что надо.
Ширина окна у меня сейчас 550px. Минимальный предел это newX? Задаю ему -550, по нажатию мыши он смещается влево на 550рх. При этом все умирает и больше двигать ничего не получается.

mooncar 23.01.2012 22:11

maxX и minX задают пределы, newX вычисляется, и сравнивается с ними.

Код AS1/AS2:

var maxX:Number = 0 ;
var minX:Number = 550 - 1100; //то есть -550, для понимания оставил выражение
 
...............
 
function mcMouseMove ()
{
        var deltaX:Number = _root._xmouse -  obj1.x;
        var newX:Number_root._xmouse - obj2.x + deltaX * deltaXratio;
        if (newX > maxX) newX = maxX;
        if (newX < minX) newX = minX;
        TweenLite.to(mc, inertTime, {_x:newX, ease:Expo.easeOut});
}


Televizeur 24.01.2012 13:01

Урааа!! Все получилось, вы мой спаситель!!!

mooncar 24.01.2012 13:03

Отлично! А для какого устройства приложение?

Televizeur 24.01.2012 13:31

Для плазмы тачскрина


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

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