Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.01.2012, 01:19
Televizeur вне форума Посмотреть профиль Отправить личное сообщение для Televizeur Найти все сообщения от Televizeur
  № 1  
Ответить с цитированием
Televizeur
 
Аватар для Televizeur

Регистрация: Jun 2009
Сообщений: 47
По умолчанию Перетаскивание объекта с инерцией

Перерыл кучу всего, пытался подставлять разные коды, но толком так и не понял, как это делается.
Мне предстоит сделать интерфейс для тачскрина на подобии разных устройств, где при отпускании пальца страница продолжает некоторое время двигаться по инерции.
На данный момент сделал так, чтобы мувик можно было двигать по горизонтали, но то, что при отпускании он останавливается как вкопанный выглядит не круто. Надо, чтоб маленько присутствовала инерция.
Сейчас такой код:
Код 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();
};
Что надо сюда дописать, чтоб появилась инерция?

Старый 23.01.2012, 01:27
NikolyA вне форума Посмотреть профиль Отправить личное сообщение для NikolyA Найти все сообщения от NikolyA
  № 2  
Ответить с цитированием
NikolyA
 
Аватар для NikolyA

Регистрация: Dec 2006
Сообщений: 1,764
http://www.kirupa.com/forum/archive/.../t-276367.html - тут смотри решение
__________________
а за окном атлантический океан!

Старый 23.01.2012, 01:53
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 3  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
ТС, возможно, лучше будет, чтобы страница при останове все же позиционировалась там, где пользователь отжал палец, но зато сам останов сделать инерциальным?
Можно попробовать в таком случае использовать класс TweenLite, для упрощения инерционной анимации. Параметр инерционности в секундах можно менять.
И onReleaseOutside тоже добавить, если что.

PS. Метод startDrag нельзя использовать так, чтобы была инерция.
Вложения
Тип файла: rar Drag с инерцией.rar (274.2 Кб, 43 просмотров)
__________________
Идите первым!


Последний раз редактировалось mooncar; 23.01.2012 в 02:01.
Старый 23.01.2012, 02:23
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 4  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Ну уж если нужен все-таки проезд страницы дальше точки отпускания, то можно добавить некую добавочную дельту и сделать ее зависимой от того, насколько "сильно" (читай - далеко) протащили курсор.
Пример во вложении. obj1 - просто для удобства, можно в простую переменную запоминать положение мыши при нажатии. А вот obj2 используется для правильного расчета добавки.
Вложения
Тип файла: rar Drag с инерцией и дельтой.rar (274.9 Кб, 47 просмотров)
__________________
Идите первым!


Последний раз редактировалось mooncar; 23.01.2012 в 07:03.
Старый 23.01.2012, 13:54
Televizeur вне форума Посмотреть профиль Отправить личное сообщение для Televizeur Найти все сообщения от Televizeur
  № 5  
Ответить с цитированием
Televizeur
 
Аватар для Televizeur

Регистрация: Jun 2009
Сообщений: 47
Это очень похоже на то, что надо! Спасибо за советы.

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

Старый 23.01.2012, 17:14
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 6  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Да, возникает конфликт.
Можно, например, использовать 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});
}
__________________
Идите первым!


Последний раз редактировалось mooncar; 23.01.2012 в 17:32.
Старый 23.01.2012, 18:55
Televizeur вне форума Посмотреть профиль Отправить личное сообщение для Televizeur Найти все сообщения от Televizeur
  № 7  
Ответить с цитированием
Televizeur
 
Аватар для Televizeur

Регистрация: Jun 2009
Сообщений: 47
Понял, попробуем.
А вот еще такой вопрос. Каким образом мне зафиксировать передвижение МС в пределах определенной области?
В моем варианте было так:
Код AS1/AS2:
this.startDrag(false,0,200,550,200);
То есть, смысл в том, что имеется большой мувик длиной 1100 пикселов, в котором располагаются кнопки и по мере перетаскивания надо, чтоб он останавливался в пределах границы видимой области.
Куда мне в вашем коде эти параметры вставить?

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

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

Старый 23.01.2012, 19:11
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 8  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
По поводу папки - там находятся компоненты стороннего класса 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;
Аналогичную проверку сделайте и для минимального предела.
__________________
Идите первым!


Последний раз редактировалось mooncar; 23.01.2012 в 19:23.
Старый 23.01.2012, 22:00
Televizeur вне форума Посмотреть профиль Отправить личное сообщение для Televizeur Найти все сообщения от Televizeur
  № 9  
Ответить с цитированием
Televizeur
 
Аватар для Televizeur

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

Старый 23.01.2012, 22:11
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 10  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
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});
}
__________________
Идите первым!


Последний раз редактировалось mooncar; 23.01.2012 в 22:22.
Создать новую тему Ответ Часовой пояс GMT +4, время: 03:09.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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