|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|||||||||||||||||||||||||||||||||||||
Урок. Структура АС3-проекта16.05.2012, 23:21. Показов 16532. Ответов 36
Метки нет (Все метки)
Данный урок предназначен для новичков. В нем постараюсь дать ответы на часто возникающие вопросы (прямо или косвенно) относительно структуры проекта. Речь изначально пойдет об AS3-проектах, т.к. AS2 устарел. Однако консерваторы, возможно, почерпнут что-то и для себя.
Среда разработки Начинающие флеш программисты обычно для все и вся используют одну программу - Adobe Flash. Многим это может показаться удобным, привычным и пр. Да, в Adobe стараются развивать свое детище, но практика показывает, что есть более удобные инструменты для написания кода. Примерами таких редакторов могут быть Flash Builder (от той же Adobe), Flash Develop, Eclipse, Astella и др. Их количество со временем может увеличиваться, но общие принципы наверняка сохраняться в каждом из них. А что же Adobe Flash? А он может быть очень полезен как редактор графики и средство для хранения различных ресурсов для вашего проекта, так что не выбрасываем, он пригодится. Не хочу чтобы меня считали предвзятым, но каждый человек имеет свои предпочтения, и я не исключение. Мне удобней всего писать код в FlashDevelop-е. Поэтому основная масса (если не почти все) моих примеров будет основана на работе именно этой программы. Немного про FlashDevelop
Программа является абсолютно бесплатной, ее можно скачать с официального сайта. При установке будет автоматически скачана и установлена Flex SDK. Одним из основных недостатков программы является то, что работает она только в ОС Windows. По сути - это большой блокнот, заточенный под написание кода с достаточно большим количеством плюшек.
По умолчанию буду считать, что она у вас уже установлена. Итак, хорошая практика программирования предполагает разделение кода и ресурсов. И если с кодом все понятно (в проекте должна быть некая папка, в которой хранятся все классы проекта), то с ресурсами не все так однозначно. Варианты хранения ресурсов: 1) Как есть: файлы png, mp3, flv, шрифты, xml и пр. В этом случае есть 2 способа работы с такими данными: a) их загрузка в процессе работы приложения b) внедрение на этапе компиляции 2) swf Также есть 2 способа внедрения, они те же, но 2й менее рационален 3) swc Внедрение в проект происходит на этапе компиляции. Немного о предпочтениях. Часто бывает, что нет необходимости загружать сразу все данные (например, уровень игры). В этом случае есть смысл загружать данные в процессе работы приложения. Это может снизить нагрузку на сервер. Если таких данных много и по своей природе они достаточно разнородны и/или типизированы, то есть смысл загружать их в формате swf. Если данные единичные и особенно если они зависят от запроса на сервер, то это будут единичные файлы, которые будут загружаться в процессе. Если такие данные будут использоваться в вашем приложении в любом случае, то нет смысла их грузить отдельно - лучше вставить в проект на этапе компиляции (варианты 1b) Выбор того или иного варианта в конечном итоге зависит каждой конкретной задачи. К преимуществам swc/swf файлов относится то, что один раз их скомпилировав, дальнейшую разработку приложения можно вести, вообще их не трогая. Создадим проект. Вам предлагается создать несколько вариантов проектов (в т.ч. и на AS2 и пр.) Для нас основными являются "AS3 Project", "AS3 Project with Preloader". Если вы предпочитаете работу с флексовыми компонентами и программируете MXML, выбирайте соответствующие виды проектов. Данный урок рассчитан на новичков, поэтому эти аспекты здесь рассматриваться не будут, как и работа Air-приложений и пр. Указываем имя проекта, выбираем путь на жестком диске, где он будет храниться. Остальное опционально. Я выбрал создание АС3-проекта с прелоадером, назвал его ExampleProject. Структура такого проекта такова: Есть собственно файл проекта, его название соответствует тому, которое ранее вводилось в поле Name при создании. Его можно безболезненно переименовать при необходимости. Также имеется 3 папки: bin (производное от binary, т.е. для двоичных, бинарных данных) - там будет храниться результат компиляции. lib (производное от library) - библиотека, там хранятся наработки ваши или сторонних разработчиков, как правило в формате swc src (производное от source) - там будет "жить" ваш код. Полезно к этому проекту добавить еще несколько папок: assets - там хранятся все исходные данные, необходимые для вашего приложения (изображения, звуковые файлы и пр.) - все это обычно затем вставляется в fla docs - документация по проекту fla - там хранятся ресурсы проекта, на основании которых создаются swc/swf Посмотрим теперь на содержимое папки src. Там мы видим 2 файла: Main.as - документ-класс проекта, т.е. главный класс проекта, куда добавляются другие объекты. Он как фундамент. Не стоит его нагружать кодом. Preloader.as - предзагрузчик (по коду в ключевых местах в виде комментариев расставлены подсказки). Принцип его работы в том, что он в конечном swf будет находится в 1м кадре, а экземпляр класса Main во 2м. Особенностью среды флеш является то, что пока не будет загружен какой-то объем данных, они не начнут отображаться. Пока прелоадер не загрузит весь проект, инициатива документ-классу не будет передана. Достигается это путем следующего кода (фрагментов): В прелоадере
Программирование на AS3 изначально предусматривает написание кода в классах. Поэтому никаких кадров. В идеале в кадре не должно быть ничего, кроме графики и/или другой мультимедийной информации. Теперь немного по интерфейсу FD. 1) Запуск компиляции. Если запустить сейчас - будет скомпилирован пустой проект. 2) Выбор режима компиляции. Для отладки используйте Debug - так можно увидеть и отследить имеющиеся ошибки. Для финальной версии используйте Release. 3) Зеленым цветом выделяется документ-класс. Теперь немного об основных настройках проекта. 1) Целевая среда/платформа выполнения 2) Версия ФП, под который будет производиться компиляция 3) Конечный файл, в который будет производится компиляция 4) Размер выходного файла (могут изменяться программно и может зависеть от других настроек в других типах проектов) 5) Частота смены кадров по умолчанию (также может изменяться программно) Теперь можно заняться собственно проектом. Создадим какой-нибудь несложный проект.
Создавать этот класс будем во Flash CSx (далее IDE), затем скомпилируем его в swc-библиотеку, которую подключим к нашему проекту. Запускаем IDE, создаем AS3-проект. Сразу идем в настройки. File>Publish Settings *В зависимости от версии IDE внешний вид окна настроек может несколько отличаться. Скриншот получен на основе Flash CS5 Сразу отключаем тип HTML и переходим на вкладку настроек Flash. 1) Выбираем версию ФП под которую будем компилировать. В действительности для наших целей этот пункт не важен, т.к. на выходе мы будем получать классы. наследующиеся от стандартных классов, которые изначально (с появления AS3) присутствует во флеше, не зависимо от версии ФП. 2) Должен быть 3й (честно говоря даже в голову не приходило попробовать поставить меньшее значение, но предполагаю, что это вызовет ошибки) 3) Это и есть наша заветная галочка, которая "говорит" IDE компилировать помимо swf (который нам не понадобится) еще и swc. Сохраним наш проект в созданную папку fla, назовем его commonAssets.fla. Если у вас CS5.x, то это будет выглядеть примерно так. Теперь можно приступить к созданию графической составляющей нашего приложения. Для этого создадим кнопку и текстовое поле. С этого момента начинается "магия". Вся соль в том, что изменение графической составляющей не должно влиять на то, что мы пишем в коде, а изменения кода делают с графикой то, что мы захотим. Если вы работаете на пару с художником/аниматором, то создание (знание) четких спецификаций для тех или иных объектов может существенно сократить время разработки приложения. Подробно расписывать работу с IDE не буду, покажу результат и озвучу ключевые моменты. Ознакомиться с проектом можно во вложении. Общий принцип при таком подходе таков: создаем мувиклип/спрайт нужного содержания и ассоциируем его с классом, таким образом создание экземпляров этого класса будет создавать то, что мы рисовали в IDE в вышеуказанном мувиклипе/спрайте. Когда работаете над проектом очень важно следить за порядком, таким образом что бы что-то найти в проекте было легко не только вам, но и абсолютно незнакомому разработчику. Для этого разделяйте контент по папкам, давайте осмысленные названия для слоев, папок, объектов. В нашем объекте 3 элемента: фон, спрайт, который будет выполнять функции кнопки и текстовое поле. С фоном мы ничего делать не планируем. А вот 2 других объекта нам интересны, поэтому, для того, что бы можно было обращаться к ним по имени, зададим для них InstanceName: _mcTest - название спрайта _txTest - название текстового поля Обратите внимание на префиксы _mc и _tx. 1й обозначает, что мы имеем дело с мувиклипом/спрайтом, 2й - с текстовым полем. Это называется венгерской нотацией (немного адаптированной под нужды флеш). Такое именование переменных не является обязательным, но может добавить порядка в ваш код и обеспечить удобный автокомплит, следовательно, уменьшить время разработки. Не забываем "заэмбедить" нужные глифы шрифта. Вот таким образом будет выглядеть визуальная часть моего проекта. Как видно, имя будущего объекта изначально задал таким, как будет именован будущий класс. Для того, что бы создать из него все-таки класс, выбираем его в библиотеке (Ctrl + L), кликая по нему правой кнопкой мыши вызываем контекстное меню, выбираем Properties... Ставим галочку. Если вы ничего не перемудрили, то по умолчанию все встанет на свои места. При этом Class - имя вашего класса (полное), а Base Class - тот класс, от которого вы наследуетесь. Если ваш объект содержит всего один кадр, то там можно прописать "flash.display.Sprite". Теоретически там же можно прописать и свои классы, но этого делать не следует: изменение графики может повлечь изменение функционала базового класса, а графикой должен управлять код, а не наоборот. Остальные пункты нас не интересуют, жмем OK, сохраняем проект, и компилируем его. При этом будет создана swc с интересующим нас классом. При создании класса может появится такое окно Игнорируем его, нажимая OK. Для нашей задачи (если мы не будем что-нибудь менять в графической составляющей приложения) IDE больше не нужен; возвращаемся к FD. Если посмотреть на содержимое папки fla, то можно увидеть следующее: В папке появились скомпилированные swf и swc. Если посмотреть подробней, то внутри можно найти наш класс. Нажимаем по swc-файлу правой кнопкой мыши и в контекстном меню выбираем "Add To Library" Таким образом у нас появилась возможность использовать созданный в IDE класс. Надо отметить, что по умолчанию команда "Add To Library" обеспечивает возможность со всеми классами swc, но если какой-то класс не используется в проекте, то в итоговой swf он также будет отсутствовать. Настало время "на ![]() Не смотря на всю простоту задания, я построил проект основываясь на принципах MVC (ссылка выше, и если по этой части будут вопросы, то это повод для отдельной статьи/темы). Т.к. проект не большой, я не стал разделять классы по разным папкам, поэтому все находится в пределах одного package-а. При бОльшем проекте это не допустимо, т.к. затрудняет навигацию по проекту. К текущему проекту добавлены следующие классы: View - "вьюшка", класс, наследник Sprite-а. Содержит в себе всю графику. Предназначен только для отображения. Имеет ряд публичных методов, доступных контроллеру, с помощью которых последний ей управляет. Model - класс для хранения данных. Никакой логики, только данные. Некоторые в этот класс добавляют возможность слать события в случая изменения к.-л. параметров. Я считаю это не правильным, но это не суть текущей темы. Controller - мозг приложения. Содержит в себе логику и ничего кроме логики. EventTypes - Класс для хранения констант, которые используются при отправке событий внутри приложения. Константы можно также хранить в своем событии, особенно если это событие отличается от стандартного Event. Листинг для тех, кому лень качать проект
Таким образом имеем разделение логики, визуальной части (в т.ч. на уровне кода) и данных. Удачи в проектах. Обещанные исходники: ExampleProject.rar Небольшой бонус для тех, кто решил воспользоваться FD-ом.
Список основных хоткеев (можно переназначать; приведу стандартные, которыми чаще всего пользуюсь) и связанных действий:
18
|
|||||||||||||||||||||||||||||||||||||
| 16.05.2012, 23:21 | |
|
Ответы с готовыми решениями:
36
Вопрос по теории ООП применительно к ас3 Урок по рисованию кнопок с двойным градиентом, есть ли такой урок Структура, доступная из всех файлов проекта ("глобальная" структура) |
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 17.05.2016, 20:50 [ТС] | |
|
Ranex, это просто для удобства: пока в проекте 5-10 мувиклипов, это не заметно, но когда их количество превышает несколько десятков, то без структуры бывает очень тяжело найти нужный объект. Особенно если есть большое число вложенных мувиклипов - тогда содержимое библиотеки может исчисляться сотнями и даже больше.
0
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
||||||
| 18.12.2017, 16:40 | ||||||
|
что значит,?
0
|
||||||
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 18.12.2017, 18:50 [ТС] | |
|
Sayanchik777, эти 2 строчки обеспечивают поведение содержимого как единого объекта-кнопки.
0
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
||
| 18.12.2017, 19:45 | ||
|
непойму сути, для чего оно назначается? я комментировал всеравно работает все. что делают buttonMode и mouseChildren ?
0
|
||
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 18.12.2017, 20:31 [ТС] | |
|
Sayanchik777, если у вас объект _mcTest состоит только из одного объекта, то это не имеет значения, а если он состоит из нескольких объектов разной степени глубины, то такой объект без этих строк будет работать не корректно.
mouseChildren говорит, что у объекта нет детей, т.е. он обрабатывается со всеми детьми как одно целое. buttonMode обеспечивает поведение объекта как кнопки, визуально это замена курсора на руку при наведении.
1
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
|
| 18.12.2017, 21:36 | |
|
TanaTiX, Ага, плюс путем экспериментов разобрался - дошло наконец-то )))
свойство mouseChildren отвечает за то что бы все содержимое обьекта воспринимать как одно целое)) А как сделать что бы можно программно меня текст в кнопке? как в C# Button1.Text -"Тест";
0
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
|
| 18.12.2017, 21:46 | |
|
как достучатся к этому полю?
0
|
|
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 18.12.2017, 23:36 [ТС] | |
|
Текстовое поле _name будет доступнпо в качестве свойства класса, в котором оно находится.
0
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
|
| 19.12.2017, 01:03 | |
|
0
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
|
| 19.12.2017, 01:10 | |
|
И кстати и поле где цифры тоже немогу сменить-ошибка
0
|
|
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 19.12.2017, 06:34 [ТС] | |
|
Sayanchik777, перекомпилить swc не забыл?
1
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
||
| 19.12.2017, 20:35 | ||
|
Прикольно вообще так сделано во влеше, анимируешь на таймлайне, а с кода можно запускать анимацию.Магия просто.
0
|
||
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
||||||
| 19.12.2017, 21:10 | ||||||
0
|
||||||
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
||||||
| 19.12.2017, 21:19 | ||||||
|
а когда все помещаю в отдельный класс и вызываю этот экземпляр, то ругается среда
0
|
||||||
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
|||||||||||
| 19.12.2017, 23:38 | |||||||||||
|
Разобрался. Нужно было унаследоватся от класса Sprite и подключить пространство имен где нахдится класс Sprite.
Вот только вроде и понимаю но не полностью - Зачем унаследоватся от Класса Sprite? Что бы класс Show был не типом Show , класс Show являлся типом Sprite? Потому что AddChild - Может добавить только обьекты типа Sprite И MovieClip? Класс Main
Класс Show
0
|
|||||||||||
|
Модератор
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
|
|
| 20.12.2017, 19:16 [ТС] | |
|
Не совсем понял вопрос. Добавляемый объект должен реализовывать интерфейс IBitmapDrawable, т.е. обычно это быть наследником Sprite, Bitmap и т.д.
P.S. Постарайтесь избавиться от вложенных функций. Во флеше это не приветствуется.
0
|
|
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
|
||||||||||||||||||
| 20.12.2017, 22:48 | ||||||||||||||||||
|
Класс Show - (элементы кнопка, текстовое поле)
Control
Класс Main
Почему я немогу в класс Control передатать в аргумет другой экземпляр класса? ошибка:
0
|
||||||||||||||||||
| 20.12.2017, 22:48 | |
|
Структура проекта Структура проекта Структура проекта Структура проекта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов
• Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp
• Смежный проект:. . .
|
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат
Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
|
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1)
Сложность: Medium
Источник: LeetCode 380
Задача
Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
|
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли.
Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
|
|
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack
Сложность: Medium
Источник: LeetCode 155
Задача:
Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1).
Методы:
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|