Модераторы: SoWa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальный лабораторный стенд 
:(
    Опции темы
AlDev
Дата 21.4.2005, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 9
Всего: 50



Ок. Получатеся небольшой туториал %)
Так. Платформа - Flash MX 2004.

//------------------------------------------------------
1. Для того, чтобы что-то сделать с цельным клипом, надо создать этот клип в библиотеке.
1.1. Для этого откроем библиотеку (F11).
1.2. Нажимаем на Create New Symbol
1.3. Пишем какое-либо имя клипа в поле Name.
1.4. Выставляем Behavior как MovieClip
1.5. Нажимаем ОК.
1.6. Рисуем что-либо в данном клипе, для того, чтобы тестировать наш эфект.

2. Теперь нам надо запрограммировать какие-либо эффекты для данного клипа.
Способов в общем-то несколько. Например, можно прописывать весь код в Actions самого клипа, потом можно прописать Actions на сцене, ну и можно написать класс, наследуемый от MovieClip-а.
Пойдём по 3-му пути.

Итак, для начала создадим пустой файл с расширением as. Напишем в нём следующее

Код

class effects.zoom extends MovieClip
{
  //---------------------------
  //class constructor
  function zoom()
  {
    trace ('class constructor called');
  }
}


Сохраним этот файл в папке effects под именем zoom.as относительно расположения fla файла.
Т.е. там-же, где лежит ваш fla файл создаём папку effects и сохраняем туда наш класс.
effects - имя package
zoom - имя класса. Оно должно совпадать с именем файла.
Теперь о коде.
extends означает, что класс является наседуемым от MovieClip.

Возникает вопрос, как вызвать конструктор класса из fla файла.

Всё очень просто. Вернёмся к нашему fla файлу.
Выберем в библиотеке нужный клип, для которого мы создаём эффекты. Нажмём по нему правой кнопкой мыши и далее выберем пункт Linkage...
Поставим галочку у Export for ActionScript, потом укажем ему AS 2.0 Class: effects.zoom.
Теперь давим ОК.

После сего действия выложим этот клип из библиотеки на сцену и запустим fla файл, нажав Ctrl + Enter.
В результате в Ouput должна появиться надпись class constructor called, сообщающая нам о том, что был вызван конструктор класса.

Всё. "Скелет" готов для дальнейшей разработки.
Теперь вернёмся к нашему классу.

Итак, мы будем делать эффект увеличения.
Для этого будем использовать такие свойства MovieClip класса, как _xscale (масштаб по x в процентах) и _yscale (масштаб по y в процентах).
Так-же мы должны установить максимальное и минимальное значение увелицения для удобства работы.

Код

class effects.zoom extends MovieClip
{
  private var _maximum_zoom_value:Number;
  private var _minimum_zoom_value:Number;
  //----------------------------------------------------
  //getters and setters
  //set maximum zoom value
  function set maximum_zoom_value(v:Number):Void
  {
    if (v>0)
    {
      _maximum_zoom_value = v;
    }
  }
  //get maximum zoom value
  function get maximum_zoom_value():Number
  {
      return _maximum_zoom_value;
  }
  //set minimum zoom value
  function set minimum_zoom_value(v:Number):Void
  {
      if (v>0)
      {
          _minimum_zoom_value = v;
      }
  }
  //get minimum zoom value
  function get minimum_zoom_value():Number
  {
      return _minimum_zoom_value;
  }
  //-----------------------------------------------------
  //class constructor
  function zoom()
  {
    trace ('class constructor called');
  }
}


Что мы сделали? Мы установили две private переменных, содержащие maximum и minimum значения zoom и сделали доступ к ним с помощью get и set методов.

Напишем метод, позволяющий увелисить масштаб клипа. Сделаем его private:
Код

private function set_scale(v:Number):Void
{
  this._xscale = v;
  this._yscale = v;
}

Так-как наш класс наследуемый от MovieClip-а, то обращаемся мы к нему соответственно с помощью this.
v - значение масштаба.

Теперь перегрузим следующие методы:
onRollOver - вызываемый при наведении на клип курсора
onRollOut - вызываемый при уходе курсора с клипа
onDragOver - вызываемый при наведении на клип курсора, если при этом нажата левая кнопка мышки.
onDragOut - выываемый при уходе курсора с клипа если при этом опять-таки нажата левая кнопка мышки.

Код

function onRollOver():Void
{
  set_scale(_maximum_zoom_value);
}
function onRollOut():Void
{
  set_scale(_minimum_zoom_value);
}
function onDragOver():Void
{
  set_scale(_maximum_zoom_value);
}
function onDragOut():Void
{
  set_scale(_minimum_zoom_value);
}


Теперь при наведении курсора на клип у нас будет устанавливаться максимальное значение масштаба,
А при его убирании с клипа - его минимальное значение.

Теперь установим эти значения по-умолчанию, т.к. иногда влом прописывать одинаковые значения для большого числа элементов. Для этого вернймся к конструктору класса и напишем там следующее:
Код

  //-----------------------------------------------------
  //class constructor
  function zoom()
  {
    _maximum_zoom_value = 120;
    _minimum_zoom_value = 100;
  }
  //-----------------------------------------------------

Вместо бывшего там trace.

Итак, теперь у нас имеется элементарное увеличение и уменьшение.
Возвращаемся в fla файл и , запустив его, любуемся.

Итак, у нас получилось прстенькое увеличение.
Теперь нам надо сделать так, чтобы оно было всегда по-центру. Для этого заведём переменные, в которых храниться начальная координата клипа относительно _parent клипа, а также размеры клипа и определим их значение при вызове конструктора:
Код

 ...
  private var start_x_position:Number;
  private var start_y_position:Number;
  private var start_width:Number;
  private var start_height:Number;
 ...
 function zoom()
 {
  ...
  start_x_position = this._x;
  start_y_position = this._y;
  start_width = this._width;
  start_height = this._height;
 }


Почему мы это сделали?
При изменении масштаба изменится и размер клипа, потому нам надо знать начальное положение, чтобы отследить то, как изменится положение центра и вернуть его на место.

Теперь исправим функцию set_scale:
Код

  private function set_scale(v:Number):Void
  {
    this._xscale = v;
    this._yscale = v;
    var dx:Number = (this._width - start_width)/2;
    var dy:Number = (this._height - start_height)/2;
    this._x = start_x_position - dx;
    this._y = start_y_position - dy;
  }

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

У нас получилось простейшее центровое увеличение.

Полностью код класса:
Код

class effects.zoom extends MovieClip
{
  private var _maximum_zoom_value:Number;
  private var _minimum_zoom_value:Number;
  private var start_x_position:Number;
  private var start_y_position:Number;
  private var start_width:Number;
  private var start_height:Number;
  //----------------------------------------------------
  //getters and setters
  //set maximum zoom value
  function set maximum_zoom_value(v:Number):Void
  {
    if (v>0)
    {
      _maximum_zoom_value = v;
    }
  }
  //get maximum zoom value
  function get maximum_zoom_value():Number
  {
      return _maximum_zoom_value;
  }
  //set minimum zoom value
  function set minimum_zoom_value(v:Number):Void
  {
      if (v>0)
      {
          _minimum_zoom_value = v;
      }
  }
  //get minimum zoom value
  function get minimum_zoom_value():Number
  {
      return _minimum_zoom_value;
  }
  //-----------------------------------------------------
  //class constructor
  function zoom()
  {
    _maximum_zoom_value = 120;
    _minimum_zoom_value = 100;
    start_x_position = this._x;
    start_y_position = this._y;
    start_width = this._width;
    start_height = this._height;
  }
  //-----------------------------------------------------
  function onRollOver():Void
  {
    set_scale(_maximum_zoom_value);
  }
  function onRollOut():Void
  {
    set_scale(_minimum_zoom_value);
  }
  function onDragOver():Void
  {
    set_scale(_maximum_zoom_value);
  }
  function onDragOut():Void
  {
    set_scale(_minimum_zoom_value);
  }
  //--------------------------------------------------------
  private function set_scale(v:Number):Void
  {
    this._xscale = v;
    this._yscale = v;
    var dx:Number = (this._width - start_width)/2;
    var dy:Number = (this._height - start_height)/2;
    this._x = start_x_position - dx;
    this._y = start_y_position - dy;
  }
}


Однако хочется какой-нибудь красоты, например чтобы увеличение было постепенное, а не мгновенное.
Тогда есть два варианта:
1. Использовать setInterval
2. Перегрузить onEnterFrame

Всё-таки пусть будет setInterval.
Итак, для начала определим несколько переменных в нашем классе:
Код

...
  //----------------------------------------------------
  private var current_zoom_value:Number;
  private var current_zoom_direction:Boolean;
  private var _zoom_step:Number;
  private var _zoom_interval:Number;
  private var _zoom_interval_value:Number;
  //----------------------------------------------------
...

current_zoom_value - текущее значение scale-а
current_zoom_direction - идёт-ли увеличение или уменьшение (true - увеличение, false - уменьшение).
_zoom_step - на сколько увеличится значение scale за один шаг
_zoom_interval - собственно сам интервал
_zoom_interval_value - шаг интервала в милисекундах (1/1000 секунды)

Ну и определим их значения по-умолчанию в конструкторе:
Код

...
  current_zoom_value = _minimum_zoom_value;
  current_zoom_direction = true;
  _zoom_step = 1;
  _zoom_interval_value = 100;
...


Перепишем теперь функцию увеличения:
Код

//---------------------------------------------------------
  private function set_scale(v:Number):Void
  {
      switch (v)
      {
        case _maximum_zoom_value:
          current_zoom_direction = true;
        break;
        case _minimum_zoom_value:
          current_zoom_direction = false;
        break;
      }
      _zoom_interval = setInterval(set_scale_interval,_zoom_interval_value,this);
  }

теперь посмотрим функцию set_scale_interval

Код

  //--------------------------------------------------------
  private function set_scale_interval(obj:Object):Void
  {
      if (obj.current_zoom_direction)
      {          
          obj.current_zoom_value += obj._zoom_step;
          if (obj.current_zoom_value<obj._maximum_zoom_value)
          {
              obj.set_scale_value();
          }else
          {
              obj.current_zoom_value = obj._maximum_zoom_value;
              clearInterval(obj._zoom_interval);
          }
      }else
      {
          obj.current_zoom_value -= obj._zoom_step;
          if (obj.current_zoom_value>obj._minimum_zoom_value)
          {
              obj.set_scale_value();
          }else
          {
              obj.current_zoom_value = obj._minimum_zoom_value;
              clearInterval(obj._zoom_interval);
          }
      }
  }
  //---------------------------------------------------------

В данной функции изменяется значение zoom-а, и вызывается set_scale_value метод класса.
Код

  //---------------------------------------------------------
  private function set_scale_value():Void
  {
    this._xscale = current_zoom_value;
    this._yscale = current_zoom_value;
    var dx:Number = (this._width - start_width)/2;
    var dy:Number = (this._height - start_height)/2;
    this._x = start_x_position - dx;
    this._y = start_y_position - dy;
  }
  //---------------------------------------------------------

ну эта функция нам уже знакома...

теперь полностью код класса выглядит так:
Код

class effects.zoom extends MovieClip
{
  private var _maximum_zoom_value:Number;
  private var _minimum_zoom_value:Number;
  private var start_x_position:Number;
  private var start_y_position:Number;
  private var start_width:Number;
  private var start_height:Number;
  //----------------------------------------------------
  private var current_zoom_value:Number;
  private var current_zoom_direction:Boolean;
  private var _zoom_step:Number;
  private var _zoom_interval:Number;
  private var _zoom_interval_value:Number;
  //----------------------------------------------------
  //getters and setters
  //set maximum zoom value
  function set maximum_zoom_value(v:Number):Void
  {
    if (v>0)
    {
      _maximum_zoom_value = v;
    }
  }
  //get maximum zoom value
  function get maximum_zoom_value():Number
  {
      return _maximum_zoom_value;
  }
  //set minimum zoom value
  function set minimum_zoom_value(v:Number):Void
  {
      if (v>0)
      {
          _minimum_zoom_value = v;
          current_zoom_value = v;
      }
  }
  //get minimum zoom value
  function get minimum_zoom_value():Number
  {
      return _minimum_zoom_value;
  }
  //-----------------------------------------------------
  //class constructor
  function zoom()
  {
    _maximum_zoom_value = 120;
    _minimum_zoom_value = 100;
    start_x_position = this._x;
    start_y_position = this._y;
    start_width = this._width;
    start_height = this._height;
    current_zoom_value = _minimum_zoom_value;
    current_zoom_direction = true;
    _zoom_step = 1;
    _zoom_interval_value = 100;
  }
  //-----------------------------------------------------
  function onRollOver():Void
  {
    set_scale(_maximum_zoom_value);
  }
  function onRollOut():Void
  {
    set_scale(_minimum_zoom_value);
  }
  function onDragOver():Void
  {
    set_scale(_maximum_zoom_value);
  }
  function onDragOut():Void
  {
    set_scale(_minimum_zoom_value);
  }
  //--------------------------------------------------------
  private function set_scale_interval(obj:Object):Void
  {
      if (obj.current_zoom_direction)
      {          
          obj.current_zoom_value += obj._zoom_step;
          if (obj.current_zoom_value<obj._maximum_zoom_value)
          {
              obj.set_scale_value();
          }else
          {
              obj.current_zoom_value = obj._maximum_zoom_value;
              clearInterval(obj._zoom_interval);
          }
      }else
      {
          obj.current_zoom_value -= obj._zoom_step;
          if (obj.current_zoom_value>obj._minimum_zoom_value)
          {
              obj.set_scale_value();
          }else
          {
              obj.current_zoom_value = obj._minimum_zoom_value;
              clearInterval(obj._zoom_interval);
          }
      }
  }
  //---------------------------------------------------------
  private function set_scale_value():Void
  {
    this._xscale = current_zoom_value;
    this._yscale = current_zoom_value;
    var dx:Number = (this._width - start_width)/2;
    var dy:Number = (this._height - start_height)/2;
    this._x = start_x_position - dx;
    this._y = start_y_position - dy;
  }
  //---------------------------------------------------------
  private function set_scale(v:Number):Void
  {
      switch (v)
      {
        case _maximum_zoom_value:
          current_zoom_direction = true;
        break;
        case _minimum_zoom_value:
          current_zoom_direction = false;
        break;
      }
      _zoom_interval = setInterval(set_scale_interval,_zoom_interval_value,this);
  }
}


Всё. Есть постепенное увеличение.

Теперь надо сделать динамический контент клипа.
Пусть в нём находится какая-либо картинка с адресом.

Итак, пусть нам надо загрузить какую-либо картинку.
Напишем функцию для её загрузки.
Код

  function set image(url:String):Void
  {
      var image_mc:MovieClip = this.createEmptyMovieClip('image_movie',this.getNextHighestDepth());
      var image_loader:MovieClipLoader = new MovieClipLoader();
      var image_loader_listener:Object = new Object();
      var ths = this;
      image_loader_listener.onLoadInit = function(t)
      {
        ths.start_width = t._width;
        ths.start_height = t._height;
      }
      image_loader.addListener(image_loader_listener);
      image_loader.loadClip(url,image_mc);
  }

Ипользовали MovieClipLoader class.
onLoadInit срабатывает при начале проигрывания подгружаемого клипа или отображении картинки.
Таким образом там мы получаем размеры изображения (или клипа).

Собственно, если очень хочется, то можно сделать и прелоадер для картинки:
Код

  function set image(url:String):Void
  {
      var image_mc:MovieClip = this.createEmptyMovieClip('image_movie',this.getNextHighestDepth());
      var image_loader:MovieClipLoader = new MovieClipLoader();
      var image_loader_listener:Object = new Object();
      var ths = this;
      image_loader_listener.onLoadInit = function(t)
      {
                t['preload_txt'].removeTextField();
        ths.start_width = t._width;
        ths.start_height = t._height;
      }
          image_loader_listener.onLoadStart = function(t)
          {
                t.createTextField('preload_txt',t.getNextHighestDepth(),0,0,0,0);
                t['preload_txt'].autoSize = true;
                t['preload_txt'].text = 'Loading...';
          }
      image_loader.addListener(image_loader_listener);
      image_loader.loadClip(url,image_mc);
  }

Теперь как использовать это?
В первом кадре клипа из библиотеки в Actions пишем:
Код

this.image = "http://www.macromedia.com/images/shared/product_boxes/112x112/box_studio_112x112.jpg";
stop();

this.image = ... вызывает наш метод set image. Который и загружает изображение.

Всё. Получили класс, который позволяет увеличивать/уменьшать изображение и отображать картинку.
Full source:
Код

class effects.zoom extends MovieClip
{
  private var _maximum_zoom_value:Number;
  private var _minimum_zoom_value:Number;
  private var start_x_position:Number;
  private var start_y_position:Number;
  private var start_width:Number;
  private var start_height:Number;
  //----------------------------------------------------
  private var current_zoom_value:Number;
  private var current_zoom_direction:Boolean;
  private var _zoom_step:Number;
  private var _zoom_interval:Number;
  private var _zoom_interval_value:Number;
  //----------------------------------------------------
  //getters and setters
  //set image with content
  function set image(url:String):Void
  {
      var image_mc:MovieClip = this.createEmptyMovieClip('image_movie',this.getNextHighestDepth());
      var image_loader:MovieClipLoader = new MovieClipLoader();
      var image_loader_listener:Object = new Object();
      var ths = this;
      image_loader_listener.onLoadInit = function(t)
      {
        t['preload_txt'].removeTextField();
        ths.start_width = t._width;
        ths.start_height = t._height;
      }
      image_loader_listener.onLoadStart = function(t)
      {
            t.createTextField('preload_txt',t.getNextHighestDepth(),0,0,0,0);
            t['preload_txt'].autoSize = true;
            t['preload_txt'].text = 'Loading...';
      }
      image_loader.addListener(image_loader_listener);
      image_loader.loadClip(url,image_mc);
  }
  //set maximum zoom value
  function set maximum_zoom_value(v:Number):Void
  {
    if (v>0)
    {
      _maximum_zoom_value = v;
    }
  }
  //get maximum zoom value
  function get maximum_zoom_value():Number
  {
      return _maximum_zoom_value;
  }
  //set minimum zoom value
  function set minimum_zoom_value(v:Number):Void
  {
      if (v>0)
      {
          _minimum_zoom_value = v;
          current_zoom_value = v;
      }
  }
  //get minimum zoom value
  function get minimum_zoom_value():Number
  {
      return _minimum_zoom_value;
  }
  //-----------------------------------------------------
  //class constructor
  function zoom()
  {
    _maximum_zoom_value = 120;
    _minimum_zoom_value = 100;
    start_x_position = this._x;
    start_y_position = this._y;
    start_width = this._width;
    start_height = this._height;
    current_zoom_value = _minimum_zoom_value;
    current_zoom_direction = true;
    _zoom_step = 1;
    _zoom_interval_value = 100;
  }
  //-----------------------------------------------------
  function onRollOver():Void
  {
    set_scale(_maximum_zoom_value);
  }
  function onRollOut():Void
  {
    set_scale(_minimum_zoom_value);
  }
  function onDragOver():Void
  {
    set_scale(_maximum_zoom_value);
  }
  function onDragOut():Void
  {
    set_scale(_minimum_zoom_value);
  }
  //--------------------------------------------------------
  private function set_scale_interval(obj:Object):Void
  {
      if (obj.current_zoom_direction)
      {          
          obj.current_zoom_value += obj._zoom_step;
          if (obj.current_zoom_value<obj._maximum_zoom_value)
          {
              obj.set_scale_value();
          }else
          {
              obj.current_zoom_value = obj._maximum_zoom_value;
              clearInterval(obj._zoom_interval);
          }
      }else
      {
          obj.current_zoom_value -= obj._zoom_step;
          if (obj.current_zoom_value>obj._minimum_zoom_value)
          {
              obj.set_scale_value();
          }else
          {
              obj.current_zoom_value = obj._minimum_zoom_value;
              clearInterval(obj._zoom_interval);
          }
      }
  }
  //---------------------------------------------------------
  private function set_scale_value():Void
  {
    this._xscale = current_zoom_value;
    this._yscale = current_zoom_value;
    var dx:Number = (this._width - start_width)/2;
    var dy:Number = (this._height - start_height)/2;
    this._x = start_x_position - dx;
    this._y = start_y_position - dy;
  }
  //---------------------------------------------------------
  private function set_scale(v:Number):Void
  {
      switch (v)
      {
        case _maximum_zoom_value:
          current_zoom_direction = true;
        break;
        case _minimum_zoom_value:
          current_zoom_direction = false;
        break;
      }
      _zoom_interval = setInterval(set_scale_interval,_zoom_interval_value,this);
  }
}


Если хотите запретить увеличение/уменьшение до загрцзки изображения, то введите Boolean переменную и потом проверяйте её значение при вызове метода set_scale.
т.е.
Код

  ...
  private var can_zoom:Boolean;
  ...
  function set image(url:String):Void
  {
   ...
       image_loader_listener.onLoadInit = function(t)
       {
          t['preload_txt'].removeTextField();
      ths.start_width = t._width;
      ths.start_height = t._height;
          ths.can_zoom = true;
    }
   ...
  }
  ...
  function zoom()
  {
     ...
     can_zoom = false;
     ...
  }  
  ...
  private function set_scale(v:Number):Void
  {
     if (can_zoom)
     {
    ...
     }
  }
  ...


Полностью исходники в Attachment.

PS: Сори за такое оформление комментов, правильнее, конечно, так:
http://www.simonwacker.com/blog/archives/000087.php
Но я ещё не переучился smile

Это сообщение отредактировал(а) Alex Batsuev - 21.4.2005, 06:48

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Zoom_class4Vingrad.zip
PM MAIL WWW ICQ YIM MSN   Вверх
Dimas22157
Дата 21.4.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



Alex Batsuev
Класс эффект то что надо, может посоветуешь литературу какую почитать, а то я боюсь в будующем мне прийдется ни один такой стенд делать smile

Теперь наверное вопрос гораздо по сложенее
есть например зависимость y=ax+b
у нас на экране есть только строка для написания числа , или лучше шкала, от 0 до 100, можем выбирать значения двигая по шкале стрелочку, выбрав нужное число нажимаем ок( выбирать можно много раз), и на графике по формуле строится зависимость ( сдесь эффект вот такой, от исходной точки 0 до точки графика линия зависимости небыстро ползет и в ней останавливается, если человек нажимет на следующее значение, то линия зависимости от уже предидущей точки медленно( секунды за 3-5) ползет к след точке, если человек выбирает точку меньшую чем предидущую , то график ползет назад).....
Спасибо за то , что рассматриваете вопросы....
Извините если задал уж очень сложное задание, но хотелось бы увидеть и понять как же во флеше происходит связка функция и вырисовка графика
Спасибо заранее.
PM MAIL WWW   Вверх
AlDev
Дата 24.4.2005, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 9
Всего: 50



Ещё один ман получается....
Ну да ладно, мож кто сжалится, да репутацию поднимет smile
(Наглость не порок smile )

Ладна.
Итак, задача построить график. Например линию.
Пример графиков:
http://anychart.com/products/anychart/2DLine.shtml

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

Ладна, это прелюдия, а теперь, как говориться, людия.
[
Имеется массив значений ключевых точек и их аргументов.
Требуется построить график по этим точкам в каком-либо клипе.

Итак, опять-таки вернёмся к такой вещи, как объектно-ориентированное программирование во Flash.
Требуется сделать класс, который будет строить график в клипе.
Код

class chart extends MovieClip
{
  //class constructor
  public function chart()
  {
  }
}


Итак, у нас есть размер области построения (width, height) и данные в двух массивах (values и arguments)
Код

class chart extends MovieClip
{
  //chart area size:
  private var c_width:Number;
  private var c_height:Number;
  //chart data:
  private var c_values:Array;
  private var c_arguments:Array;
  //class constructor
  public function chart()
  {
  }
}


Ну и данные ессно должны как-то получатся, а т.к. они у нас private, то для них пропишем get и set методы.
Код

class chart extends MovieClip
{
  //chart area size:
  private var c_width:Number;
  private var c_height:Number;
  //chart data:
  private var c_values:Array;
  private var c_arguments:Array;
  //-----------------------------------------------------------------
  //getters and setters
  function set values(v:Array):Void
  {
    c_values = v;
  }
  function get values():Array
  {
    return c_values;
  }
  function set arguments(a:Array):Void
  {
    c_arguments = a;
  }
  function get arguments():Array
  {
    return c_arguments;
  }
  //-----------------------------------------------------------------
  //class constructor
  public function chart()
  {
  }
  //-----------------------------------------------------------------
}


Так, теперь установим значения chart area size при инициализации класса, и создадим пустой клип для графика
Код

...
  private var chart_mc:MovieClip; // chart movie clip
  //-----------------------------------------------------------------
  //class constructor
  public function chart()
  {
    c_width = this._width;
    c_height = this._height;
    chart_mc = this.createEmptyMovieClip('chart_clip_',this.getNextHighestDepth());
  }
  //-----------------------------------------------------------------
...


Итак, есть данные и есть размер области построения.
Сначала посчитаем масштабы по оси ox и oy. Для этого нам надо получить максимальные и минимальные значения из массивов данных и завести переменные, где всё это будет храниться.
Код

...
  private var maximum_value:Number;
  private var minimum_value:Number;
  private var maximum_argument:Number;
  private var minimum_argument:Number;
  private var values_scale:Number;
  private var arguments_scale:Number;
... 


Определим методы для вычисления max и min.
Код

...
  //get maximum array value
  private function getMax(arr:Array):Number
  {
    var res:Number = arr[0];
    var i:Number;
    for (i=0;i<arr.length;i++)
    {
      if (arr[i] > res)
      {
        res = arr[i];
      }
    }
    return res;
  }
  //get minimum array value
  private function getMin(arr:Array):Number
  {
    var res:Number = arr[0];
    var i:Number;
    for (i=0;i<arr.length;i++)
    {
      if (arr[i] > res)
      {
        res = arr[i];
      }
    }
    return res;
  }
...


Теперь можно и посчитать масштабы.
определим отдельный метод:
Код

...
private function config_scales():Void
{
  maximum_value = getMax(c_values);
  minimum_value = getMin(c_values);
  maximum_argument = getMax(c_arguments);
  minimum_argument = getMin(c_arguments);
  //set scales:
  values_scale = c_height/(maximum_value-minimum_value);
  arguments_scale = c_width/(maximum_argument-minimum_argument);
}
...


Всё. Теперь можно и визуализировать график.
Код

...
public function show():Void
{
  config_scales();
  var i:Number;
  chart_mc.lineStyle(1,0x000000,100);//set line color=black, size = 1, alpha = 100;
  var x_pos:Number = c_height - (c_values[0]-minimum_value)*values_scale;
  var y_pos:Number = (c_arguments[0] - c_minimum_argument)*arguments_scale;
  chart_mc.moveTo(x_pos,y_pos);
  for (i=0;i<c_values.length;i++)
  {
    x_pos = c_height - (c_values[i]-minimum_value)*values_scale;
    y_pos = (c_arguments[i] - c_minimum_argument)*arguments_scale;;
    chart_mc.lineTo(x_pos,y_pos);
  }
}
...


Ну и метод очистки:
Код

...
public function remove():Void
{
  chart_mc.clear();
}
...


Всё. Есть простейший график.
Теперь сделаем так, чтобы можно было во время работы делать его перерисовку просто меняя данные. Для этого объявим переменную, которая будет показывать, нарисован график или нет:
Код

...
  private var is_paint:Boolean;
...
  //class constructor
  public function chart()
  {
  ...
    is_paint = false;
  ...
  }
  ...
  public function show():Void
  {
     ...
     is_paint = true;
  }


И вернёмся к get/set методам нашего класса:
Код

...
  function set values(v:Array):Void
  {
    c_values = v;
    if (is_paint)
    {
      if (c_values.length==c_arguments.length)
      {
        remove();
        show();
      }
    }
  }
...
  function set arguments(a:Array):Void
  {
    c_arguments = a;
    if (is_paint)
    {
      if (c_values.length==c_arguments.length)
      {
        remove();
        show();
      }
    }
  }
...



Всё. Теперь можно спокойно открыть fla-файл, сделать в библиотеке клип, нарисовать в нём прямоугольник для графика и поставьть AS2 класс chart.

Полностью исходники класса:
Код

class chart extends MovieClip
{
  //chart area size:
  private var c_width:Number;
  private var c_height:Number;
  //chart data:
  private var c_values:Array;
  private var c_arguments:Array;
  private var chart_mc:MovieClip; // chart movie clip

  private var maximum_value:Number;
  private var minimum_value:Number;
  private var maximum_argument:Number;
  private var minimum_argument:Number;
  private var values_scale:Number;
  private var arguments_scale:Number;

  private var is_paint:Boolean;
  //-----------------------------------------------------------------
  //getters and setters
  function set values(v:Array):Void
  {
    c_values = v;
    if ((is_paint) && (c_values.length==c_arguments.length))
    {
      remove();
      show();
    }
  }
  function get values():Array
  {
    return c_values;
  }
  function set arguments(a:Array):Void
  {
    c_arguments = a;
    if ((is_paint) && (c_values.length==c_arguments.length))
    {
      remove();
      show();
    }
  }
  function get arguments():Array
  {
    return c_arguments;
  }
  //-----------------------------------------------------------------
  //class constructor
  public function chart()
  {
    c_width = this._width;
    c_height = this._height;
    chart_mc = this.createEmptyMovieClip('chart_clip_',this.getNextHighestDepth());
    is_paint = false;
  }
  //-----------------------------------------------------------------
  //show chart
  public function show():Void
  {
    config_scales();
    var i:Number;
    chart_mc.lineStyle(1,0x000000,100);//set line color=black, size = 1, alpha = 100;
    var x_pos:Number = c_height - (c_values[0]-minimum_value)*values_scale;
    var y_pos:Number = (c_arguments[0] - c_minimum_argument)*arguments_scale;
    chart_mc.moveTo(x_pos,y_pos);
    for (i=0;i<c_values.length;i++)
    {
      x_pos = c_height - (c_values[i]-minimum_value)*values_scale;
      y_pos = (c_arguments[i] - c_minimum_argument)*arguments_scale;;
      chart_mc.lineTo(x_pos,y_pos);
    }
    is_paint = true;
  }
  //clear chart
  public function remove():Void
  {
    chart_mc.clear();
  }
  //--------------------------------------
  //config scales
  private function config_scales():Void
  {
    maximum_value = getMax(c_values);
    minimum_value = getMin(c_values);
    maximum_argument = getMax(c_arguments);
    minimum_argument = getMin(c_arguments);
    //set scales:
    values_scale = c_height/(maximum_value-minimum_value);
    arguments_scale = c_width/(maximum_argument-minimum_argument);
  }  
  //get maximum array value
  private function getMax(arr:Array):Number
  {
    var res:Number = arr[0];
    var i:Number;
    for (i=0;i<arr.length;i++)
    {
      if (arr[i] > res)
      {
        res = arr[i];
      }
    }
    return res;
  }
  //get minimum array value
  private function getMin(arr:Array):Number
  {
    var res:Number = arr[0];
    var i:Number;
    for (i=0;i<arr.length;i++)
    {
      if (arr[i] > res)
      {
        res = arr[i];
      }
    }
    return res;
  }
}


PS: Я на работоспособность не проверял.... с ходу писал.... но вроде всё должно работать. Возможны ошибки и очепятки....

Вообщем удачи. Я тут только смысл объяснил....
Если нада продолжить - спрашивайте, что именно надо.
PM MAIL WWW ICQ YIM MSN   Вверх
Dimas22157
Дата 24.4.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



Alex Batsuev
Извиняюсь за наглость, можно ли было по этому мануалу выложить конечные получившиеся fla и swf фаилы.
Спасибо огромное за помощь, репутацию повысить не могу 100 постов нет smile smile

Это сообщение отредактировал(а) Dimas22157 - 24.4.2005, 10:11
PM MAIL WWW   Вверх
AlDev
Дата 24.4.2005, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 9
Всего: 50



нету файлов... не делал... тут сразу писал...
PM MAIL WWW ICQ YIM MSN   Вверх
Dimas22157
Дата 24.4.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.4.2005

Репутация: нет
Всего: нет



Цитата(Alex @ 24.4.2005, 05:20)
... но вроде всё должно работать. Возможны ошибки и очепятки....


Очепятки smile , возможны....можно ли хотя бы простейший пример выложить в исходниках smile
А то все это я боюсь пока не соберу smile
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Flash"
AlDev
SoWa
  • Если вы хотите предложить кому-либо работу, то пишите или в личку, или оставляйте сообщения в специально предназначеном для этого форуме "Объявления о найме специалистов"
  • Один вопрос - одна тема. Не надо переходов от одного вопроса к другому.
  • Если вы хотите показать какой-нибудь ваш мульт, причём показать, а не предоставить исходник, то вам сюда
  • Вопросы про программирование на ActionScript 1,2 (Flash 8 и более ранние версии) пишите в форуме ActionScript 1,2
  • Вопросы по разработке интернет-приложений на Flex и вопросы по MXML пишите в раздел Flex
  • Смотрим в будущее. ActionScript 3 обсуждается в форуме ActionScript 3
  • Новости из мира Flash.
  • New! [code=ascript][/code] - подсветка ActionScript + wikipedia help

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, AlDev, SoWa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Flash | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.