Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Подскажите как лучше организовать движение большого количества объектов (http://www.flasher.ru/forum/showthread.php?t=143941)

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

Цитата:

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

А можете простой пример написать, или ссылочку на аналогичный урок или исходник, тоже интересна эта тема.

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

mooncar 16.11.2010 13:37

Допустим, на сцене 10 мувиков - mc1, mc2...mc10.
Тогда:
Код AS1/AS2:

this.onEnterFrame = function()
{
  for (i = 1; i <= 10; i++)
  {
      var mc:MovieClip = this['mc' + i];
      mc._x += 5;
      mc._y += 2;
  }
}

Нелинейное движение (вводится параметр, зависящий от номера):
Код AS1/AS2:

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.
Код AS1/AS2:

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

Если мувики в контейнере, но при этом их неопределенное количество и они непоименованы:
Код AS1/AS2:

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

Благодарю, оч. хорошие примеры, но все-таки хотелось бы с массивом, могу даже подкинуть, к примеру:
Код AS1/AS2:

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

Цитата:

Сообщение от Morozov1982 (Сообщение 950081)
Благодарю, оч. хорошие примеры, но все-таки хотелось бы с массивом, могу даже подкинуть, к примеру:
Код AS1/AS2:

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 слушатель, а он уже в свою очередь запускает цикл в массиве (находящемся в каком либо другом классе или в этом же) с объектами которые нужно перемещать.

Код AS3:

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

Я читал всю тему, честное слово, а в ней вы только спрашивали как правильно обрабатывать массивы объектов...


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

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