Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как из класса добраться до "_root"-а? (http://www.flasher.ru/forum/showthread.php?t=131260)

Dmitry Y 16.10.2009 02:37

Как из класса добраться до "_root"-а?
 
Только начинаю переходить на AS3 и вот какой вопрос, наверное детский.
На сцене, в "_root"-е (специально пишу с "_", пока мне так яснее) ecть текстовое поле txt.
Класс документа A:
Код AS3:

package {
  import flash.display.MovieClip;
  import flash.text.TextField;
  public class A extends MovieClip {
    function A() {
      txt.text = 'aaa';
    }
  }
}

Так работает, "aaa" в текстовом поле.

А если делаю другой класс В:
Код AS3:

package {
  import flash.display.MovieClip;
  import flash.text.TextField;
  public class B extends MovieClip {
    function B() {
      txt.text = 'aaa';
    }
  }
}

и вызываю его из A:
Код AS3:

package {
  import flash.display.MovieClip;
  import flash.text.TextField;
  public class A extends MovieClip {
    function A() {
      var b:B = new B();
    }
  }
}

не работает, ошибка: "1120: Access of undefined property txt"

Как правильно это делать, обращаться к чему-либо на главной временной диаграмме (или еще где-то) из таких вот последовательно вызванных классов?

MrPoma 16.10.2009 07:23

Вы класс к символу в библиотеке прикрипляете, я так полагаю. В таком случае нужно у символа, на который вы вешаете класс B, создать текстовое поле с инстенс неймом txt. Сначала надо объявить переменную, потом обращаться.

me2 16.10.2009 15:31

рут в твоём понимании будет stage.getChildAt(0)...
тоесть обратиться к текстовому полю нужно примерно так:
var tipaRoot=stage.getChildAt(0);
tipaRoot.txt.text='tralala'; или tipaRoot.getChildByName('txt').text='tralala';

Dmitry Y 16.10.2009 16:15

MrPoma, у меня пока в библиотеки для этого ничего нет. И, в общем-то, хотел обойтись без этого: просто класс, который пишет слова в текстовые поля из словаря.
Но все равно спасибо.

me2, спасибо. Ваш вариант как-то подтолкнул к нужному решению.

В результате сделал так:

Код AS3:

//Класс A (класс документа, т.е. и есть "_root"):
 
package {
  import flash.display.MovieClip;
  import flash.text.TextField;
 
  public class A extends MovieClip {
    function A() {
            var b:B = new B(this);
    }
  }
}
 
//Класс B:
 
package {
  import flash.display.MovieClip;
  import flash.text.TextField;
  public class B extends MovieClip {
    function B(where) {
      where.txt.text = 'bbb';
    }
  }
}

Кажется, такой вариант более гибкий.

Спасибо всем!

MrPoma 16.10.2009 20:48

А зачем мильён ненужных экземпляров? Может лучше сделать статичным?

Dmitry Y 16.10.2009 21:23

Сделать статичным текст? Будет неудобно.
Предполагаются локализованные версии: русский, английский, испанский и т. д. Теоретически можно добавить потом и др. языки.
Здесь, для примера, упрощенный вариант, конечно.
На самом деле в классе В буду 1 раз пробегать по XML и распихивать слова куда надо, в поля, в переменные.

MrPoma 17.10.2009 01:22

Не статичный текст, а класс со статичным методом.


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

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