Форум 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)
-   -   Помогите с правильным snap объекта по сетке. (http://www.flasher.ru/forum/showthread.php?t=71522)

ccwds 07.11.2005 18:08

Помогите с правильным snap объекта по сетке.
 
То есть нужно, чтобы при отпускании мыши объект прилеплялся к ближайшей линии.
В пределах клетки добиться удалось путем использования
Math.ceil и Math.floor - скачет к ближайшей линии сетки, но вот стоит пересечь эту линию, он скачет к ближайшей линии клетки, которую объект зацепил.

Это еще если объект меньше, чем шаг сетки. А если больше, вообще мрак.

Вот, к примеру, в подобном ключе вычисляю _x

Код:

step = 10;
 coordx = Math.floor(this._x/step)*step+this._width/2;
 coordxnext = coordx + step; // следующая линия сетки - глупость, я понимаю.
        if ((this._x + this._width/2) >((coordx + coordxnext)/2)) {
        _x = Math.ceil(this._x/step)*step+this._width/2-this._width;
    } else {
        _x = Math.floor(this._x/step)*step+this._width/2;
    }


MaxLife 07.11.2005 18:53

Используй округление. Если сетка равномерная, дели расстояние на шаг и округляй. получишь номер линии ячеек.

ccwds 07.11.2005 19:34

А зачем мне номер линии, я пока что-то не врублюсь.

MaxLife 07.11.2005 19:39

номер линии * шаг = координата

ccwds 07.11.2005 22:26

Как я понимаю, нужно сравнивать четыре параметра для x - расстояние левого края объекта до ближайших вертикальных линий сетки и соответственно правого края до ближайших ему линий сетки.

А номер линии разве что считать начиная от линии, которая левее левого ;) края объекта?

iNils 07.11.2005 22:52

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

ccwds 07.11.2005 23:09

iNils Лаконично. Но все же прибивает строго в верхний левый угол текущей клетки.
Нет, ну в примере пофиг, но если в createEmptyMovieClip указать размер меньше, чем размер клетки, то видно.

iNils 07.11.2005 23:32

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

ccwds 08.11.2005 00:02

Замечательные примеры, и они многому учат, большое спасибо!
Но вот что я не могу самостоятельно додумать, это как ликвидировать скачки при размере объекта больше, чем размер ячейки решетки.
Ну, к примеру, если
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 ();

и мышкой потаскать влево-вправо.

ccwds 08.11.2005 18:41

Люди могут подумать, что я носом кручу, но подобного перемещения я уже добивался. А вот при размере объекта больше, чем шаг сетки, получается петрушка. Я пока вышел из положения так - если длина или высота объекта больше шага сетки, то равняю объект только по верхним правым углам сетки, если меньше, то нормально. Но это же не наш метод. ;)


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

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