PDA

Просмотр полной версии : Горизонтальный скролл. Как сделать плавный старт и конец прокрутки?


Art_133
12.12.2008, 01:24
Добрый вечер. Делаю скрол своими силами и знаниями. Но знаний не много в программировании (я больше аниматор) по этому за возможно ужасный код прошу не бить, а поправить если есть возможность.
В общем сейчас всё работает, но мне нужно как бы плавный старт и финиш прокрутки. Как это можно реализовать я примерно понимаю, но думаю было бы правильным спросить у профи что бы код не выглядел ещё ужаснее.

Вод собственно код:
var posX:Number = scrolled._x;
var scrolledWidth = scrolled._width;

var dif1 = Math.floor(scrolled._x-(scrolled._width-masker._width));
trace(dif1);

scrolled.setMask(masker);

r_arrov.onRollOver = moveRight;

r_arrov.onRollOut = function() {
delete onEnterFrame;
};

l_arrov.onRollOver = moveLeft;

l_arrov.onRollOut = function() {
delete onEnterFrame;
};

function moveRight() {
onEnterFrame = function () {
if (scrolled._x<posX) {
scrolled._x += 1;
}
};
}

function moveLeft() {
onEnterFrame = function () {
if (dif1<scrolled._x) {
scrolled._x -= 1;
}
};
}

И исходник. За ранее спасибо!

Mnilionic
12.12.2008, 02:24
исходник восьмёрки давайте.

Art_133
12.12.2008, 12:12
Исходник под 8-й

Art_133
12.12.2008, 16:42
Не ужели никто не может помочь? Я не прошу написать код за меня, просто по советуйте (если не сложно) примерный путь решения задачи...

Mnilionic
12.12.2008, 17:12
ну вы сделайте тогда как понимаете, а я "ужасный код" причешу :)

Art_133
12.12.2008, 17:31
Хорошо, вы сами на просились)
По путно возник ещё 1 вопрос.
Если Вам не сложно запустите ролик. Вы уведите что сама лента с картинками ровно по краям скрывается под маской. Но по всей видимости в результате не правильныйх округлений когда лента стопорится потому что закончились картинки и его края заезжают в область маски, тоесть такое не большое смещение(другими словами пустое место после окончания ленты видно под маской(примерно 1 пиксель)). Как это можно поправить?

Enfriz
12.12.2008, 20:52
Делать было нечего, поэтому написал вам эту функцию.
К сожалению исходник только CS3, потому что мой CS4 не умеет сохранять в 8м формате.

Но если что, напишу код тут. Просто сотрите все, что у вас есть, и вставьте этот код. Проверял - работает.

friction = 50;//степень торможения. Чем больше число, тем дольше тормозит.
long = 50;//длина пробега торможения, тоже влияет на скорость движения. Чем длиннее пробег, тем больше сокрость.

//соотоншение long/friction будет задавать скорость движения самой линейки. Чем больше это отношение, тем выше скорость.

left = Math.floor(scrolled._x-(scrolled._width-masker._width));//координата левого крайнего положения
right = scrolled._x;//и правого

scrolled.setMask(masker);//ставим маску
current = right;//координата текущего положения

l_arrov.onRollOver = function() {
current = long/friction;//в данном случае current будет скоростью движения
movingleft = true;
movingright = false;
};

l_arrov.onRollOut = function() {
c = scrolled._x-long;
if (c<left) {
current = left;//чтобы не зашло за край
} else {
current = c;//текущее положение минус длина пробега, чтобы линейка успела затормозить
}
movingleft = false;
movingright = false;
};

r_arrov.onRollOver = function() {
current = -long/friction;//все аналогично
movingleft = false;
movingright = true;
};

r_arrov.onRollOut = function() {
c = scrolled._x+long;
if (c>right) {
current = right;
} else {
current = c;
}
movingleft = false;
movingright = false;
};
_root.onEnterFrame = function() {
if (movingleft or movingright) {
if (scrolled._x<left+long && movingleft) {
distance = scrolled._x-left;//в случае приближения к краю начинается торможение
scrolled._x -= distance/friction;
} else if (scrolled._x>right-long && movingright) {
distance = right-scrolled._x;//аналогично
scrolled._x += distance/friction;
} else {
scrolled._x -= current;//обычное линейное движение (далеко от краев)
}
} else { //торможение при отпускании стрелки
distance = scrolled._x-current;//расстояние до точки, к которой стремится линейка
scrolled._x -= distance/friction;
}
};

Art_133
12.12.2008, 21:22
Огромное спасибо. Сейчас гляну.
Да, всё супер. Ещё-раз спасибо Вам. Смотрю на Ваш код и сравниваю со своим и понимаю что это было не ужас, а просто кошмар. Буду учиться...

Art_133
24.12.2008, 13:19
Возник ещё 1 момент который бы хотелось уточнить.
В данный скрол я загружаю картинки через xml. С этим нет проблем. Но появилось условие: нужно что бы скрол был зацикленным. Я поместил все клипы в один контейнер (созданный руками, не программно). Думал сделать 2 дубликата который поставить с лева основного мувика и соответственно с права основного мувика. Каждый раз когда скрол доходит до левого края (к примеру) его перебрасывает на такой-же кусок только с права. Таким образом осуществляется зацикленность (это всё с теории).
Но как только я начинаю дублировать мувик в который загрузил картинки он дублируется но пустым, то есть таким как был до загрузки в него картинок.
Прилогаю код на загрузку картинок:
Blok1 -мувик который пытаюсь продублировать.
var my_xml:XML = new XML();
my_xml.ignoreWhite = true;

my_xml.load('content.xml');
my_xml.onLoad = function(success:Boolean) {
if (success) {
var xml = my_xml.firstChild.childNodes;
var xml2 = my_xml.childNodes[1].childNodes;
for (var i = 0; i < xml2.length; i++) {
var newX = i * (_root.scrolled.block1._item._width + space);
diplicate = _root.scrolled.block1._item.duplicateMovieClip('_item' + i, i, {_x:newX});
diplicate.mc.loadMovie(xml2[i].attributes.pic);
diplicate.lnk = xml2[i].attributes.url;
diplicate.onRelease = function() {
getURL(this.lnk, '_blank');
trace(this.lnk);
scrollingOn = true;
};
}
} else {
trace('error');
}
};

Помогите советом. Спасибо.

Wolsh
24.12.2008, 19:25
И чему Вы удивляетесь? В хелпе же черным по белому написано - загруженный контент не дублируется методом duplicateMovieClip. Вы совершенно верно обратились к битмапдате - она как раз дублируется сколько угодно. Только еще раз повторюсь - выбросьте loadMovie! Не портите себе жизнь.

Art_133
24.12.2008, 23:06
Спасибо)
То есть схема такая: Гружу всё при помощи MovieClipLoader и потом с этого общего клипа где всё находится делаю битмап дату и уже её дублирую?

dimarik
24.12.2008, 23:37
Вопрос может быть не в тему, не читал все посты, но вопрос такой: чем отличается горизонтальный скролл от всех остальных типов скроллов?

Art_133
25.12.2008, 02:30
Горизонтальный значит прокрутка располагается вдоль линии горизонта. С лева на право или на оборот (к примеру).

etc
25.12.2008, 14:14
Горизонтальный значит прокрутка располагается вдоль линии горизонта. С лева на право или на оборот (к примеру).
Вопрос был не про внешний вид, а про логику.

Wolsh
25.12.2008, 16:19
с этого общего клипа где всё находится делаю битмап дату и уже её дублирую?Интересно, а как Вы нажатия на отдельные картинки будете ловить, если они все вместе - один рисунок?

dimarik
25.12.2008, 16:21
Горизонтальный значит прокрутка располагается вдоль линии горизонта. С лева на право или на оборот (к примеру).

Эммм. А если я сделаю rotation градусов так на 30-35 CW, то как будет этот скролл называться?

Art_133
25.12.2008, 16:52
Тему так назвал для уточнения. Зачем придераться?

Добавлено через 57 секунд
Интересно, а как Вы нажатия на отдельные картинки будете ловить, если они все вместе - один рисунок?
Вот этот вопрос я и задал в моей второй теме. Как же тогда быть?

Wolsh
25.12.2008, 18:54
Ну само собой делать битмапдату с каждой загруженной картинки и потом ее аттачить в отдельный ее собственный клип (в вашей легенде получается в три клипа - в центральном, левом и правом блоке - и получите три одинаковых блока)

Tomkin
31.08.2009, 21:23
А у меня другая проблемка, нужен вертикальный скролл,даже два)), а между ними собственно сами фотки, я довольно туго шарю в скриптах, я думала просто переделать х на у, лефт на топ , а райт на боттом, если конечно это выход))), но оказалось нет))))

Если кто -то может помочь, буду очень признательна, и главное как западло, нужно очень срочно,

могу прислать исходник, сюда не грузится(большой наверно(((((( только образно (fg)
заранее спасибо всем кто откликнется