Форум 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=210388)

Фомич 09.03.2015 23:45

Общая переменная для классов
 
Приветствую! Перешел к размещению кода к классам(выполняют разные задачи) и необходимо задать для всех классов одну общую переменную (чтобы они общались ), пробовал импортировать класс и оперировать значением класс.переменная, но выдает ошибку. Как вы вообще решаете такие задачи по общению классов?

samana 09.03.2015 23:58

Можно попробовать статическими переменными.

Фомич 10.03.2015 00:00

Достаточно будет записать такую static var переменную в основном классе? Будет ли она трактоваться в зависимости от приватности класса, который захочет её изменить?

neonoviiwolf 10.03.2015 00:04

ну можно по разному, мне хватает пока
Код AS3:

package {
        import StartClass.StartDaubClass;
        public class main {
                  private var daub: StartDaubClass;
                  private var i: Number = 10;
                  public function main(){
                            daub =  = new StartDaubClass(i)  //отправляете ссылку на i в этот экземпляр классаStartDaubClass
                  }
      }
}

Код AS3:

package {
        public class StartDaubClass {
              private var i: Number;
              public function StartDaubClass (_i){
                      i = _i;                                            //тут собственно вы и пересылаете ссылку на на переменную, можно так переслать и ссылки на экземпляры класса
              }
        }
}

писал без проверки

Фомич 10.03.2015 00:48

Спасибо попробовал, но мне требуется передать данные в реальном времени между классами, а здесь получается от основного класса передается другим. Например в одном из классов изменилась переменная и её значение можно использовать везде.
Код AS3:

package {
        import StartClass.StartOneClass;
        import StartClass.StartTwoClass;
        public class main {
                  private var daub1: StartOneClass;
                  private var daub2: StartTwoClass;
                  private var i: Number = 10;
                  public function main(){
                            daub1 = new StartOneClass(i)  // начальное значение i =10
                            daub2 = new StartTwoClass(i)  // начальное значение i =10
                  }
      }
}

И вот теперь надо как то изменив значение i в одном из классов Start...Class чтобы другие классы увидели. Суть проблемы такова, что по событию в StartOneClass нужно изменить переменную в StartTwoClass...

neonoviiwolf 10.03.2015 00:55

измените в одном классе и измениться во всех, а чтоб класс отреагировал нужен слушатель событий
что-то типо
Код AS3:

stage.addEventListener(Event.ENTER_FRAME, eventFunction);
private function eventFunction(e: Event): void{
      if (i == 9) // этот слушатель событий будет каждый кадр проверять "не равно ли i 9", что бы выполнить код ниже
            //ваш код
}


если у вас код будет ругаться, то нужно
Код AS3:

package {
        import StartClass.StartOneClass;
        import StartClass.StartTwoClass;
        public class main {
                  private var daub1: StartOneClass;
                  private var daub2: StartTwoClass;
                  private var i: Number = 10;
                  public function main(){
                            daub1 = new StartOneClass(i, stage)  // начальное значение i =10
                            daub2 = new StartTwoClass(i, stage)  // начальное значение i =10
                  }
      }
}

а дальше в каждом классе StartOneClass и StartTwoClass написать
Код AS3:

package {
        public class StartDaubClass {
              private var i: Number;
              private var stage:*;
              public function StartDaubClass (_i, _stage){
                      i = _i;
                      stage = _stage;                                         
              }
        }
}

ну это если будет ругаться, хотя можно и с this к примеру - но я предпочитаю так

код не проверял

Фомич 10.03.2015 02:02

Сделал по схеме, не ругается, все работает, из класса main значение =0 передает в функцию StartOneClass и StartTwoClass, в StartOneClass меняю значение на 10, в классе StartTwoClass делаю trace значения в отслеживателе события. Получается 0, 0 , 0 , .... То есть не срабатывает.

neonoviiwolf 10.03.2015 02:45

хм, действительно, ссылки на классы передаются, а вот на переменные создаёт новые экземпляры - думал, что сходно действие, ну тогда как вариант
Код AS3:

package {
        public class StartOneClass{
              public var i: Number;
              private var stage:*;
              public function StartOneClass(_i, _stage){
                      i = _i;
                      stage = _stage;                                         
              }
        }
}

дальше в основном классе
Код AS3:

package {
        import StartClass.StartOneClass;
        import StartClass.StartTwoClass;
        public class main {
                  private var daub1: StartOneClass;
                  private var daub2: StartTwoClass;
                  private var i: Number = 10;
                  public function main(){
                            daub1 = new StartOneClass(i, stage)// начальное значение i =10
                            daub2 = new StartTwoClass(i, stage)// начальное значение i =10
                            stage.addEventListener(Event.ENTER_FRAME, functionControl);
                  }
                  private function functionControl (e: Event): void{
                        if (StartOneClass.i != i){
                                  //вызывает public(создать ее) функцию из StartTwoClass(или ещё какой/их), в которой написано что делать, коль изменена i
                                  //ну и аналогичная проверка для иных классов
      }
}

код не проверял
это на скорую руку как вариант, что бы я написал, мож что получше подскажут

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

Фомич 10.03.2015 03:05

Цитата:

1119: Access of possibly undefined property i through a reference with static type Class.
Код AS3:

if (StartOneClass.i != StartTwoClass.i){...

Не хочет создавать и кроме того подозреваю, что таким способом можно передавать значения true/false а не числовые, если вообще выйдет.
samana предложил статические использовать переменные, что за способ?

neonoviiwolf 10.03.2015 03:21

Проверил последний вариант - работает, думаю у вас ошибка
про статистический не могу ничего сказать, читал, понимаю, но ни разу не пригодился, так что писать от болды не стану

Добавлено через 1 минуту
вы написали public var i ?


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

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