PDA

Просмотр полной версии : Крупный драг и ограничение координат


DJ_Baton
10.10.2006, 19:26
в общем делаю сейчас карту территориальную, столкнулся с двумя проблемами:
1) Карта большая и тягается драг мувиком, но драг по умолчанию привязывает центр мува к мышке, как сделать так чтоб при тягании я мог брать мышкой карту в той точке в которой хочу и тянуть с неё куда хочу ?
2) как ограничить координаты что бы мувик с картой не могли вытащить в экран при драге

Хемуль
10.10.2006, 19:46
2 DJ_Baton:
1. Может я ошибаюсь, но такой пример может быть вполне в справке Флеша. А вообще ведь никто не запрещает вам узнать координаты, в которых мышь щёлкнула по мувиклипу. Не используйте Drag, используйте событие, вызываемое при движении мыши для обновления координат мувиклипа.
На этом принципе основан один из методов реализации пользовательских курсоров:

// Для тестирования этого кода необходимо,
// чтобы в Библиотеке был символ с Linkage идентификатором "pointer_id".
this.attachMovie("pointer_id", "pointer_mc", this.getNextHighestDepth());
Mouse.hide();
var mouseListener:Object = new Object();
mouseListener.onMouseMove = function() {
pointer_mc._x = _xmouse;
pointer_mc._y = _ymouse;
updateAfterEvent();
};
Mouse.addListener(mouseListener);

2. Поскольку мувик и карта являются частью флешки, флешка - частью окна, окно - частью изображения на экране, выходит, что флешка и так у вас на экране. Следовательно, чтобы при драге мувиклип с картой не могли вытащить придраге в экран, нужно устранить сам корень проблемы, а именно - не выводить карту и мувиклип.

PS:
Учитесь задавать вопросы...

Kyber Anton
10.10.2006, 20:03
Во время нажатия мышки на клип, нужно сохранить разность координат клипа и указателя, а потом, до тех пор, пока кнопка не будет отжата, обновлять координаты клипа как (координаты мыши+сохранённая разность). Ничего трудного не вижу. Стандартный драг - зло.

D12
10.10.2006, 21:57
this.karta.onPress = function() {
startDrag(this);
}
_root.onMouseUp = function() {
_root.stopDrag();
};

или так =)

ramcaXleft = 100;
ramcaXright = 450;
this.ramca.onEnterFrame = function() {
if (this._x<=ramcaXleft) {//условие проверки границы координаты по левому краю
this._x = ramcaXleft;
}
if (this._x>=ramcaXright) {//условие проверки границы координаты по правому краю
this._x = ramcaXright;
}
};
this.ramca.onMouseDown = function() {
//условие хватания
if ((_root._xmouse>=(this._x-(this._width/2))) && (_root._xmouse<=(this._x+(this._width/2))) && (_root._ymouse>=(this._y-(this._height/2))) && (_root._ymouse<=(this._y+(this._height/2)))) {
startDrag(this);
}
};
//
_root.onMouseUp = function() {
_root.stopDrag();
};




Старо как мир ... еще кординаты какието отлавливать :)

DJ_Baton
11.10.2006, 06:16
Можете скинуть исходник плиз ?

wvxvw
11.10.2006, 10:43
2 D12:
Оба варианта, прям скажем, не фонтан... по крайней мере второму пожеланию автора они никак не удовлетворяют - такую карту, как ты предложил, можно вытащить за пределы зоны просмотра, а это как раз и нужно избежать.

2 DJ_Baton:
Первый параметр startDrag() как раз и показывает, а нужно ли привязывать центр перетаскиваемого клипа к мыше или нет.
Но у использования startDrag() есть свои недостатки, поэтому чаще предпочтительнее сделать свой аналог этого метода. Т.е. как уже сказали выше: по onPress регистрировать координаты мыши, включать onEnterFrame, в нем проверять смещение мыши и соответсвенно делать перерасчет координат. По onReleas'у соответсвенно убивать onEnterFrame.
(Вместо onEnterFrame можно использовать любую функцию которая будет циклически проверять смещение мыши, onMouseMove удобнее тем, что функция не будет включаться если юзер не двигает мышой)

DJ_Baton
11.10.2006, 11:35
Вот выложил исходник, кто разбирается помогите плиз -
http://moderndonbass.com/Flash/map.zip
а то я не очень шарю в AS так только азы... :(

valvika
11.10.2006, 16:38
...а то я не очень шарю в AS так только азы... :(
смотрим http://mainmaps.com/000/mapwithpanzoomandselection.swf
если нравится, то качаем исходник, разбираемся, вносим свои изменения/дополнения и т.д.
http://mainmaps.com/000/mapwithpanzoomandselection.rar
Я не советую надеяться, что вам кто-то даст полностью готовый исходный код. Я делаю карты постоянно более 1,5 лет и то, чтобы запустить вашу карту мне нужно дня три.
Важные замечания:
1.Сделайте поднайм Флеш-кодера. Карты-не самое сложное, но и не самые простые проекты.
2.Ваша графика не будет работать гладко при перетаскивании и масштабировании. С ней еще много работы ( чисто с графикой ). Посте добавления имен улиц и обьектов на карту - тормоза станут просто ужасающими.
3.Полностью поддерживаю тех, кто предлагает отказать от ДраГа.

DJ_Baton
11.10.2006, 18:19
большое спасибо, интересный исходник, качаю

Хемуль
11.10.2006, 20:08
Посте добавления имен улиц и обьектов на карту - тормоза станут просто ужасающими.
Но вы ведь при движении/масштабировании карты уменьшаете качество флешки. ^_^ Это может в каком-то роде решить проблему.

valvika
12.10.2006, 00:40
....уменьшаете качество флешки. ^_^ Это может в каком-то роде решить проблему.
Прежде чем что-то говорить, я проверил его исходник.
Вставил в этот движек http://mainmaps.com/spb
Понижение качества не спасает. Работает рывками.

D12
12.10.2006, 00:51
2wvxvw

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

D12
12.10.2006, 01:01
2valvika
конечно будет рывками , ктоже таскает один цельный кусок ....

тебе нужно разделять карты на клетки делать из них масив о принципу рабочее окно что - то вроде этого :

P.S.И тогда будет празник =)

valvika
12.10.2006, 01:23
...И тогда будет празник =)
Невидимые части большой карты оказывают мизерное влияние на скорость перемещения/масштабирования.

Хемуль
12.10.2006, 01:27
О, тониповские уроки. ^_^