PDA

Просмотр полной версии : Пропорциональное изменение в резиновом ролике.


Olejan
24.04.2006, 18:25
Прочитал статью:
"создание "резиновых" (эластичных) флэш роликов"
http://noregret.org/tutor/elastic/

Хорошая статья - спасибо автору (только Flash у меня 7)! Очень помогла.
Только вот надо мне чтобы при изменении размеров окна, мувик в ролике изменялся пропорционально как по ширине, так и по высоте.
Как это сделать - в вышеуказанном рецепте не было написано - а я (всилу малой концентрации серого вещества в голове :D ) не могу до этого додуматься - подскажите, пожалуйста.
Прилагаю свой файл (Flash 7). - хотелось бы, чтобы красный круг в моем файле, при изменении размеров окна, изменялся бы пропорционально как по ширине, так и по высоте.

DimZ
24.04.2006, 18:45
для это как раз ни чего делать не надо!
код ни какой не нужен.
при изменении окна флешпроигрывателя меняется и размер всех объектов

Olejan
24.04.2006, 18:54
2 DimZ:
Все не так-то просто!
нужно сделать пропорциональное изменение размера только у красного круга, оставив, при этом, все что есть в рецепте с теми свойствами:
http://noregret.org/tutor/elastic/ (см. мой исходник)
Т.е. все остальные объекты, которые есть в исходнике должны изменять свои размеры при изменении размеров окна так, как это сейчас.
Вот как это сделать - не знаю!

DimZ
24.04.2006, 18:59
вот может тебе это поможет

Olejan
24.04.2006, 19:03
Вряд ли поможет... У меня флэш 7-ой! открыть не могу!

Olejan
24.04.2006, 21:02
Кто-нибудь: ПОМОГИТЕ!!!

silin
24.04.2006, 21:20
а че кричать-то..
>>все остальные объекты, которые есть в исходнике должны изменять свои размеры при изменении размеров окна так, как это сейчас.
думаешь это можно понять?
не понятно в чем трабл: определяешь _widthRatio/_heightRatio пропорции мувика меняются, не определяешь- не меняются..

Olejan
24.04.2006, 21:29
2 silin:
Поясняю проблему:
Исходник, который я выложил был написан почти в точности с рецептом, приведенным на странице:
http://noregret.org/tutor/elastic/

В том примере круг (объект circle) изменялся не пропорционально свои исходным размерам, то есть при растяжении окна по горизонтали - круг становится вытянутым по горизонтали овалом, при растяжении окна по вертикали - круг становится вытянутым по вертикали овалом.
А мне надо, чтобы круг всегда оставался кругом! При этом другие объекты продолжали изменять свои размеры и положения согласно прописанному в рецепте и моем исходнике коде.
Надеюсь, сейчас ВСЕ понятно, подробнее некуда.
Помоги, пожалуйста...

silin
24.04.2006, 21:35
наверное, я чего-то не догоняю:
если убрать строчки (не определять для circle _widthRatio/_heightRatio)
circle._widthRatio = circle._width/resize_obj.normal_width;
circle._heightRatio = circle._height/resize_obj.normal_height;
то круг не меняет своих пропорций.., что еще?

Olejan
24.04.2006, 21:44
Как раз, надо чтобы круг менял свои пропорции. Только ширина пропорционально высоте. Так же как и без резинового флэша, то есть если взять обычный флэш-ролик, то при изменении его размеров - объекты масштабируются пропорционально.
P.S. Только не говорить: "сделай флэш без кода совсем."
Нет одни объекты должны не изменять свои размеры, но всегда, например быть слева/справа/сверху, менять только высоту, а вот круг должен масштабироваться пропорционально!

silin
24.04.2006, 22:01
так бы сразу и сказал..

Olejan
24.04.2006, 22:24
Не правильно, нужно отталкиваться и от ширины, и от высоты. Я думаю надо замерять коэффициент на который увеличивается/уменьшается область ролика, и умножать размеры круга на этот коэффициент, хотя нет... В общем при изменении только ширины (только высоты) - круг не должен изменяться в размерах. При этом, если мы изменяем ширину ролика (как я уже сказал ничего не происходит), потом меняем и высоту - вот тут круг тоже начинает изменяться. Чтобы, напр. круг немного пропорционально увеличился - надо увеличить и ширину и высоту ролика.
То есть надо смотреть на объекты в обычном ролике (где нет резиновости!)...
Может это нам поможет? (все-таки, еще надеюсь, что нам... :), а не мне!)

silin
24.04.2006, 22:57
как вариант: масштабируем круг пропорционально меньшему из изменений Stage (width || height)..
зы: принцип понятен?, остальное дело рук..

Olejan
24.04.2006, 23:34
Принцип не понятен! Иногда, при изменении размеров ролика вообще круг занимает всю область ролика.
Идею понять не могу! В любом случае надо что-то менять...

silin
24.04.2006, 23:39
принцип прост: при изменении размеров Stage, зная предыдущие размеры (запомнили при предыдущем изменениии), вычисляем как должен измениться объект (в зависимости от твоих конкретных задач)..

Olejan
24.04.2006, 23:50
Конкретная задача такая: круг должен немного увеличиваться / немного уменьшаться при увеличении/уменьшении ролика.
Такого, чтобы круг занимал всю сцену быть не должно.
Что подскажешь?

silin
25.04.2006, 00:01
да я уже все, что мог подсказал..
ты хочешь, чтоб кто-то сделал ?
оч. может быть, что кто-нибудь и сподобится, подожди..

дядя Джо
25.04.2006, 00:14
Интересно, а умеет ли товарищ решать поставленные задачи? Или он только умеет их ставить? Вот вам задание: опишите все свойства объекта Stage и правила их использования, для начала, а мы проверим как вы справитесь, и на высшем уровне решим, можно ли таким как вы помогать.:moder:

Olejan
25.04.2006, 00:14
Что обижаться?..
Ты же сам говорил: "в зависимости от твоих конкретных задач"
Вот я и сказал свою конкретную задачу - думал, просто ты подробности разъясняешь...
Я тебе очень благодарен! СПАСИБО!
Если не сложно, может что-нибудь все-таки подскажешь...

Olejan
25.04.2006, 00:30
2 дядя Джо:
Объект Stage, его свойста (выделены полужирным) и правила его использования:

Stage.addListener(myListener:Object) : Void
Stage.align:String
Stage.height:Number
myListener.onResize = function(){
// ваш код
}
Stage.removeListener(myListener:Object) : Boolean
Stage.scaleMode:String
Stage.showMenu:Boolean
Stage.width:Number

Я хочу изучить AS и изучаю его! Разве плохо то, что после моих поисков я ставлю конкретные задачи, помогающие мне разбираться в скрипте?!!
По-моему форумы такого рода нужны, чтобы помогать людям осваивать Flash, а не критиковать их попытки при обучении!!!
:rtfm:

дядя Джо
25.04.2006, 00:36
Дорогой товарищ, нам ваши благодарности никчему, и нечего тратить на них силы, и выводить здесь такими плакатными буквами. Нас больше интересуют ваши успехи в труде, родина ждет от вас новых флэш фильмов! И если вы будете стараться, у вас все получиться и никто на вас обижаться не будет, а наоборот сами будете получать благодарности!

дядя Джо
25.04.2006, 00:46
2 дядя Джо:По-моему форумы такого рода нужны, чтобы помогать людям осваивать Flash, а не критиковать их попытки при обучении!!!
:rtfm:Тварищ, вас никто не криткует, не горячитесь. Мы наоборот вам помогаем! :) Если вы действительно хотите изучать флэш, то должны быть готовы к трудностям, и настроиться на то чтобы их решать. А постясь на форумах большими буквами ПАМАГИТЕ, так вы далеко не уедите, а будете похожи на временное правительство, о котором великий Ленин написал брошюру под названием "Шаг вперед два шага назад".:D И копипэйстом методы и свойства тоже освоить трудно, кстати.

Olejan
25.04.2006, 01:12
2 дядя Джо:
Надеюсь мы поняли друг друга, дорогой товарищ!

Nox Noctis
25.04.2006, 14:17
Нет одни объекты должны не изменять свои размеры, но всегда, например быть слева/справа/сверху, менять только высоту, а вот круг должен масштабироваться пропорционально!
тебе нужно, чтобы высота круга была всегда равна его ширине.
то есть, чтобы пропорция высоты и ширины круга была одинаковой. тебе надо выбрать, чему будет пропорционален круг - высоте или ширине сцены.

если круг пропорционален ширине сцены - значит задаем ему _widthRatio, а при изменении ширины следующей строчкой пишем: circle._height = circle._width.

если круг пропорционален высоте сцены - значит задаем ему _heightRatio, а при изменении высоты следующей строчкой пишем: circle._width = circle._height.

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

Olejan
25.04.2006, 15:33
2 Nox Noctis:
Запусти ОБЫЧНЫЙ swf-файл и растягивай его - обрати внимание на то, как изменяются объекты - я никак понять не могу - там ведь он пропорционально изменяется свои размеры. Все до безобразия просто - не нужна никакая резиновость. Но как только добавил резиновость (уже сто раз писал, что без этого не обойтись!) в соответствии с твоим примером, так такой (казалось бы естественный эффект невозможен что-ли?!!)
То есть я не должен выбирать чему будет пропорционален круг (Запусти ОБЫЧНЫЙ swf-файл и растягивай его...)

Nox Noctis
25.04.2006, 15:58
а, понял о чем ты.
делать нужно практически то же, что я описал выше, только если ты хочешь добиться такого же поведения, как у "обычного" ролика, тебе нужно при установке размеров выбирать, чему в данный момент пропорционален круг.

в обычном "ролике" всегда удерживается пропорция сцены. то есть, если исходная сцена была 10 на 20, то пропорция её будет всегда 1 к 2. и соответственно объекты ресайзятся не относительно размера _окна_ (как в моем рецпте) а отоносительно размера "недеформированной" сцены.

короче. вот что нужно делать:
if (Stage.width/Stage.height<resize_obj.normal_width/resize_obj.normal_height) {
circle._width = Stage.width*circle._widthRatio;
circle._height = circle._width;
} else {
circle._height = Stage.height*circle._heightRatio;
circle._width = circle._height;
}
т.е. если при ресайзе окна высота сцены вытянулась больше, чем ширина (относительно нормальных показателей), то нужно, чтобы круг был пропорционален ширине. ну и наоборот.

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

Olejan
25.04.2006, 18:21
Нужный эффект достигнут. Спасибо.
Только вообще-то мне надо не круг масштабировать - а объект с неодинаковыми сторонами. И вот что я придумал! Не мудрствуя лукаво, я в мувике circle (допустим надо чтобы это был овал 100х200) на нижний слой поместил прозрачный квадрат 200х200, выровнял все по центру - и вуаля! Красный овал ведет себя, так же, как и без резиновости!
Я молодец!

Nox Noctis
25.04.2006, 18:26
Только вообще-то мне надо не круг масштабировать - а объект с неодинаковыми сторонами. И вот что я придумал!
всё проще.
вместо
circle._height = circle._width;
и
circle._width = circle._height;

надо писать:
circle._yscale = circle._xscale;
и
circle._xscale = circle._yscale;

Olejan
25.04.2006, 20:07
Спасибо! Посмотри, пожалуйста еще мой пост - тоже с твоего рецепта.
Что-то не получилось...
http://www.flasher.ru/forum/showthread.php?p=525599#post525599