Путаница с местоположением кода в Flash CS5 - PullRequest
0 голосов
/ 30 января 2012

Всякий раз, когда я помещаю следующий код в первый кадр моего фильма, он отлично работает:

var strGlobal:String = "Global"; 
function scopeTest() 
{ 
    trace(strGlobal); // Global 
} 
scopeTest(); 
trace(strGlobal); // Global

Но когда я удаляю его и помещаю в класс документов, он выдает ошибку: "Вызов возможного неопределенного метода scopeTest" "Доступ к неопределенному свойству strGlobal"

Я новичок в ActionScript 3, и мне было интересно, что изменить, чтобы этот простой пример работал из моего основного класса документов.

Ответы [ 2 ]

1 голос
/ 30 января 2012

В том же каталоге, что и ваш .fla файл, создайте файл с именем ScopeTest.as и определите следующий класс:

package  {
    import flash.display.MovieClip;
    public class ScopeTest extends MovieClip  {
        var strGlobal:String = "Global"; 
        public function ScopeTest() {
            trace(strGlobal); // Global 
        }
    }
}

Затем внутри вашего проекта .fla (класс документа):

enter image description here

Затем, когда вы запустите его, вы должны получить «Global», чтобы подтвердить, что он работает.

0 голосов
/ 30 января 2012

Давайте посмотрим на написание класса документа.

Шаг 1: Объявление пакета - пакет представляет место, где хранится класс .fla вашего документа. Если ваш класс документов находится в том же каталоге, что и .fla, вам просто нужно написать:

package

Если это в папке, вам нужно добавить это после package. Допустим, ваш класс документов находился в каталоге с именем src:

package src

Теперь, когда это отсортировано, у вас должно быть что-то вроде этого:

package
{
    //
}

Следующее, что вам нужно сделать, это импортировать классы, которые вам понадобятся в вашем классе документов. Вы захотите расширить MovieClip в своем классе документов, поэтому давайте импортируем это:

package
{
    import flash.display.MovieClip;
}

Это все, что нам нужно, чтобы охватить ваш пример, так что теперь мы переходим к третьему необходимому элементу, объявлению класса. В данном случае он состоит из трех частей:

  1. Пространство имен класса - может быть либо internal (если вы хотите, чтобы ваш класс был доступен только для классов в одном пакете), либо public (доступно в любом месте проекта).
  2. Ваше имя класса.
  3. Что будет расширять ваш класс - в данном случае MovieClip.

Все вместе, ваше будет выглядеть так:

public class Document extends MovieClip

Теперь у вас будет что-то похожее на приведенное ниже, что означает, что вы можете начать добавлять properties и methods:

package
{
    import flash.display.MovieClip;

    public class Document extends MovieClip
    {
        //
    }
}

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

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

package
{
    import flash.display.MovieClip;

    public class Document extends MovieClip
    {
        // Constructor
        public function Document()
        {
            //
        }
    }
}

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

  1. Пространство имен - это определяет доступность вашей собственности. Если вы пропустите это, по умолчанию будет internal. На данный момент это основы:
    • public - Ваша собственность доступна из любого места, где есть ссылка на экземпляр вашего класса.
    • private - Ваша собственность доступна только из класса - сначала это кажется бесполезным, но в конечном итоге вы обнаружите, что в первую очередь используете это.
    • protected - Ваша собственность доступна в классах, расширяющих ваш класс.
    • internal - Ваша собственность доступна из классов в одном пакете.
  2. Название вашей собственности.
  3. Тип Вашей недвижимости.
  4. Стоимость вашей недвижимости.

В вашем случае strGlobal будет выглядеть примерно так:

public var strGlobal:String = "Global";

Давайте добавим это к вашему классу документов:

package
{
    import flash.display.MovieClip;

    public class Document extends MovieClip
    {
        // Properties
        public var strGlobal:String = "Global";

        // Constructor
        public function Document()
        {
            //
        }
    }
}

Далее, вы захотите создать свой метод scopeTest() в соответствии с вашим вопросом. Методы состоят из 5 частей:

  1. Пространство имен - методы используют те же пространства имен, что и свойства (см. Выше).
  2. Имя метода.
  3. Аргументы метода.
  4. Тип возврата.
  5. содержание. * * 1092

scopeTest() не имеет аргументов и ничего не возвращает, поэтому будет выглядеть так:

public function scopeTest():void
{
    trace(strGlobal);
}

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

package
{
    import flash.display.MovieClip;

    public class Document extends MovieClip
    {
        // Properties
        public var strGlobal:String = "Global";

        // Constructor
        public function Document()
        {
            //
        }

        // Output the value of strGlobal
        public function scopeTest():void
        {
            trace(strGlobal);
        }
    }
}

Теперь, когда все готово, вы сможете вызывать scopeTest() из вашего конструктора. Поскольку конструктор вызывается немедленно, вы должны увидеть Global, напечатанный на вашей панели вывода (при условии, что вы правильно связались с ним в Flash IDE).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...