PDA

Просмотр полной версии : 360 градусов вращение


ludankov
19.12.2007, 18:25
Как сделать вращение на 360 градусов, как на этом сайте http://www.bmw.com/com/en/newvehicles/x5/x5/2006/visualizer.html и на многих других.
У меня есть секвенция 360 кадров 1 кадр - 1 градус. Нужно чтоб при нажатии и ведении мышки вправо клип проигрывался вперед и наоборот. На бэхином сайте по-моему сделано картинками а не видео. Просто у них кадров не много, а мне как 360 запихивать во флэш он же секвенцию не понимает. Помогите кто знает.

Fernando Costa
19.12.2007, 18:38
это намек:

_root.onMouseMove = function(){
mc.gotoAndStop(Math.floor(_xmouse))
}

ludankov
19.12.2007, 19:47
Спасибо большое. Все работает, только это работает вообще при перетаскивании. А как сделать чтоб то же самое работало только когда держишь мышь нажатой как на сайте бэхи.

Fernando Costa
19.12.2007, 19:59
var abbleToDrag:Boolean = false
_root.onMouseDown = function(){
abbleToDrag=true
}
_root.onMouseUp = function(){
abbleToDrag=false
}

_root.onMouseMove = function(){
if(abbleToDrag)
mc.gotoAndStop(Math.floor(_xmouse))
}


а вообще чтобы было как на сайте у бехи - это уже в раздел вакансии

Волгоградец
19.12.2007, 20:41
Я бы так сделал:
_root.onMouseDown = function (){
flag = 1;
}
_root.onMouseUp = function (){
flag = 0;
}
_root.onEnterFrame = function (){
if (flag){
mc.gotoAndStop(Math.floor(_root._xmouse))
}
}

У Фернандо техничнее...

Fernando Costa
19.12.2007, 20:48
_root._xmouse == _xmouse!

Волгоградец
19.12.2007, 20:52
Да, Fernando Costa, ты прав. Ценное замечание, спасибо.

ludankov
20.12.2007, 12:27
Спасибо за помощь буду разбираться. Уже есть несколько вопросов. Если не допру сам буду вас теребить.

ludankov
20.12.2007, 15:15
Fernando Costa твой код отлично работает. Только он у тебя привязан к пикселям документа, поэтому когда начинаешь тащить клип перепрыгивает на тот кадр, которому соответствует пиксел на котором я тыкнул. А нужно чтоб он продолжал вращение с того же места где стоял, как бы прибавлял кадры к тому на котором остановился. У меня вопрос это уже совсем другой код должен быть или этот можно дописать. Есть такая идея только пока не могу реализовать: Начальное положение курсора мыши, где было произведено нажатие фиксируется и вычитается из последующих чисел координат и полученное число прибавляется к кадру на котором мувик находился на момент нажатия.
Надеюсь понятно объяснил. спасибо за помощь.

Fernando Costa
20.12.2007, 15:35
С вас пиво

var abbleToDrag:Boolean = false
var currentClickX:Number = 0;
_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)
}
_root.onMouseUp = function(){
abbleToDrag=false
}

_root.onMouseMove = function(){
if(abbleToDrag)
mc.gotoAndStop(-currentClickX + Math.floor(_xmouse))
}

ludankov
20.12.2007, 15:57
Все отлично только мувик все равно берет значение положения курсора и перепрыгивает. А нужно как то сохранить текущий кадр и прибавлять к нему то число которое в вашем коде получается. Может нужно ввести еще одну пременную, которая выводит текущий номер кадра и ввести ее в рассчет. То есть прибавлять как раз к ней. Спасибо. Пиво за мной.

Fernando Costa
20.12.2007, 16:09
var abbleToDrag:Boolean = false
var currentClickX:Number = 0;
var lastClickReleaseX:Number = 0;

_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)
}
_root.onMouseUp = function(){
abbleToDrag=false
lastClickReleaseX = Math.floor(_xmouse)
}

_root.onMouseMove = function(){
if(abbleToDrag)
mc.gotoAndStop(-currentClickX + Math.floor(_xmouse) + lastClickReleaseX )
}

ludankov
20.12.2007, 16:19
Вот так работает
stop();
var abbleToDrag:Boolean = false
var currentClickX:Number = 0;

_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)
}
_root.onMouseUp = function(){
abbleToDrag=false
}

_root.onMouseMove = function(){
if(abbleToDrag)
mc.gotoAndStop((-currentClickX + Math.floor(_xmouse))+ mc._currentframe)
}
Только почему то не по всей площади окна. Если у вас так же напишите может этот глюк совсем не из-за кода. Еще раз спасибо за помощь.

Fernando Costa
20.12.2007, 16:59
я не могу протестировать, у меня нет мувика со столькими кадрами, приаатачьте исходник - поковыряюсь

ludankov
20.12.2007, 17:18
stop();
var abbleToDrag:Boolean = false
var currentClickX:Number = 0;

_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)
}
_root.onMouseUp = function(){
abbleToDrag=false
}

_root.onMouseMove = function(){
if(abbleToDrag)
mc.gotoAndStop(((-currentClickX + Math.floor(_xmouse))/10)+ mc._currentframe)
}
Данный код построен на отношении кадр - пиксель. Размер документа 720 х 576px, кол-во кадров 360. Приходится делить полученное число в коде на 10 и более, чтобы диапазон вращения мышкой был достаточно большим, а не на 10% длины окна. При этом выполнение кода происходит очень медленно и все тормозит. Подскажите плиз как оптимизировать этот код. Я бы скинул сам файл только он весит почти 2 mb. Прикрепить такой файл тут нельзя. Могу конечно выслать на электронку, если для вас не геморно.
Да чуть не забыл может подскажите как сделать чтобы мувик не останавливался на последнем кадре а проигрывался циклично, когда его крутят мышкой.

Fernando Costa
20.12.2007, 17:32
Конечно будет тормозить - столько фоток скроллить.
Можно попробовать заменить onMouseMove на onEnterFrame.

у вас размер документа как раз больше кол-ва кадров в 2 раза - очень удобно с ним работать

ludankov
20.12.2007, 18:04
Извиняюсь не прав если делить на 10 вообще не так как надо работает. Дело не в кол-ве кадров. Если не делить все очень быстро работает. Просто надо придумать как по-другому увеличить дипазон для курсора. Чтобы можно было таскать более точно. Сейчас получается что весь ролик прокручивается если провести мышкой приблизительно 1/10 длины документа, а хотелось бы чтоб проигрался когда проводищь мышкой от края до края.
Не могли бы вы скинуть пример кода как это реализовать на onEnterFrame.

Fernando Costa
20.12.2007, 18:11
mc.gotoAndStop((-currentClickX + Math.floor(_xmouse)+ lastClickReleaseX)/2)
- этого не достаточно?

ludankov
20.12.2007, 18:26
Так он перескакивает. Сами посчитайте вы задаете число - кол-во пикселей на которое сместилась мышка прибавляем число текущего кадра и делим все это на два. Пример в цифрах: Клип находится на 170 кадре нам надо прокрутить его на 20 кадров, значит мы должны оказаться на 190 кадре. А что получается у нас 170(текущий кадр)+ 40(1кадр-2пикселя)/2=105. Мы не только не прибавляем кадров, а отскакиваем назад. Давайте я скину вам проект сами увидете.

Fernando Costa
20.12.2007, 18:30
мейл в личке

ludankov
20.12.2007, 18:43
отправил. В принципе если кол-во кадров уменьшить действительно меньше тормозит. Только сейчас не получается сделать чтоб когда он доходит до 360 перескакивал на 1 и проигрывался дальше. Вобщем зациклить.

Fernando Costa
20.12.2007, 19:24
ну если я вас правильно понял то

stop();
var abbleToDrag:Boolean = false
var currentClickX:Number = 0;
var lastClickReleaseX:Number = 0;

_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)/2
}
_root.onMouseUp = function(){
abbleToDrag=false
lastClickReleaseX = Math.floor(_xmouse)/2
}

_root.onEnterFrame = function(){
if(abbleToDrag){
mc.gotoAndStop(Math.abs((-currentClickX+lastClickReleaseX + Math.floor(_xmouse)/2)%346))
}
}

ludankov
21.12.2007, 00:26
Если вы получили файл то наверно сами видите что это не работает. Почему вы используете переменную lastClickReleaseX. С ней мувик опять перескакивает.
stop();
var abbleToDrag:Boolean = false
var currentClickX:Number = 0;

_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)/2
}
_root.onMouseUp = function(){
abbleToDrag=false
}

_root.onMouseMove = function(){
if(abbleToDrag){
mc.gotoAndStop(Math.abs((-currentClickX + mc._currentframe + Math.floor(_xmouse)/2)%346))
}
}

Вот так работает. Но все таки использование onEnterFrame не то что нужно. Лучше с onMouseMove. А насчет 346% я не совсем понял откуда это число взялось, но так работает намного быстрее. Остался один вопрос как сделать чтобы он продолжал вращение без остановки. Возвращаясь к сайту бмв у них модель может прокручивать в одну сторону и она не останавливается когда сделает полный оборот на 360 градусов.

stop();
var abbleToDrag:Boolean = false
var currentClickX:Number = 0;
var cadr:Number = 0;

_root.onMouseDown = function(){
abbleToDrag=true
currentClickX = Math.floor(_xmouse)/2
}
_root.onMouseUp = function(){
abbleToDrag=false
}

_root.onMouseMove = function(){
if(abbleToDrag){
cadr = Math.abs(-currentClickX + mc._currentframe + Math.floor(_xmouse)/2)
if(cadr>173) {
mc.gotoAndStop (1)
}
if (cadr<1) {
mc.gotoAndStop (172)
}
mc.gotoAndStop(cadr)
}
}

Этот код позволяет прокручивать в одну сторону, но как то коряво работает. Иногда заедает. Может у вас есть соображения как его улучшить. Надеюсь мысль в коде ясна.
Спасибо за помощь.

Fernando Costa
21.12.2007, 13:32
фууух, щас башка не варит насчет математики, вот это вставте сразу вначале функции маусмув. Это чтобы мувик крутился сам если мышка ушла за пределы ролика:
if(_xmouse>346){
mc.play()
return
}
if(_xmouse<0){
mc.play()
return
}