PDA

Просмотр полной версии : Быстрый поиск мувиков под любой точкой


World Architect
20.05.2006, 19:20
Здравствуйте! Мне необходимо тащить мышкой объект удлиненный и похожий на такой:
>------------->
Мышкой можно тащить за любую точку объекта. При этом по бокам / в разных местах флэша торчат такие вещи:
=======|> >|=======

=======|> >|=======

=======|> >|=======

=======|> >|======= Так надо чтобы концы переносимого объекта ловили бы статичные фиговины на карте. Ну похоже на то как мы руками вилку в розетку пихаем. При переносе я отслеживаю радиус вокруг "вилок" объекта в 5 точек и ищу "розетку", чтобы в нее вставить "вилку".
Сейчас это сделано как перебор объектов в _root, но тормозит немеренно, т.к. объектов море. Как это можно сделать быстрее??

Прмечание: размер таскаемого обекта не совпадает с расстоянием между розетками, т.е. потом я его удлиняю. М.б. по типу такого:

=======|> |---------->>|=======

=======|> | >|=======

=======|> | >|=======

=======|>>--------| >|=======
Но это уже моя забота :) Главное как под любой точкой на флэше определить объекты под ней МАКСИМАЛЬНО быстро. Может флэш хранит массивчик двумерный... Я не знаю... Помогите....

Beta-tester
20.05.2006, 22:17
А свой масивчик координат завести, а потом вычислить делая поправки на радиус(вобщем при желании можно исхитрится самому).
Это тоже может время занять, но не столько, сколько перебор!

World Architect
20.05.2006, 23:54
Свой делал... Я вообще делаю как...
Есть классы, каждый из который занимается своим делом: один - изменяет альфу с X на Y, второй - организует цикл, третий - очередь, а четвертый - движение мышкой. И допустим у меня есть класс типа (пишу примерно):

class Krug extends MovieClip {
var moving : Mover = new Mover(this);

...

onMouseDown() {
if(мыша внутри) Mover.goAction();
}
onMouseUp() {
if(мыша внутри) Mover.stopAction();
}

}

И так можно для любого объекта. Где Mover - класс, организующий перемещение любого объекта. Также сделана и склейка объектов. Т.е. просто внутрь нужных объектов вставляется экземпляр класса.
При этом про запуске метода goAction() устанавливается callback функция на интервал времени... доп на 10 мсек... Т.о. ваш класс мувика ни о чем не заботится. Просто вызывает goAction и все. И через каждые 10 мсек срабатывает классы движения с склейки. Если мыша переместилась, класс движения переместит мувик, а класс склейки проверит окрестность в 5 точек и приклеит объекты.

Все переносимые объекты я добавляю в массив (как Вы и писали), но все равно тормозит...Может просто много функций работает по интервалам? Хотя на примерку только две - перенос и склейка... Не понимаю... :(

Nirth
20.05.2006, 23:55
прочитайте правила и измените пост пожалуйста

World Architect
21.05.2006, 00:00
прочитайте правила и измените пост пожалуйста
Если Вы про раздел "Код", то в свое оправдание скажу что не знаю, как по другому вставить кучу пробелов для сдвига, HTML всегда урежет пробелы до одного. Если не поэтому, то напишите мне, я не понимаю, что не вяжется с правилами.

0xFFFFFF
21.05.2006, 00:24
Есть классы, каждый из который занимается своим делом: один - изменяет альфу с X на Y, второй - организует цикл, третий - очередь, а четвертый - движение мышкой.

во технология.. скоро в отдельные классы будут пихать каждый кусочек кода.. каждая функция классом станет..

Nirth
21.05.2006, 00:26
во технология.. скоро в отдельные классы будут пихать каждый кусочек кода.. каждая функция классом станет..

если человеку так удобнее почему бы и нет?
вообще паттерн комманда подразумевает под собой всего один публичный метод ( execute() ), так что в одной функции на класс, не вижу ничего удивительного.

0xFFFFFF
21.05.2006, 00:29
а с тобой я не разговариваю.

World Architect
21.05.2006, 01:48
во технология.. скоро в отдельные классы будут пихать каждый кусочек кода.. каждая функция классом станет..
Что плохого в том что добавляя всего одну -две строчки в класс мувика вы снабжаете его всем необходимым для того чтобы его можно было перемещать? Или еще для чего... ИМХО это удобно, если у вас впереди десятка два проекта... Есть общая библиотека и ей можно пользоваться

0xFFFFFF
21.05.2006, 01:52
ничего, это я так.. представила десяток классов по 3-5 строк в каждом..

Nirth
21.05.2006, 01:56
у меня в моем текущем приложении будет 5 классов с одним методом...execute

World Architect
21.05.2006, 02:25
ну не везде 3-5... Зато не надо дублировать в др. мувиках... А их м.б. очень много ;) Блин... я вопрос задал :):):)

World Architect
21.05.2006, 02:26
у меня в моем текущем приложении будет 5 классов с одним методом...execute
не понимаю :) это хорошо или плохо? :)

0xFFFFFF
21.05.2006, 02:29
Блин... я вопрос задал :):):)
вроде ответили.. перебором..

Nirth
21.05.2006, 02:33
это констатация факта, ну это паттерн комманда ( статья по команде с примерами на C# (http://dotsite.ru/Solutions/patterns/command/) )
Удобно использовать когда одно действие нужно делать разными способами, скажем у меня можно добавить пункт меню, комбинацией ctrl+"+", нажав на соответсвующую кнопку, и через контекстное меню.
ну и все три способа вызывают один и тот же метод класса
AddItemComman.execute();
такая реализация мне позволяет достаточно быстро реализовать еще один способ добавления пункта(просто написать метод, где вызываеться данная комманда), и если я захочу изменить реализацию, я смогу изменить метод execute в классе-комманде, и не лазать по всем классам которые вызывают ее.

Beta-tester
21.05.2006, 10:12
World Architect
А расстояние мужду розетками одинаково?Если да ,то всё легко, а если нет то пока есть небольшие проколы в алгоритме.
Так вот если да:
/*алгоритм на основе одномерного пространства(с двумерным также, только с одномерным более точто можно понять-объяснить)*/
Есть прямая на ней через равные промежутки расставленны опорные точки(твои розетки) и есть вилка(ты знаешь её x)
Вычисляешь к какой розетке ближе всего находится вилка(если все розетки находятся на одинаковом расстоянии: то q= Math.round(вилка._x/расстояние между вилками)
Теперь в q находится порядковый номер ближайшей к нашей вилке розетки.
/*Теперь мы знаем возле какой розетки вилка.Если вилка не попадает в радиус этой розетки, то и не попадет в радиус другой(если ты конечно правильно нарисовал рисунок с расположением элементов)
Теперь осталось вычислить попадает в радиус найденной нами розетки вилка.Переходим к двухмерному пространству.*/
Для этого легче внутри каждой розетки создать невидимый мув представляющий радиус, а потом зная вилка_x и вилка._y используя hittest() определить принадлежит вилка этому радиусу или нет.(это самый как мне кажется лёгкий способ определить принадлежность вилки к радиусу, но возможно не самый быстрый.Но первая часть алгоритма должна работать намноооооого быстрее просто перебора!)
Белая
Я не предлогал просто перебора!Ты не правильно меня поняла.Я предлогал перебор между двумя ближайшими розетками!!!!(но как видишь теперь нашёл более выгодный алгоритм).

neelts
21.05.2006, 12:10
используй сетку

dynamic class HashGrid {
// размер клетки
public var grid:Number;
public function HashGrid(grid:Number) {
this.grid = grid;
}
// добавить мув
public function add(obj) {
var p = GetKey(obj._x, obj._y);
this[p] = this[p] == undefined ? new Object() : this[p];
this[p][obj._name] = obj;
}
// удалить мув
public function del(obj) {
delete this[getKey(obj._x, obj._y)][obj._name];
}
// если объекты не точечные, то и эту функцию покажу.
/*public function getQuad(x, y, dx, dy) {

}*/
// вытащить мувы, находящиеся в клетке под x,y
public function get(x, y) {
return this[getKey(x, y)];
}
public function getKey(x, y) {
return Math.floor(x/grid)+"_"+Math.floor(y/grid);
}
}

World Architect
21.05.2006, 21:42
Хм... это мне нравится :) Только тогда мне надо на координатную сетку сразу все объекты в радиусе 5 точек сажать.... Должно ядерно работать :) Спасибо!

World Architect
21.05.2006, 21:44
Ну на одну точку массив обектов, которые находятся в радиусе пяти (нужных объектов)

etc
21.05.2006, 22:19
neelts, плохой код

neelts
21.05.2006, 23:38
чем он тебе не нравится?

напиши свой.

neelts
21.05.2006, 23:41
класс динамический кстати, забыл..сейчас добавил.

etc
22.05.2006, 00:15
neelts, ты бы хотя бы какой-нибудь из стандартов написания кода юзал что-ли...

neelts
22.05.2006, 01:03
да, возможно, когда показываешь кому-то код это уместно...

покажи какой-нить стандарт)))

etc
22.05.2006, 01:13
http://www.adobe.com/devnet/flash/articles/as_bestpractices_02.html

neelts
22.05.2006, 17:09
поправил код)

теперь он соответствует какому-либо стандарту?

etc
22.05.2006, 17:35
Уже лучше, только типизации нету (есть, но далеко не везде, где должна быть). FDT мгновенно расскажет, где и что не так.

neelts
23.05.2006, 00:07
ну у obj я не ставил, так как не только мувы могут быть, а тип Object имхо по умолчанию...или не так?

Nirth
23.05.2006, 00:24
dynamic class HashGrid {
// размер клетки
public var grid:Number;
public function HashGrid(grid:Number) {
this.grid = grid;
}
// добавить мув
public function add(obj:Object):Void {
var p:String = getKey(obj._x, obj._y); //was: GetKey
this[p] = this[p] == undefined ? new Object() : this[p];
this[p][obj._name] = obj;
}
// удалить мув
public function del(obj):Void {
delete this[getKey(obj._x, obj._y)][obj._name];
}
// если объекты не точечные, то и эту функцию покажу.
/*public function getQuad(x, y, dx, dy) {

}*/
// вытащить мувы, находящиеся в клетке под x,y
public function get(x:Number, y:Number):Object {
return this[getKey(x, y)];
}
public function getKey(x:Number, y:Number):String {
return Math.floor(x/grid).toString()+"_"+Math.floor(y/grid).toString();
}
}

Все что я написал не является критичным, но если писать так, то переход на AS3 будет практически незаметным.

etc
23.05.2006, 00:51
Nirth, а у передаваемого obj:Object может и не быть _x и _y =)

Nirth
23.05.2006, 00:55
я бы вообщето для таких плюшек выделил бы класс flash.geom.Point =)или создал бы свой.
но я так понимаю тут нету смысла грузить людей=)

neelts
23.05.2006, 01:49
да, забыл про тип возвращаемых данных...

___etc, дык поэтому и не указал)

об as3 пока рано говорить...

etc
23.05.2006, 13:43
neelts, про AS3 FDT тольком ничего не знает. Зато AS2 прекрасно и точно по шее даст за отсутствие типизации.