/potapenko.com/articles/conveyor (part 3)/

Здесь необходимо небольшое пояснение. Как видно из спецификации мы имеем три вида действия. Первый тип – вызов функции, второй – метода объекта, а третий тип – изменение параметра объекта. Когда нужно пользоваться тем или иным типом?

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

					
Conv.put(MyClass, "firstMethod", 0); 

Conv.put(MyClass, "secondMethod", 0); 

Conv.put(MyClass, "thirdMethod", "1");

Как видно из примера – первые три действия имеют задержку – ноль, а третье действие имеет задержку в один кадр – и как следствие все три действия выполняются «одновременно» и действия которые будут дальше в списке, будут выполнены уже «в следующем фрейме».

Но иногда нужно сделать несколько действий за один фрейм с несколькими объектами или компонентами. Создавать большой список действий на один фрейм – неудобно и неоправданно (расходуются лишние ресурсы). При создании множества действий за один фрейм лучше воспользоваться функцией :

					
Conv.put(function() 
{ 
  _root.graphics_mc.line_1.setSize(); 
  _root.graphics_mc.line_1._x = 0; 
  _root.graphics_mc.line_1._y = 0; 
  _root.graphics_mc.line_2.setSize(); 
  _root.graphics_mc.line_2._x = 0; 
  _root.graphics_mc.line_2._y = 0; 
  _root.graphics_mc.line_3.setSize(); 
  _root.graphics_mc.line_3._x = 0; 
  _root.graphics_mc.line_3._y = 0; 
  _root.graphics_mc.line_3.setSize(); 
  _root.graphics_mc.line_3._x = 0; 
  _root.graphics_mc.line_3._y = 0; 
  
}, "1"); 

Из примера видно, что объекты, с которыми работает функция – находятся в одном мувиклипе. В этом случае очевидна необходимость указывать пространство имен (scope) функции. И функция становится как бы «временным методом» мувиклипа. «Временный метод» необходим только в момент выполнения действия, и после выполнения действия он перестает существовать. Итак, когда нужно создать «временный метод» объекта лучше воспользоваться функцией с указанием пространства имен:

					
Conv.put(function() 
{ 
  this.line_1.setSize(); 
  this.line_1._x = 0; 
  this.line_1._y = 0; 
  this.line_2.setSize(); 
  this.line_2._x = 0; 
  this.line_2._y = 0; 
  this.line_3.setSize(); 
  this.line_3._x = 0; 
  this.line_3._y = 0; 
  this.line_3.setSize(); 
  this.line_3._x = 0; 
  this.line_3._y = 0; 
  
}, _root.graphics_mc , "1");

Код выглядит яснее, и не теряются ресурсы на адресацию к мувиклипу. Указывать пространство имен необходимо практически во всех случаях применения действия–функции. Если только функция не глобальная. Например – setInterval , stopDrag , trace и так далее. В этом случае указывать пространство имен не нужно.

Когда нужно изменить значение объекта, и писать для этого специальный метод – неоправданно и изменяемых параметров не больше чем три – лучше воспользоваться третьим типом действия (изменение параметра объекта):

					
Conv.put(_root.graphics_mc.line_1, "_x", 0, 0); 
Conv.put(_root.graphics_mc.line_1, "_y", "1", 0);

Если же действий было бы больше чем три, нужно пользоваться приемом – «временный метод».

Еще раз суммируем информацию о методе put :

  1. Класс конвейера называется Conv .
  2. Метод put помещает команду в конвейер.
  3. Команда описывает в виде функции или метода объекта, и аргументов которые нужно передать.
  4. Важно запомнить последовательность описания команды: действие, задержка, список аргументов.
  5. Действие может быть описано функцией, методом (пара: ссылка на объект, имя метода), «временным методом» (пара: функция и ссылка на объект) и как поле объекта (пара: объект и имя поля).
  6. Команда имеет продолжительность (или задержку). Продолжительность команды это время между вызовом данной команды и вызовом следующей команды.
  7. Длительность команды может задаваться как во фреймах, так и в миллисекундах.
  8. Если время указывается во фреймах, то количество фреймов указывается как строка («1» - один фрейм), если нужно указать задержку в миллисекундах, то время задержки указывается как цифра (2000 – две секунды).
  9. Команда может не иметь задержки, и следующая команда будет выполнена сразу после выполнения текущей команды. В этом случае указывается задержка равная нулю.
  10. Команда может иметь произвольное количество аргументов, так и не иметь их.

Теперь еще раз посмотрим на код метода начала игры рулетки.

					
private function spin() 
{ 
  // заблокировать 
  // пользовательский интерфейс 
  this.lock(); 
  
  // вычислить игровой результат 
  this.createGameResult(); 
  
  // начать движение колеса 
  // (время 100 кадров) 
  Conv.put(this, "startWeel", "100"); 
  
  // остановить колесо 
  Conv.put(this, "stopWeel", 0); 
  
  // озвучить игровой 
  // результат (время - две секунды) 
  Conv.put(this, "gameSounds", 2000); 
  
  // анимационно убрать 
  // проигравшие ставки 
  // (на каждую ставку по 50 кадров) 
  Conv.put(this, "looses", 
    String(this.looses_array.length*50)); 
  
  // анимационно показать выигрыш 
  // всех выигравших 
  // (если такие имеются) 
  // на каждую ставку по 100 кадров 
  Conv.put(this, "wins", 
    String(this.wins_array.length*100)); 
  
  // разблокировать интерфейс 
  // игрового приложения 
  Conv.put(this, "unlock", 0) 
} 

Предыдущая часть | Следующая часть
[1] [2] [3] [4] [5] [6] [7]