Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.11.2005, 18:08
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 1  
Ответить с цитированием
ccwds

Регистрация: Nov 2001
Адрес: Москва
Сообщений: 155
Question Помогите с правильным 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;
     }

Старый 07.11.2005, 18:53
MaxLife вне форума Посмотреть профиль Отправить личное сообщение для MaxLife Найти все сообщения от MaxLife
  № 2  
Ответить с цитированием
MaxLife

Регистрация: Nov 2003
Сообщений: 128
Используй округление. Если сетка равномерная, дели расстояние на шаг и округляй. получишь номер линии ячеек.

Старый 07.11.2005, 19:34
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 3  
Ответить с цитированием
ccwds

Регистрация: Nov 2001
Адрес: Москва
Сообщений: 155
А зачем мне номер линии, я пока что-то не врублюсь.

Старый 07.11.2005, 19:39
MaxLife вне форума Посмотреть профиль Отправить личное сообщение для MaxLife Найти все сообщения от MaxLife
  № 4  
Ответить с цитированием
MaxLife

Регистрация: Nov 2003
Сообщений: 128
номер линии * шаг = координата

Старый 07.11.2005, 22:26
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 5  
Ответить с цитированием
ccwds

Регистрация: Nov 2001
Адрес: Москва
Сообщений: 155
Как я понимаю, нужно сравнивать четыре параметра для x - расстояние левого края объекта до ближайших вертикальных линий сетки и соответственно правого края до ближайших ему линий сетки.

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

Старый 07.11.2005, 22:52
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 6  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
//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;
};
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 07.11.2005, 23:09
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 7  
Ответить с цитированием
ccwds

Регистрация: Nov 2001
Адрес: Москва
Сообщений: 155
iNils Лаконично. Но все же прибивает строго в верхний левый угол текущей клетки.
Нет, ну в примере пофиг, но если в createEmptyMovieClip указать размер меньше, чем размер клетки, то видно.

Старый 07.11.2005, 23:32
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
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;
};
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 08.11.2005, 00:02
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 9  
Ответить с цитированием
ccwds

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

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

Старый 08.11.2005, 18:41
ccwds вне форума Посмотреть профиль Отправить личное сообщение для ccwds Посетить домашнюю страницу ccwds Найти все сообщения от ccwds
  № 10  
Ответить с цитированием
ccwds

Регистрация: Nov 2001
Адрес: Москва
Сообщений: 155
Люди могут подумать, что я носом кручу, но подобного перемещения я уже добивался. А вот при размере объекта больше, чем шаг сетки, получается петрушка. Я пока вышел из положения так - если длина или высота объекта больше шага сетки, то равняю объект только по верхним правым углам сетки, если меньше, то нормально. Но это же не наш метод.

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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