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

p0okm 28.06.2009 18:29

Не могу вызвать переменную из вспомогательного файла
 
Начал изучать AS3 по книге

ActionScript 3.0 для Flash
Подробное руководство
Колина Мука

Запнулся в самом начале, вот цитата с кодом:

"
Код AS3:

package zoo { 
    internal class VirtualPet {
      var petName = "Unnamed Pet";
    }
}

В результате использования приведенного кода переменная экземпляра petName
будет автоматически присоединена к каждому новому экземпляру класса VirtualPet.
Исходным значением переменной petName для всех экземпляров класса VirtualPet
будет являться фраза Unnamed Pet.
----------------------------------------------------------------------------------

Локальной переменной присвоим имя pet, а для связывания объекта VirtualPet с этой
переменной воспользуемся инициализатором. Привожу код:

Код AS3:

package zoo { 
  public class VirtualZoo {
    public function VirtualZoo ( ) {
      var pet = new VirtualPet;
    }
  }
}

Теперь, когда локальная переменная pet связана с объектом VirtualPet, она
может быть использована для обращения к объекту и, следовательно, для управления
им.

"

Прочитав это я так понял, что переменная pet теперь имеет значение и это значение Unnamed Pet.

Я создал 2 файла mous01.as и zna.as в каталоге proba.
В корневом каталоге создал файл mous01.fla и связал его с классом proba.mous01

Листинг файла mous01.as создаёт круг, а цвет заливки круга я хочу получить из внешнего файла zna.as
того же пакета proba.

код mous01.as:
Код AS3:

package proba { 
    import flash.display.*;
 
    public class mous01 extends MovieClip {
 
          public function mous01() { 
                    var cvet = new zna;
                              graphics.lineStyle(9, 500000);
                        graphics.beginFill( cvet );
                        graphics.drawCircle( 100, 100, 70);
 
            }
    }
}

код zna.as
Код AS3:

package proba { 
 
    public class zna {
              var kolor = 111111;
    }
}

То есть по сути я полностью повторил код Мука, но круг у меня рисуется с чёрной заливкой,
а компилятор о ошибках не сообщает.
То есть значение переменной kolor из файла zna.as не передаётся в переменную cvet файла mous01.as.

Помогите разобраться почему так происходит.

ramshteks 28.06.2009 18:32

вы создаете обьект класса zna, а колор это поле этого обьекта.

MonkDead 28.06.2009 18:46

Код AS3:

var petName = "Unnamed Pet";
var pet = new VirtualPet;
var cvet = new zna;
var kolor = 111111;

Это так в книге написано, странно? Переменные должны быть типизированны! Также название классов должны быть с большой буквы, например Zna а не zna.
Код AS3:

var petName:String = "Unnamed Pet";
var kolor:uint = 111111;

и т.д.

Код AS3:

package proba { 
    import flash.display.*;
 
    public class Mous01 extends MovieClip {
 
          public function Mous01() { 
                    var cvet:Zna = new Zna();
                              graphics.lineStyle(9, 500000);
                        graphics.beginFill( cvet.kolor);
                        graphics.drawCircle( 100, 100, 70);
 
            }
    }
}


p0okm 28.06.2009 19:09

MonkDead - спасибо за помощь, заработало.

Ключевым было
Код AS3:

graphics.beginFill( cvet.kolor);

По поводу написания имён классов с большой буквы это Вас обманули :)

Работающий код теперь такой

Код AS3:

package proba { 
    import flash.display.*;
 
    public class mous01 extends MovieClip {
 
          public function mous01() { 
                    var cvet = new zna;
                              graphics.lineStyle(9, 500000);
                        graphics.beginFill( cvet.kolor);
                        graphics.drawCircle( 100, 100, 70);
 
            }
    }
}

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

graphics.beginFill( cvet.kolor);

Не сочтите за наглость, но пожалуйста поясняйте свои ответы примерами.

ramshteks 28.06.2009 20:06

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

MonkDead 28.06.2009 20:31

p0okm, давайте представим что вы это объект во вселенной, у вас есть имя. Имя вы пишете свое с большой буквы, не так ли? Соответственно хотя бы из этой аналогии надо имя класса писать с большой буквы.
Код AS3:

graphics.beginFill( cvet.kolor);

Вы в классе Zna задаете свойство kolor, создаете экземпляр класса
Код AS3:

var cvet:Zna = new Zna();

что бы получить значение свойства вы должны вызвать его
Код AS3:

cvet.kolor

Еще один важный аспект не называйте свойства, методы, классы используя транслит. Вместо kolor надо писать color, иначе ваш код просто читать невозможно.

p0okm 29.06.2009 02:26

Ещё раз благодарю за помощь, но по поводу заглавной литеры в имени класса позволю себе с вами не согласиться. В документации нигде не сказано про условие именно так начинать написание имени класса, компилятор так же не протестует по этому поводу поэтому написание имени класса с прописной литеры не может быть причиной неработоспособного кода.
Локально - kolor я не мог написать с "с" так как есть служебное слово "color"
поэтому и применил альтернативную литеру, которая не изменяла сути понимания переменной.
Ещё раз искренне благодарю за помощь.

etc 29.06.2009 07:47

Цитата:

Сообщение от p0okm (Сообщение 831586)
Ещё раз благодарю за помощь, но по поводу заглавной литеры в имени класса позволю себе с вами не согласиться. В документации нигде не сказано про условие именно так начинать написание имени класса, компилятор так же не протестует по этому поводу поэтому написание имени класса с прописной литеры не может быть причиной неработоспособного кода.

А дело не в неработоспособности кода. Дело в том, что есть общепринятые правила именования. Хорошая IDE (Flash IDE к ним не относится) либо вообще не даст создать класс с неправильным именованием, либо замучает предупреждениями. Компилятор же позволяет компилить любое имя в любом виде, хоть на русском. Исключительно в силу того, что ему эти названия полезной нагрузки не несут, это для людей.
Ни один класс флешевого фреймворка не даёт повода именовать классы со строчной буквы, однако называть свои собственные классы как попало в последнее время стало модно :boredom:

ramshteks 29.06.2009 07:51

если можно не значит хорошо.
Есть конвенции или как их там. Есть стиль. Есть правила. Но вы из тех кто считает что правила всегда нужно нарушать?
Ах да кстати, компилятор не будет ругаться так же если вы по русски будете называть переменные. Это так круто, среди нас никто еще не решился на такую дерзость... Может вы будете нашим героем?))

А насчет служебного слова... ну нет в этом языке служебных слов color есть поля color. Служебные слова это for if return к примеру, а color нет. Ну опять таки возможно в книжке не сказано что color не является служебным словом, так что зачем рисковать ))

Добавлено через 59 секунд
опоздал...)


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

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