AS3 / Flash: почему перемещение файла класса символа из каталога верхнего уровня в более глубокий каталог нарушает связь между символом и файлом класса? - PullRequest
0 голосов
/ 09 февраля 2010

:: РЕДАКТИРОВАТЬ ::

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

РЕЗЮМЕ:

Когда у меня есть класс, связанный с MovieClip в моей библиотеке, и этот класс принимает аргумент в своем методе конструктора. Этот класс будет правильно скомпилирован ТОЛЬКО тогда, когда он находится в моем каталоге верхнего уровня (тот же каталог, что и файлы .fla и Document.as). Если я переместу этот класс в более глубокий каталог, скажем, com.place, и соответствующим образом обновлю оператор пакета и символьную ссылку, компилятор выдаст ошибку «1136: неверное количество аргументов. Ожидается 0».

ДЛЯ ВОССТАНОВЛЕНИЯ:

  • Создайте флеш-проект и поместите прямоугольник на сцену. Переведите его в символ и назначьте его классу TestPanel - или как вам захочется. Также настройте fla так, чтобы он использовал класс Document (Main).

  • Создайте Main.as и TestPanel.as в одной папке. В классе Main создайте экземпляр экземпляра TestPanel и добавьте его на сцену. Flash, как и ожидалось, добавит символ прямоугольника, и все в порядке.

  • Теперь измените TestPanel, чтобы его метод конструктора принял Number и чтобы Main.as передавал некоторое число в TestPanel.

    публичная функция TestPanel (num: Number) { trace ('TestPanel создана: num =' + num); }

    публичная функция Main () { trace ('Main is initialized'); var myTestPanel: TestPanel = new TestPanel (5); addChild (myTestPanel); }

  • Теперь переместите TestPanel в com / place / TestPanel и обновите оператор пакета, чтобы отразить его новое местоположение. Также обновите прямоугольный символ в библиотеке, чтобы он связывался с com.place.TestPanel.

Теперь вы получаете ошибку: 1136: Неверное количество аргументов. Ожидаемый 0.

Когда я перемещаю TestPanel.as в более глубокий каталог, Flash каким-то образом ищет в другом месте базовый класс для Symbol, хотя я сопоставляю этот Symbol с com.place.TestPanel.

Кто-нибудь может воссоздать это и сказать мне, где я спотыкаюсь?

(извините, что не выделил код в этом посте. Мне кажется, что этот редактор не работает должным образом)

Ответы [ 4 ]

1 голос
/ 09 февраля 2010

Я добавил com.place.MO в базовый класс (у меня тоже работает для класса)

и создал как файл

package com.place{
    import flash.display.Sprite;

    public class MO extends Sprite {

        public function MO():void {
            rotation = 45;
        }
    }
}

, который находится в каталоге com / place /, в том же месте, что и файл fla.

и это работает. Не могли бы вы рассказать о классе или его важных частях?

0 голосов
/ 11 февраля 2010

Я понял, откуда я получаю свою ошибку.

Во-первых, спасибо всем за участие.

Случилось так, что мой Символ связывался с моим классом в поле «Базовый класс», а не в поле «Класс». Я не знаю точно, когда я начал эту привычку, но я делал это всегда, и, очевидно, это не имело значения, потому что ни один из моих классов не использовал аргументы в своем конструкторе - до сих пор. Это также объясняет, почему он работает в каталоге верхнего уровня, а не при вложении в com / place / what.

Для тех, кто сталкивается с такой же / подобной проблемой, не забудьте проверить, что вы обозначаете ссылки на свой класс в поле «Класс», а не в поле «Базовый класс».

Вот ссылка на документацию Adobe по этому вопросу.

0 голосов
/ 10 февраля 2010

РЕДАКТИРОВАТЬ: Я воспроизвел шаги, и все это прекрасно работает. Убедитесь, что FlashIDE находит ваш класс (нажав на зеленую галочку рядом с дорожкой). Также дважды проверьте, что у вас нет другого символа с таким же именем, который портит его (глупо, но часто встречается).

Старый ответ:


Все немного сбивает с толку наличие в библиотеке определений и их привязка к сценариям.

Если вы кодируете, используя чистый ActionScript, то же сообщение об ошибке появится, если вы расширяете класс, требующий аргументов конструктора, без вызова «super(*arguments*)» из расширенного класса. Проблема совершенно очевидна, так как все унаследованные конструкторы должны вызываться при создании экземпляра объекта, любые пропущенные аргументы не смогут этого сделать.


будет работать:

  • класс Citroen () -> супер (4) -> расширяет класс автомобилей (колёса: int) -> 4 колеса
  • класс Citroen () -> расширяет класс Автомобиль (колеса: int = 2) -> минимум 2 колеса, если не указано
  • класс Ситроен (колёса: int) -> супер (колеса) -> расширяет класс Автомобиль (колеса: int) -> количество колес, которое нужно указать при создании

не будет работать:

  • класс Volvo () -> расширяет класс Автомобиль (колеса: int) -> нет колес когда-либо : P

Теперь, я думаю, если вы добавите определение класса для Symbol в библиотеке, вы неявно разрешите создание этого символа, перетаскивая его на сцену во Flash IDE, не определяя аргументы конструктора (даже если вы специально этого не сделаете ). Таким образом, теоретически, это приведет к тому же, как объяснено ранее, и будет выдано '1203: конструктор по умолчанию не найден в базовом классе'

Попробуйте это : в базовом классе добавьте значения по умолчанию ко всем аргументам в конструкторе (например, name:String = 'me', age:int = 99). Это позволит вам расширить класс (путем подкласса из библиотеки) без передачи каких-либо аргументов. Надеюсь, это поможет компилятору позволить вам скомпилировать.

В случае, если вы действительно хотите принудительно передавать аргументы, я бы посоветовал вам сделать это наоборот: создать экземпляр и добавить символ, определенный в библиотеке Flash IDE, в ваш класс TextPanel ...

Надеюсь, это немного поможет; )

0 голосов
/ 09 февраля 2010

Изменение в начале файла AS:

package {
...

до

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