Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   динамическое создание ссылок/кнопок/мувиклипов (http://www.flasher.ru/forum/showthread.php?t=144370)

shuhermayer 10.09.2010 11:53

динамическое создание ссылок/кнопок/мувиклипов
 
Вопрос, связанный с заточкой данных функций именно под AS3. Раньше делал динамическое создание кнопок (именно текстовых) так, как сейчас нашёл в теме форума из AS2:

Код AS1/AS2:

var my_array = ["Link 1", "Link 2", "Link 3", "Link 4", "Link 5", "Link 6"];
 
for (var i = 0; i<my_array.length; i++) {
        var mc = this.createEmptyMovieClip("target_mc"+i, i);
        mc._y = 30*i;
        var mc_txt = mc.createTextField("txt", 0, 0, 0, 100, 30);
        mc_txt.border = true;
        mc_txt.text = my_array[i];
        //
        mc.onPress = function() {
                trace(this.txt.text);
        };
}

Подскажите, как переделать под AS3? облазил это весь поиск этим динамическим созданием ссылок, но всё только с AS2 =(

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

Obi 10.09.2010 12:34

Код AS3:

var myArray:Array = ["Link 1", "Link 2", "Link 3", "Link 4", "Link 5", "Link 6"];
for(var i:int = 0; i < myArray.length; i++) {
  var mc:Sprite = new Sprite();
  mc.y = 30*i;
 
  var tf:TextField = new TextField();
  tf.autoSize = TextFieldAutoSize.LEFT;
  tf.border = true;
  tf.name = 'buttonTextField';
  tf.text = myArray[i] as String;
 
  mc.addChild(tf);
  mc.addEventListener(MouseEvent.CLICK, buttonClickHandler);
 
  addChild(mc);
}
 
function buttonClickHandler(event:MouseEvent):void {
  var btn:Sprite = event.currentTarget as Sprite;
  var tf:TextField = btn.getChildByName('buttonTextField') as TextField;
  trace('clicked text:', tf.text);
}


shuhermayer 10.09.2010 12:52

спасибо! надо конечно учить AS3..

а почему забыть про динамические св-ва и MC? чем они по сути плохи стали?

-De- 10.09.2010 13:01

Динамические св-ва и были плохи, они ж не бесплатны, понятное дело. Больше памяти жрут динамические классы как минимум.
В MC всё равно нельзя добавить програмно кадры, потому (если не считать того, что МС dynamic, но про это см. первое предложение) тут лучше спрайт.

Obi 10.09.2010 13:05

Цитата:

Сообщение от shuhermayer (Сообщение 934806)
спасибо! надо конечно учить AS3..

а почему забыть про динамические св-ва и MC? чем они по сути плохи стали?

Они не стали, они и были плохи, просто в ас1 приходилось с этим мириться (да и то не всем).

А плохи они например тем, что используя динамические свойства вы отказываетесь от статической проверки кода компилятором, и когда у вас внезапно в текстовом поле отобразится NaN, вы сломаете голову, прежде чем найдете ошибку.

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

Или тем, что читабильность кода, в котором используются динамические свойства, ниже плинтуса.

Или тем, что обращение к динамическим свойствам на порядок медленнее.

-De- 10.09.2010 13:36

По-моему в вашем тексте можно заменить "динамические свойства" на getChildByName %) Но его хоть явно видно, когда используют.
Пост ниже советую топикстартеру ценить, там код лишен всех недостатков динамических штук (а писать такое по поводу такого вопроса на форуме обычно лень).

Obi 10.09.2010 13:54

Цитата:

Сообщение от -De- (Сообщение 934830)
По-моему в вашем тексте можно заменить "динамические свойства" на getChildByName %) Но его хоть явно видно, когда используют.

Я рассуждал на тему динамических свойств не относительно этого примера, а в целом.
Но если уж быть дотошным, то правильнее было-бы написать нечто вроде этого:

Код AS3:

package {
 
 
  class MyClass extends Sprite {
 
      private var _myArray:Array;
 
      public function MyClass() {
 
      _myArray = ["Link 1", "Link 2", "Link 3", "Link 4", "Link 5", "Link 6"];
 
      for(var i:int = 0; i < myArray.length; i++) {
          var btn:MyBtn = new MyBtn(_myArray[i] as String);
          btn.y = 30*i;
          btn.addEventListener(MouseEvent.CLICK, buttonClickHandler);
          addChild(btn);
      }
 
      }
 
      private function buttonClickHandler(event:MouseEvent):void {
        var btn:MyBtn = event.currentTarget as MyBtn;
        trace('clicked text:', btn.link);
      }
  }
 
  class MyBtn extends Sprite {
 
      private var _link:String;
 
      public function MyBtn(link:String) {
        _link = link;
        var tf:TextField = new TextField();
        tf.autoSize = TextFieldAutoSize.LEFT;
        tf.border = true;
        tf.text = link;
        addChild(tf);
      }
 
      public funciton get link():String {
          return _link;
      }
  }
}



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

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