PDA

Просмотр полной версии : Подскажите как лучше организовать движение большого количества объектов


Dragon rideR
30.08.2010, 09:50
Подскажите как лучше организовать движение большого кол-ва объектов?
Есть 2 варианта:
1. Каждому объекту назначить обработчик ENTER_FRAME и двигать
2. Сделать глобальный обработчик ENTER_FRAME , а каждому объекту задавать вектор движения и двигать все объекты из единого обработчика.
Как будет быстрее и правильнее?

mooncar
30.08.2010, 10:16
Вариант 2.
Если можно сделать один обработчик, зачем создавать много?
Если характер движения имеет закономерность в зависимости от номера объекта, в этой функции вычисляйте координаты движения циклом по объектам.
Если нет, создайте массив координат, тоже все циклом и используйте массив для вычислений.

Dragon rideR
30.08.2010, 10:43
ага спасибо так и думал

Morozov1982
16.11.2010, 08:00
Вариант 2.
Если можно сделать один обработчик, зачем создавать много?
Если характер движения имеет закономерность в зависимости от номера объекта, в этой функции вычисляйте координаты движения циклом по объектам.
Если нет, создайте массив координат, тоже все циклом и используйте массив для вычислений.
А можете простой пример написать, или ссылочку на аналогичный урок или исходник, тоже интересна эта тема.

Заранее благодарю.

mooncar
16.11.2010, 13:37
Допустим, на сцене 10 мувиков - mc1, mc2...mc10.
Тогда:
this.onEnterFrame = function()
{
for (i = 1; i <= 10; i++)
{
var mc:MovieClip = this['mc' + i];
mc._x += 5;
mc._y += 2;
}
}

Нелинейное движение (вводится параметр, зависящий от номера):
this.onEnterFrame = function()
{
for (i = 1; i <= 50; i++)
{
var mc:MovieClip = this['mc' + i];
mc._x += 5 * (i / 2) ;
mc._y += 2;
}
}

С остановкой, и если мувиков много и все находятся в контейнере cont_mc.
var c:Number = 0;
this.onEnterFrame = function()
{
if (c <= 30)
{
for (i = 1; i <= 50; i++)
{
var mc:MovieClip = cont_mc['mc' + i];
mc._x += 5 * (i / 2) ;
mc._y += 2;
}
c++;
}
}

Если мувики в контейнере, но при этом их неопределенное количество и они непоименованы:
this.onEnterFrame = function()
{
for (i in cont_mc)
{
var mc:MovieClip = cont_mc[i];
mc._x += 5;
mc._y += 2;
}
}

В общем, насколько у вас хватит фантазии, желания и опыта.
С массивом примера не привожу, забивать координатами сил нету. :)
Скажу только, что массив нужен многомерный.

PS. Тему бы в AS2, автор топика сразу об EnterFrame заговорил...

Morozov1982
16.11.2010, 14:54
Благодарю, оч. хорошие примеры, но все-таки хотелось бы с массивом, могу даже подкинуть, к примеру:
var tr:Array = [[240,500],[240,490],[240,480],[240,470],[240,460],[240,450],[240,440],[240,430],[240,420],[240,410],[240,400],[240,390],[240,380],[240,370],[240,360],[240,350],[240,340],[240,330],[240,320],[240,310],[240,300],[240,290],[240,280],[240,270],[240,260],[240,250],[240,240],[240,230],[240,220],[240,210],[240,200],[240,190],[240,180],[240,170],[240,160],[240,150],[240,140],[240,130],[240,120],[240,110],[240,100],[240,90],[240,80],[240,70],[250,70],[260,70],[270,70],[280,70],[290,70],[300,70],[310,70],[320,70],[330,70],[340,70],[350,70],[360,70],[365,75],[365,85],[365,95],[365,105],[365,115],[365,125],[365,135],[365,145],[365,155],[365,165],[365,175],[365,185],[365,195],[365,205]];


Снова, заранее благодарю.

samana
16.11.2010, 18:37
Благодарю, оч. хорошие примеры, но все-таки хотелось бы с массивом, могу даже подкинуть, к примеру:
var tr:Array = [[240,500],[240,490],[240,480],[240,470],[240,460],[240,450],[240,440],[240,430],[240,420],[240,410],[240,400],[240,390],[240,380],[240,370],[240,360],[240,350],[240,340],[240,330],[240,320],[240,310],[240,300],[240,290],[240,280],[240,270],[240,260],[240,250],[240,240],[240,230],[240,220],[240,210],[240,200],[240,190],[240,180],[240,170],[240,160],[240,150],[240,140],[240,130],[240,120],[240,110],[240,100],[240,90],[240,80],[240,70],[250,70],[260,70],[270,70],[280,70],[290,70],[300,70],[310,70],[320,70],[330,70],[340,70],[350,70],[360,70],[365,75],[365,85],[365,95],[365,105],[365,115],[365,125],[365,135],[365,145],[365,155],[365,165],[365,175],[365,185],[365,195],[365,205]];


Снова, заранее благодарю.
??? А что должно получится из этого?

Morozov1982
16.11.2010, 19:43
Это массив координат парами [_x,_y], они (пары) представляют собой траекторию движения объектов.
Отвечая на вопрос "??? А что должно получится из этого?", скажу объекты должны начать двигаться по этой траектории.
Не забывайте читать не только последний пост, но и предыдущие, тогда картина становится немного яснее.

goodguy
16.11.2010, 20:00
Я в таком случае обычно создаю отдельный класс в котором добавляю ENTER_FRAME слушатель, а он уже в свою очередь запускает цикл в массиве (находящемся в каком либо другом классе или в этом же) с объектами которые нужно перемещать.


public function moveStuff():void
{
for (var i in someArray) {
someArra[i].x += (bla bla);
someArra[i].y += (bla bla);
}
}



И лучше всего всегда ставить значение переменной weakReference такого слушателя на true. В таком случае можно избежать утечек памяти, которые часто вызывает ENTER_FRAME при неправильном использовании

samana
16.11.2010, 22:26
Не забывайте читать не только последний пост, но и предыдущие, тогда картина становится немного яснее.
Я читал всю тему, честное слово, а в ней вы только спрашивали как правильно обрабатывать массивы объектов...

Morozov1982
17.11.2010, 05:25
Название темы:

"Подскажите как лучше организовать движение большого количества объектов"

Пост 2:

"...Если нет, создайте массив координат, тоже все циклом и используйте массив для вычислений."

Пост 5:

"С массивом примера не привожу, забивать координатами сил нету.
Скажу только, что массив нужен многомерный."

Пост 6:

"все-таки хотелось бы с массивом, могу даже подкинуть, к примеру"

Как вам, по-моему все ясно.

samana
17.11.2010, 19:36
Как вам, по-моему все ясно.
Ну что могу сказать .... ясней некуда.

Котяра
17.11.2010, 23:39
Ключевое слово: particles
есть несколько хороших движков.
аесли без движков гляньте исходники тут (http://www.nulldesign.de/exp/expviewer.php?file=f9_particle2.swf&width=500&height=400)