PDA

Просмотр полной версии : движение рисунка под маской влево/вправо не выходя за границы


priroda
08.05.2008, 18:10
Господа флэшеры, прошу о помощи.
Я уже спрашивала об этом, но так и не могут мне помочь. Да и сама разобраться не могу.

Дан рисунок длинной больше *2 чем маска под которой он лежит.
У меня не получается сделать так, чтоб при отводе из рамки - плавное движение продолжалось до той координаты, на которой вышли за пределы рамки. И ещё очень важно - когда посылаем мышь в правый/левый конец рамки(но не выходим за него) - картинка должна дойти до своего конца(не дальше), чтоб не было пустого пространства. т.е. чтоб не уезжала дальше чем надо.

Всё вроде понятно как сделать когда описываешь так подробно. Но данное действие как мне советовали лучше делать так как я уже сделала(см. исходник). Но какие либо правильные преобразования я не могу туда внести. Очень жду от Вас помощи и советов

Psycho Tiger
08.05.2008, 18:38
Пардон, можно несколько уточнений?

Дан рисунок длинной больше *2 чем маска под которой он лежит.

Звездочка означает "в"?

У меня не получается сделать так, чтоб при отводе из рамки - плавное движение продолжалось до той координаты, на которой вышли за пределы рамки.

Если я правильно понял, когда мышь уходит ЗА рамки мы больше не скролируем?
Самый простой способ (но не самый быстродейственный):

mc.onEnterFrame=function():Void{
if (this.hitTest(_xmouse,_ymouse,false)){
//тогда крутим
}
}



И ещё очень важно - когда посылаем мышь в правый/левый конец рамки(но не выходим за него) - картинка должна дойти до своего конца(не дальше), чтоб не было пустого пространства. т.е. чтоб не уезжала дальше чем надо.


Ну тут уже надо взять листик, бумажку и подумать. Вот куда рыть:
Если выровнять скролируемый мувик (относительно его центра) по левому краю, и рамку так же, то:
При _х рамки == _х мувика это левая граница. Есть граница - можно составить условие, куда мы не можем уйти двигая рамку
При _х мувика == ширине рамки мы имеем правый край. Есть граница - можно составить условие, куда мы не можем уйти двигая рамку.
Большим помочь не могу, ибо убегаю. Удачи.

Mnilionic
08.05.2008, 21:24
считаем коэффициент соотошения ширины маски к ширине картинки
при движении мышки по области маски считаем dx картинки относительно dx маски используя полученный коэффициент + разница между шириной картинки и маски.

priroda
09.05.2008, 17:14
to "psycho tiger" - когда отводим, скрол не прекращается. иначе движение будет обрывистым - в этом одна из проблем.
to Mnilionic - ваши слова похожи на истину. Дело в том что всё это крутится и в моей голове. Написала сюда - хочется немного конкретнее. с логикай у меня всё в порядке пока. Проблема в реализации.
так же надеюсь услышать советы и пожелания тех, кто уже встречался с такой задачей. Прошу Вас, не проходите мимо

Mnilionic
09.05.2008, 23:15
Задавайте конкретные вопросы, что именно не получается?

priroda
10.05.2008, 00:03
Mnilionic Хорошо. Вот ситуация с которой я не могу справиться. Я представляю себе логически как это реализовать, но синтаксически с помощью AS - не получается. слишком много должно быть всего связано


каким то образом надо выяснить размеры маски. вопрос - каким? и как это потом соотносить с дальнейшим передвижением мувика под маской? -> (можно усложнить задачу и пытаться сделать формулу для загружаемого swf под эту маску, что бы работало правильное движение будь то в 1,5 раза больше маски или в 5, НО Я К ЭТОМУ пока не стремлюсь. Это Очень сложно, я понимаю)
И по-этому размер "рисунка" под маской будет фиксированным(и все координаты можно подогнать.)

Необходимо чтоб отводя от маски курсор - движение не прекращалось а каким то образом с помощью функции "запомнить координату" и продолжать медленное на уменьшение движение до данной координаты.

Ведём мышь влево - мувик с рисунком двигается вправо и наоборот. именно так. я ничего не напутала.

Мне кажется, надо сделать несколько функци которые бы отслеживали _наведение_ на маску _отведение_, ну и функцию самое главное, которая бы отвечала за правильное* движение.

*Дело в том что движение может быть либо очень резким вначале либо очень заторможенным. Но ведь и может быть "растянутым" относительно всей длинны мувика под маской. Вот про эту растянутость я и говорю как правильное.

Да, звучит всё очень сложно..

PS НЕ получается это всё написать на языке програмирования

Мне правда очень сложно одной разобраться. Очень вас прошу

Mnilionic
10.05.2008, 00:26
маска делается програмно. маскируемый_клип.setMask(клип_маска);
размеры получаются елементарно (свойства _width, _height)
рабейте задачу на этапы:
сначала сделайте чтоб просто картинка под маской каталась за мышкой.
потом добавте плавности перемещения картинки
//

Создайте мувиклип.
Внутри него создайте ещё два мувика:
1. mc_mask - клип с маской
2. mc_image - клип с картинкой

скрипт для ФРЕЙМА:

// устанавливаем картинку и маску в нулевые координаты
mc_image._x = 0; mc_image._y = 0;
mc_mask._x = 0; mc_mask._y = 0;
// делаем маску
mc_image.setMask(mc_mask);
// получаем широты
var w_image = mc_image._width;
var w_mask = mc_mask._width;



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

priroda
10.05.2008, 00:51
Даа, на этом моя логика заканчивается. Я просто не имею представления каким образом использовать эти "широты". Как?

т.е. если я поняла правильно - речь идет об коэфиценте? Вопрос как его использовать. Ну и получить конечно его не мешает мне. Я просто правда немного не понимаю, как это сделать

Mnilionic
10.05.2008, 01:21
Заете что такое масштаб? видели карты? там внизу иногда подписывают 1:2000
это и есть коэффициент - означает, что на один сантиметр карты приходится 2000см местности.
То бишь проведя пальцем на 3см по карте мы укажим путь на местности в 6000см

тут у Вас тоже самое: маска - это карта, картинка - это местность
нам нужно узнать на сколько двигать картинку если знаем насколько подвигали мышку по маске.

коэффициент - это соотношения одного чего-либо к другому, в данном случае широт картинки и маски
k = ширина_картинки / ширина_маски
, но так как у нас соотношение идёт относительно не точки, а отрезка (ширина маски, тоесть левая сторона маске соответсвует левой стороне картинки, а правая правой), то к равен:

var k = (w_image - w_mask)/w_mask;

теперь для того чтоб узнать на какую координату сдвигать картинку, нужно координату мышки (в момент когда она над маской) умножить на полученный коэффициент.

priroda
10.05.2008, 13:43
Mnilionic Здравствуй.
Я попробовала сделать всё что было сказано.
Но что то помоему в коэфиценте не так. Почему то изображение не хочет двигаться до конца влево и доконца вправо.
Посмотри пожалуйста свф.
Что очень странно - координаты х на 00, а при набоде на маску - картинка смещается в минус и фиксируется там.

(я обновила файл в первом своём сообщении)

crc
10.05.2008, 14:24
Для решения данной задачи нужно минимальное знание математики и немного логики, и если столь несложные задачки вызавают вопросов на 50 строчек... И проблема ваша вовсе не во флэшевой реализации, а в составлении алгоритма, советую задуматься.

А, да, вот примерчик сделал. 4 строки кода и две формулы...

priroda
10.05.2008, 18:45
Смотрите что получилось. Я сделала перемещение)
Проблема вот в чём: вот доведите мышью до конца маски, выдите за пределы, сдвиньте мышь обратно в область маски с самого края. ДЕЛО В ТОМ что перемещение рисунка под маской начинается пропорционально всей ширины _рисунка_. А я так понимаю надо сделать сравнение скорости перемещения(реагирования) относительно ширины _маски_. Т.е. чем ближе к центру _маски_ тем движение ГАСНЕТ. Также гаснет и когда мышью водишь скраю этой маски.

Вы понимаете о чём я?


to crc. как оказалось такой пример, кот. выложили вы - не вызавает трудностей. Я сделала как оказалось позже известно тоже самое только на основе подсказок Mnilionic'a.
Спасибо конечно, всё оч. красиво, но это лишь промежуточный рез-т. Причём уже достигнутый.
Главная задача - составить правильный алгоритм скорости. Мне сложно, поэтому и обращаюсь за помощью к тем, кто имеет с этим дело и знает чем мне помочь.

Может мне стоит спросить об алгоритме? Наверняка вы видели подобные движения моему описанию.

Mnilionic
11.05.2008, 00:56
priroda, ваша прикреплённый фаил куда-то делся.. его нету в первом сообщении.

по поводу скороси.. у Вас перепутались два варианта решения задачи:
1. когда мышка задаёт координату перемещения - маска является проекцией картинки с точным масштабом (левая точка маски == левая точка картинки и так же с правыми)
2. когда мышка задаёт скорость прокрутки - в центре маски скорость прокрутки ровна 0, а чем ближе к краю маски тем скорость выше.

я вам обьяснял первый вариант.

priroda
11.05.2008, 15:37
Да, вот второй вариант - то что нужно. Я понимаю что делать это никто не захочет - но может кто то уже встречался с данной задачей. Вот ко второму мне и хотелось бы придти. Не уделите мне еще немного своего времени,Mnilionic - дадите пару рекомендаций, практических? Ведь мы уже так близко)

Mnilionic
11.05.2008, 17:23
В вашем примере именно "Первый вариант"

а на вашей "желаемой диаграмме" второй, тока хитрый.
чем боьше отклонение мышки от центра маски тем выше скорость.
а так же,
когда картинка "подкатывается" к краю, плавно гасим скорость.

ищите центр маски, задавайте поля "тормажения"

priroda
11.05.2008, 18:59
так и что потом с этим делать?
Как это всё в одну формулу "заталкать"

Mnilionic
11.05.2008, 23:34
ненужно ничего толкать.
нужно придумать очерёдность действий на бумажке.
а потом написать скрипт.

сидите думайте.

KoLar
11.05.2008, 23:46
Формулы можно взять из физики :)

Aisaid
12.05.2008, 14:54
priroda, может вам подойдёт такой вариант ?:
http://www.sephiroth.it/tutorials/flashPHP/scrollRect/

priroda
12.05.2008, 18:36
Именно! Чёрт возьми! извините, я вообще не ругаюсь. Я.. А это не actionscript3? у меня flash8

Кстати физика - это прекрасно) когда знаешь куда смотреть) и как смотреть, что бы это увидеть)
Aisaid, у меня ошибку. Выдаёт.

Classes may only be defined in external ActionScript 2.0 class scripts.
class Slider2
Скажите что это означает?
PS Mnilionic, я бы правда на бумажке и близко такого не написала. А ведь это то что мне нужно.

Aisaid
12.05.2008, 19:27
классом пользоваться очень просто, вот пример

priroda
30.05.2008, 00:27
Aisaid, спасибо

Хочу спросить кое что ещё. не могу разобраться сама.
Дело в том что, работа в отдельном текстовом док-те меня сильно сбивает с толку. Я не могу сообразить в каком месте надо прописывать выгузку картинки. если мне это понадобится.
точнее каким образом написать эту операцию?

и еще, в каком месте можно описать прелоадер на загрузку картинки?
т.е. в slide3.as или в самом flash? но если в slide3.as то как туда обратиться. к конкретной функции. может я чтото не понимаю, и всё немного легче.
подскажите пожалуйста

Aisaid
30.05.2008, 15:29
priroda, в slide3.as вам лезть незачем, если не знаете что хотите там править... :)
писать весь код желательно в первом кадре таймлайна - вам же легче будет. (хотя на самом деле никаких правил на этот счёт нету)
в примере видно как загружается картинка, таким же образом вместо картинки можно загружать мувиклип (swf) и он будет скролится и работать в этом окошке...
чтобы удалить обьект скролирования по моему нужно писать: delete имя_вашего_скролла;
удачи

priroda
30.05.2008, 23:14
да да да, кстати я у же поэксперементировала и научилась всталять свф.
вот а по поводу delete.
писала delete Slide3 | delete www2 | что только не писала - не удаляет. может надо unLoadMovie? только я не знаю куда это писать

PS пожелав удачи, это значит как бы всё?)

Aisaid
02.06.2008, 20:00
priroda, я пользовался этим классом в мувиках которые загружались, а потом полностью выгружались, да и вообще не приходилось удалять созданное классами (я с ними, классами, не очень дружу)
поэксперементировав немного пришёл к выводу, что пока неизвестен другой метод нужно пользоваться анлоадМуви...

п.с. удачи можно желать и не прощаясь, вы не знали? :)

priroda
03.06.2008, 16:10
вам надо это скачать и прочесть в первом кадре

ps ..ну теперь знаю)