![]() |
|
||||||||||
|
|||||
|
Регистрация: Nov 2010
Сообщений: 430
|
Здравствуйте.
Ситуация: Допустим, есть длинный нарисованный состав из 100 вагонов, на сцену (шириной 500) влезает только 5 вагонов, нужно организовать прокрутку "как в айПаде", т.е. зацепил один вагон мышкой, повел в сторону и спроисходит смещение - становятся видны следующие/предыдущие вагоны. Кроме того, по-моему (ни айПада, ни айФона у меня нет) там есть что-то вроде инерции - чем быстрее вел, тем дольше продолжается движение после того, как отпустил объект. Вопрос: Есть ли у кого-нить наметки, как это делается, или примеры, или ссылки на похожие статьи? Во флеше не так давно, так что подойдут материалы "для чайников" ) |
|
|||||
|
Могу предложить направление изысканий. Вам потребуется прослушка событий MouseEvent.MOUSE_DOWN, MouseEvent.MOUSE_UP и MouseEvent.MOUSE_MOVE. В слушателе MOUSE_MOVE вам нужно будет считывать координаты мыши и, исходя из них, считать скорость прокрутки. Зная скорость прокрутки, вы сможете реализовать инерцию. Кроме того можете добавить эффект смазывания, воспользовавшись flash.filters.BlurFilter.
|
|
|||||
|
Регистрация: Jun 2009
Сообщений: 461
|
Еще пригодится библиотека для плавной анимации перемещения: http://www.greensock.com/
|
|
|||||
|
Регистрация: Oct 2009
Сообщений: 174
|
чтобы узнать скорость прокрутки, к примеру, можно сравнивать предыдущее и последующее положение (смещение) мыши в определенные отсчеты времени.
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 430
|
Спасибо )
Сделал так: // при нажатии на поезд function pickupTrain(e:MouseEvent):void{ wasMouseX = mouseX; // координата, в которой произощел "зацеп" поезда stage.addEventListener(MouseEvent.MOUSE_MOVE, changeXY); // слушатель на перемещение мыши } // функция изменения кординат при перетаскивании function changeXY(e:MouseEvent):void{ speedTrain = wasMouseX - mouseX // вычисление скорости мыши this.Train.x -= speedTrain; // движение поезда со скоростью мыши Mouse.cursor = MouseCursor.HAND; // смена курсора e.updateAfterEvent(); // упдейт wasMouseX = mouseX; // перезапоминаем координату } // при отпускании поезда function releaseTrain(e:MouseEvent):void{ stage.removeEventListener(MouseEvent.MOUSE_MOVE, changeXY); // удаляем слушатель Mouse.cursor = MouseCursor.AUTO; // смена курсора } как добавить инерцию после отпускания? |
|
|||||
|
Цитата:
|
|
|||||
|
Не обижайтесь, но работу подобного кода можно охарактеризовать только нехорошим словом. Сам так делал как-то =) Не вздумайте такие скроллы лепить на тач-устройства. Нужно учитывать случайный сдвиг при касании (не относится к мышке), нужно сглаживать-аппроксимировать скорость броска, надо делать грамотный(по ощущениям) pull и bounce, и всякие другие мелкие нюансы...
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 430
|
Цитата:
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 430
|
Ну как только решение созреет, дайте знать )))
Добавлено через 15 часов 27 минут Пока сделал так. Работает. Не айПад, конечно, но работает. // при нажатии на поезд function pickupTrain(e:MouseEvent):void{ tweenTrain.stop(); wasMouseX = mouseX; stage.addEventListener(MouseEvent.MOUSE_MOVE, changeXY); } // функция изменения кординат при перетаскивании function changeXY(e:MouseEvent):void{ speedTrain = wasMouseX - mouseX this.Train.x -= speedTrain; Mouse.cursor = MouseCursor.HAND; e.updateAfterEvent(); wasMouseX = mouseX; } // при отпускании поезда function releaseTrain(e:MouseEvent):void{ if (tweenTrain.isPlaying){ tweenTrain.continueTo((this.Train.x - speedTrain*20), tweenTime); } else{ tweenTrain = new Tween(this.Train, "x", Strong.easeOut, this.Train.x, (this.Train.x - speedTrain*20), tweenTime, true); } speedTrain = 0; stage.removeEventListener(MouseEvent.MOUSE_MOVE, changeXY); Mouse.cursor = MouseCursor.AUTO; } |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:38. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|