Просмотр полной версии : Обратный зум
Привет! Не буду напрягать подробностями и просьбой писать большие скрипты. Нужен лишь толчок...
Сделал зум(картинка плавно увеличивается и отцентровывается в том месте, куда щелкнули). Прекрасный обратный зум можно сделать, заменив в некоторых местах знаки(+ на -). Казалось бы все отлично, но есть один большой нюанс...
Картинку в полном размере таскать по экрану не разрешается, увеличенную - можно и нужно(для просмотра). Но при щелчке её еще нужно плавно возвращать в оригинальный размер и на то самое место, где она стояла.
Вот, собственно, в этом и проблема. Как всегда плавно возвращать клип с картинкой, туда где он стоял, не зависимо от его текущих координат?
Psycho Tiger
22.04.2008, 13:44
Есть такая идея:
Tween class позволяет делать хорошие анимационные эфекты. Просто сделай движение по 4 свойствам твоей карты: _x, _y, _width и _height. Да, может быть карта будет зумироваться не идеально (хотя по моим представлениям должно быть шикарно), но в итоге она встанет на нужное место с нужной высотой и шириной.
Вариант, но я с ним как-то особо не работал. Пока разберусь...
Вот какого типа мне нужно сделать штуку - http://www.zinio.com/express3?issue=245411919&o=int&prev=sub
(там кликаешь на обложку - её можно крутить-вертеть и она ставится обратно)
Может еще есть варианты? Чую, можно по-простому, меняя _x и _y клипа относительно какой-то точкой, по формуле.. Но не представляю как )
Что-то я не понял, в чем проблема? Если формулы верны, картинка вернется к своему размеру (_xscale=_yscale=0) и в запомненные (если надо) координаты. Составьте правильно формулу - используйте не просто пошаговый зум от состояния на столько-то, а от состояния к цели.
Так я и не говорю, что знаю правильную формулу.. Есть догадки, во всяком случае, что-то приближенное к истине. Вот примерный кусок кода:
// Находим расстояние между новым положением картинки и дефолтным(28, 80 пох и по у, для полного, вмещаемого в окно размера)
var diff_x = _root.picMovie._x - 28;
var diff_y = _root.picMovie._y - 80;
// направление движение: если новое положение мувика левее/выше, то перемещать нужно вправо/ниже
var wayX = (diff_x < 28)? 1: -1;
var wayY = (diff_y < 80)? 1: -1;
// меняем знак - расстояние должно быть только положительным
diff_x *= (diff_x < 0)? -1: 1;
diff_y *= (diff_y < 0)? -1: 1;
var ratio_x = diff_x / diff_y; // узнаём как относится разница x к разнице y
var ratio_y = diff_y / diff_x; // по сути - узнаём шаг относительно другого
if (ratio_x > ratio_y) {
var step_x = ratio_x;
var step_y = 1;
} else
if (ratio_y > ratio_x) {
var step_x = 1;
var step_y = ratio_y;
}
// ну и двигаем
_root.picMovie._x += step_x*wayX;
_root.picMovie._y += step_y*wayY;
Код кривой, но думаю понятный. Смысл сводится к тому, чтобы большее расстояние разделить на меньшее расстояние и получить таким образом больший шаг, приняв меньший за единицу. Например, если новая позиция мувика гораздо дальше съехала по x, чем по y, то и скорость движения по x должна быть больше, дабы мув точно встал на своё место.
Беда одна - если в эту конструкцию включить изменения _x|_yscale, то картинка начинает себя странно вести.. При уменьшении съезжать в стороны и т.п. Да, и пример віше тоже не всегда себя корректно ведёт. Может есть лучший вариант?:umnik2:
Вообщем, проблему решил. Вышло не очень аккуратно, но зум очень быстрый, поэтому погрешностей сильно не видно. Зато без глюков, как с шагом. Смысл вот в чём(может кому еще интересно будет).
Перенесенный на новое место(точка B) клип можно вернуть к исходной точке(A), создав массив с координатами следования. Эти данные - число, полученное в результате деления суммы A и B на количество нужных нам шагов(чем больше, тем плавнее движется мувик). Единственное опять-таки возникающее НО - это изменение scale, которое клонит мувик в стороны в зависимости от точки привязки. Но это можно отрегулировать, каждый раз прибавляя/отнимая к точкам следования мувика какое-то число.
Нагородил ты.... много лишнего
Нагородил ты.... много лишнего
ну, покажи как проще...
а) возвращаем к нужной точке
б) меняем скейл
не обязательно одновременно.
если точка привязки стоит "от балды", исправьте и не мучайтесь.
для программно изменяемых объектов левый верхний угол изображения ставится "в ноль", если конечно не предполагается специфическое вращение.
Wolsh, ну это все понятно. К тому же, scale должен обязательно меняться вместе с координатами. Зум, конечно, шустрый, но ведь не настолько, чтобы ничего не разглядеть...
Беда еще и в том, что мувик програмносозданный, а как у таких мувиков менять точку трансформации - из постов на форуме, я так толком и не понял.
Molecula
23.04.2008, 18:20
Пример кода, который позволяет зумировать объект колесиком мышки относительно положениея кусора. Если поможет - гуд, дальше идею сами разовьёте.
// f - навигируему объект
Mouse.addListener(this);
function onMouseWheel(d) {
var s=f._xscale;
var mouseX=_xmouse;
var mouseY=_ymouse
var dx=(mouseX-f._x)/s;
var dy=(mouseY-f._y)/s;
f._xscale=f._yscale+=d;
s=f._xscale;
f._x=mouseX-dx*s;
f._y=mouseY-dy*s;
}
Ну вот такой код пойдет?
function zoomOut () {
steps = 20 //количество шагов зума (кадров)
dScale = (target_mc._xscale-100)/steps
dX = (target_mc._x-mask_mc._x)/steps
dY = (target_mc._y-mask_mc._y)/steps
target_mc.onEnterFrame = function(){
if (target_mc._xscale >100){
target_mc._x -= dX
target_mc._y -= dY
target_mc._yscale -= dScale;
target_mc._xscale -= dScale;
} else { // доводим после дробных
target_mc._x = mask_mc._x;
target_mc._y = mask_mc._y;
target_mc._yscale = target_mc._xscale = 100;
this.onEnterFrame = null
}
}
}А что касается точки привязки - то ответ простой: никак. Просто мувик помещается внутрь другого, там задаешь ему координаты так чтобы точка 0:0 внешнего мувика совпала с точкой твоего мувика, которую ты хочешь привязать, и этот внешний крутится или двигается, и внутренний мувик вместе с ним)))
http://wolsh.pisem.net/files/rotation.gif
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.