![]() |
Помогите с правильным snap объекта по сетке.
То есть нужно, чтобы при отпускании мыши объект прилеплялся к ближайшей линии.
В пределах клетки добиться удалось путем использования Math.ceil и Math.floor - скачет к ближайшей линии сетки, но вот стоит пересечь эту линию, он скачет к ближайшей линии клетки, которую объект зацепил. Это еще если объект меньше, чем шаг сетки. А если больше, вообще мрак. Вот, к примеру, в подобном ключе вычисляю _x Код:
step = 10; |
Используй округление. Если сетка равномерная, дели расстояние на шаг и округляй. получишь номер линии ячеек.
|
А зачем мне номер линии, я пока что-то не врублюсь.
|
номер линии * шаг = координата
|
Как я понимаю, нужно сравнивать четыре параметра для x - расстояние левого края объекта до ближайших вертикальных линий сетки и соответственно правого края до ближайших ему линий сетки.
А номер линии разве что считать начиная от линии, которая левее левого ;) края объекта? |
//init line
lineStyle (0, 0); for (i = 0; i < 11; i++) { moveTo (0, i * 40); lineTo (400, i * 40); moveTo (i * 40, 0); lineTo (i * 40, 400); } // init clip createEmptyMovieClip ("mc", 0); mc.lineStyle (0, 0xFF0000); mc.beginFill (0xFF0000, 50); mc.lineTo (40, 0); mc.lineTo (40, 40); mc.lineTo (0, 40); mc.lineTo (0, 0); mc.endFill (); // mc.onPress = function () { this.onMouseMove = this.mouseMove; //startDrag(false,0,0,360,360) }; mc.onRelease = mc.onReleaseOutside = function () { delete this.onMouseMove; }; mc.mouseMove = function () { var x = Math.floor (_root._xmouse / 40) * 40; var y = Math.floor (_root._ymouse / 40) * 40; x = x < 0 ? 0 : x > 360 ? 360 : x; y = y < 0 ? 0 : y > 360 ? 360 : y; this._x = x; this._y = y; }; |
iNils Лаконично. Но все же прибивает строго в верхний левый угол текущей клетки.
Нет, ну в примере пофиг, но если в createEmptyMovieClip указать размер меньше, чем размер клетки, то видно. |
Cорри, не внимательно прочитал.
Замени mc.mouseMove = function () { var x = Math.floor (_root._xmouse / 40) * 40; var y = Math.floor (_root._ymouse / 40) * 40; x = x < 0 ? 0 : x > 360 ? 360 : x; y = y < 0 ? 0 : y > 360 ? 360 : y; this._x = x; this._y = y; }; на mc.mouseMove = function () { var xGrid = Math.round (_root._xmouse / 40) * 40; var yGrid = Math.round (_root._ymouse / 40) * 40; x = _root._xmouse < xGrid ? xGrid - this._width : xGrid; y = _root._ymouse < yGrid ? yGrid - this._height : yGrid; x = x < 0 ? 0 : x > 360 ? 400 - this._width : x; y = y < 0 ? 0 : y > 360 ? 400 - this._height : y; this._x = x; this._y = y; }; |
Замечательные примеры, и они многому учат, большое спасибо!
Но вот что я не могу самостоятельно додумать, это как ликвидировать скачки при размере объекта больше, чем размер ячейки решетки. Ну, к примеру, если createEmptyMovieClip ("mc", 0); mc.lineStyle (0, 0xFF0000); mc.beginFill (0xFF0000, 50); mc.lineTo (90, 0); mc.lineTo (90, 20); mc.lineTo (0, 20); mc.lineTo (0, 0); mc.endFill (); и мышкой потаскать влево-вправо. |
Люди могут подумать, что я носом кручу, но подобного перемещения я уже добивался. А вот при размере объекта больше, чем шаг сетки, получается петрушка. Я пока вышел из положения так - если длина или высота объекта больше шага сетки, то равняю объект только по верхним правым углам сетки, если меньше, то нормально. Но это же не наш метод. ;)
|
| Часовой пояс GMT +4, время: 11:28. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.