-
Вообщем, такая проблема.
Есть клип Base.baseClip, я его уменьшаю или увеличиваю при вращении скрола. Как сделать так, чтобы объект, который находится под мышкой оставался на месте. То есть нужно как-то хитро сдвигать Base.baseClip, чтобы компенсировать увеличение.
Вот как поступаю я:
Код:
mouseListener.onMouseWheel = function(delta:Number) {
* *Tools.Zoom(2*delta);
};
Tools.Zoom - функция масштабирования
Код:
private static function Zoom(_zoomDec:Number) {
****var newScale:Number = Base.baseClip._xscale+_zoomDec;
****var oldX:Number=Base.baseClip._xmouse;
****var oldY:Number=Base.baseClip._ymouse;
****//не даём слишком увеличить или уменьшить клип *
****if (newScale>33 && newScale<300) {
*Base.baseClip._yscale=Base.baseClip._xscale=newScale;
****} else {
*return;
****}
* * * * * * * *//компенсируем растяжение
****Base.baseClip._x-=oldX-Base.baseClip._xmouse;
****Base.baseClip._y-=oldY-Base.baseClip._ymouse;
}
Всё это работает почти как надо. ПОЧТИ. Просто пи увеличении или уменьшении объект всё-таки сдвигается.
В чём же дело?
Я понимаю, что это скорее математика, чем Флеш, но может уже кто-то такое делал? Масштабирование я имею ввиду.
Или кто-то может привести формулы для масштабирования относительно центра.
-
етить не люблю я эти инкрементально декрементальные формулы,
но в общем ошибка у тебя что ты забыл поправку вставить на новый Scale
Код:
private static function Zoom(_zoomDec:Number) {
var newScale:Number = Base.baseClip._xscale+_zoomDec;
var oldX:Number=Base.baseClip._xmouse;
var oldY:Number=Base.baseClip._ymouse;
//не даём слишком увеличить или уменьшить клип *
if (newScale>33 && newScale<300) {
Base.baseClip._yscale=Base.baseClip._xscale=newScale;
} else {
return;
}
//компенсируем растяжение
Base.baseClip._x-=(oldX-Base.baseClip._xmouse)*Base.baseClip._xscale/100;
Base.baseClip._y-=(oldY-Base.baseClip._ymouse)*Base.baseClip._yscale/100;
}
-
Спасибо. Теперь всё работает. постоянно забываю про масштаб.
Вот мне ещё на одном форуме подсказали решение:
Код:
this.onMouseWheel = function(delta:Number)
{
* import flash.geom.Point;
* var before:Point = new Point(clip._xmouse, clip._ymouse); // куда указывает мышка
* var after:Point = before.clone(); // делаем копию той же точки
*
* clip.localToGlobal(before); // переводим исходную точку в глобальную систему координат
*
* * clip._xscale += delta;
* * clip._yscale = clip._xscale;
* clip.localToGlobal(after); // переводим результирующую точку в глобальную систему координат.
* var offset:Point = before.subtract(after); // на сколько "уползла" в результате масштабирования точка.
*
* clip._x += offset.x;
* clip._y += offset.y;
};
Mouse.addListener(this);
Может кому-то будет интересно.
-
тлько в 8ке такой код прокатит,
в 7й нет объекта Point если мне не изменяет память
-
Люды добры надо сделать мне что-то вроде презентации (swf -> exe),
в которой будут куча мелких деталей и описаний.
Для изучения мелочи мне нужно сделать возможность zoommirovaniya.
Выше перечисленные коды тупо впихивал - нерулит.
Не знаю чё куда калякать.
Если есть добры молодцы и красны девицы готовые выручить, готов
вознести благодарственную молитву.
Напишите пожалуйста код с краткими пояснениями
-
тупо не нужно. а нужно написать второй скрипт на первый кадр клипа,в котором мелкие детали. должно работать.
-
пробывал но что-то не катит.
если не сложно киньте кто-нить исходник .fla, думаю так скорее поймётся
-
слелал образец.
Делается в библиотеке клип GlavniyClip. B этом клипе будут детали. Бросаю его в сцену и называю clip. потом на первый кадр сцены помещаю код. И всё работает.