Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   zoom объекта относительно курсора мышки (http://www.flasher.ru/forum/showthread.php?t=90575)

pavel gorlov 14.01.2007 08:13

zoom объекта относительно курсора мышки
 
Привет бойцы! Читал топики про карты и навигацию, но у меня несколько другая задача. Пишу систему навигации над графическим объектом. Вообщем уже 3-е сутки пошил, как я бъюсь над простой задачей:


1. Есть объект (movieClip)
2. Есть набор уже написанных мною функций, которые работают тут (кнопки фтопку, они для дебагинга)

- перемещение объекта по XY в зависимости положении мышки +коэф ускорения.

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

3. Хочу сделать следующее: делать zoom относительно координат мышки,
т.е. вот так:
http://pavel.gorlov.name/@/nav/bug.gif

Народ, я умом всё понимаю, ну Нихрена не могу сделать....
Если у кого то из Вас была такая же проблема, поделитесь опытом плиз ;)
Я не сторонник искать\рыть чужие скрипты, тем более мне интересно самому понять до конца в чем моя ошибка. Думаю общими усилиями у нас получиться найти нужное русло. (Русло не нашла целая кафедра информатики в моём ВУЗе :away: )

Я пытаюсь это делать так, хрень полная и не работает
Код:


// f - навигируему объект

var  x_mouse = _root._xmouse;
var  kx = 0;
o = new Object();

o.onMouseWheel = function(d) {
with(f){
        if(_root._xmouse == x_mouse)
        {
    d *= 2;
        dw = (_width / _height ) * d;
        dh = d;
        w_old = _width;
//    kx = _root._xmouse / _width;
        trace("_width СТАР=" + _width + " kx= "+ kx + "_x=" + _x);
        _width += dw;
        _height += dh;
        _x = _root._xmouse - (_width * kx);
        //_x = _x -
        trace("_width НОВ=" + _width + " kx= "+ kx + "_x=" + _x);
        }
        else
        {
                x_mouse = _root._xmouse;
                kx = _root._xmouse / _width;
                trace("mouse=" + _root._xmouse + " kx= "+ kx);
        }
 }
 }

Mouse.addListener(o);


vic_ 14.01.2007 13:24

может я что то не понял.
Текущий зум вычисляется как отношение площади карты к площади выделения. Если площадь карты равна 100, а площадь выделения 50, то zoom=100/50=2. Отлично, теперь передвигаем карту так, что бы центр выделения оказался в центре вьюпорта а после смещения увеличиваем карту на величину зума. По моему все.

silin 14.01.2007 14:53

Код:

// 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;
       
}


pavel gorlov 15.01.2007 02:20

silin спосибо тебе! То, что нужно! Всё гениальное просто, как 9 строк кода. ;-)

AlexG77 24.02.2011 15:24

в данном коде, при уменьшении, картинка переворачивается на 180 при достижении минимального размера. Каким образом этого можно избежать?

Hauts 24.02.2011 15:44

Очевидно поставить ограничения на масштаб.

AlexG77 24.02.2011 18:25

Выставляю масштаб, но все равно, картинка переворачивается и начинает увеличиваться
Код AS1/AS2:

if (map._xscale<200-d&&map._xscale>5-d)


Hauts 24.02.2011 19:13

Код AS1/AS2:

map._xscale = map._xscale < 5 ? 5 : map._xscale;
map._yscale = map._xscale;


AlexG77 24.02.2011 19:37

Спасибо!


Часовой пояс GMT +4, время: 11:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.