Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/86: Рейтинг темы: голосов - 86, средняя оценка - 4.63
Модератор
 Аватар для TanaTiX
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м. Особенностью среды флеш является то, что пока не будет загружен какой-то объем данных, они не начнут отображаться. Пока прелоадер не загрузит весь проект, инициатива документ-классу не будет передана. Достигается это путем следующего кода (фрагментов):
В прелоадере
ActionScript 3
1
2
3
4
5
private function startup():void 
{
    var mainClass:Class = getDefinitionByName("Main") as Class;
    addChild(new mainClass() as DisplayObject);
}
И в документ-классе
ActionScript 3
1
2
[Frame(factoryClass="Preloader")]
public class Main extends Sprite
В 1м случае мы в качестве строки вводим название документ-класса, во втором в специальном теги аналогичным образом класс прелоадера.

Программирование на AS3 изначально предусматривает написание кода в классах. Поэтому никаких кадров. В идеале в кадре не должно быть ничего, кроме графики и/или другой мультимедийной информации.

Теперь немного по интерфейсу FD.

1) Запуск компиляции. Если запустить сейчас - будет скомпилирован пустой проект.
2) Выбор режима компиляции. Для отладки используйте Debug - так можно увидеть и отследить имеющиеся ошибки. Для финальной версии используйте Release.
3) Зеленым цветом выделяется документ-класс.

Теперь немного об основных настройках проекта.


1) Целевая среда/платформа выполнения
2) Версия ФП, под который будет производиться компиляция
3) Конечный файл, в который будет производится компиляция
4) Размер выходного файла (могут изменяться программно и может зависеть от других настроек в других типах проектов)
5) Частота смены кадров по умолчанию (также может изменяться программно)

Теперь можно заняться собственно проектом. Создадим какой-нибудь несложный проект.
ТЗ нашего проекта:на сцене должна присутствовать кнопка и текстовое поле. В текстовом поле должно отображаться количество кликов по кнопке.
Приступим. Начать необходимо непосредственно с объектов сцены. Для этого создадим класс, который будет содержать текстовое поле и кнопку. Если мыслить категориями MVC, то это будет вьюшка. На MVC сейчас останавливаться на будем - это не является нашей целью в данном уроке.
Создавать этот класс будем во 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.

Листинг для тех, кому лень качать проект

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
 
    /**
     * ...
     * @author TanaTiX
     */
    [Frame(factoryClass="Preloader")]
    public class Main extends Sprite 
    {
 
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            var view:View = new View();
            var model:Model = new Model();
            var controller:Controller = new Controller(view, model);
            controller.init();
            addChild(view);
        }
 
    }
 
}
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package  
{
    import assets.testApplication.ViewTemplate;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    /**
     * ...
     * @author TanaTiX
     */
    public class View extends Sprite 
    {
        private var _template:ViewTemplate;
        
        public function View() 
        {
            
        }
        
        public function init():void 
        {
            _template = new ViewTemplate();
            _template._mcTest.buttonMode = true;
            _template._mcTest.mouseChildren = false;
            addChild(_template);
            _template._mcTest.addEventListener(MouseEvent.CLICK, onClickChange, false, 0, true);
        }
        
        private function onClickChange(e:MouseEvent):void 
        {
            dispatchEvent(new Event(EventTypes.BUTTON_CLICK));
        }
        
        public function updateClicks(value:uint):void {
            _template._txTest.text = value.toString();
        }
    }
 
}
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package  
{
    /**
     * ...
     * @author TanaTiX
     */
    public class Model 
    {
        
        public function Model() 
        {
            
        }
        
        private var _clicks:int;
        
        public function init():void 
        {
            _clicks = 0;
        }
        
        public function get clicks():int 
        {
            return _clicks;
        }
        
        public function set clicks(value:int):void 
        {
            _clicks = value;
        }
        
    }
 
}
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package  
{
    import flash.events.Event;
    /**
     * ...
     * @author TanaTiX
     */
    public class Controller 
    {
        private var _view:View;
        private var _model:Model;
        
        public function Controller(view:View, model:Model) 
        {
            _model = model;
            _view = view;
        }
        
        public function init():void 
        {
            _model.init();
            _view.init();
            _view.addEventListener(EventTypes.BUTTON_CLICK, onChangeClicksCount);
            _view.updateClicks(_model.clicks);
        }
        
        private function onChangeClicksCount(e:Event):void 
        {
            _model.clicks++;
            _view.updateClicks(_model.clicks);
        }
        
    }
 
}
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  
{
    /**
     * ...
     * @author TanaTiX
     */
    public class EventTypes 
    {
        public static const BUTTON_CLICK:String = "buttonClick";
        
        public function EventTypes() 
        {
            
        }
        
    }
 
}


Таким образом имеем разделение логики, визуальной части (в т.ч. на уровне кода) и данных.
Удачи в проектах.
Обещанные исходники:
ExampleProject.rar

Небольшой бонус для тех, кто решил воспользоваться FD-ом.

Список основных хоткеев (можно переназначать; приведу стандартные, которыми чаще всего пользуюсь) и связанных действий:
  • Ctrl + Shift + 1 - практически универсальное сочетание клавиш, т.е. в зависимости от положения курсора предложит сделать то, что требуется:
    курсор на локальной переменнной - предложит вынести переменную в приватное поле класса
    курсор на переменной класса - предложит создать геттеры/сеттеры
    курсор на атрибуте метода - предложит создать переменную класса, которой присваивается текущее значение
    курсор на каком-то наборе символов - предложит создать метод, переменную, константу (в т.ч. в другом классе, если это возможно)
    курсор на пустом месте - предложит сгенерировать метод toString, основываясь на полях класса
    курсор на не импортированном классе - импортирует его
  • F4 - переход к переменной, методу, константе
  • Shift + F4 - возвращение к предыдущему месту работы
  • Ctrl + U - переводит выделенный текст верхний регистр
  • Ctrl + L - переводит выделенный текст в нижний регистр
  • Ctrl + B - предлагает выбрать из списка нужный сниппет (инструмент, с помощью которого буквально одним кликом можно создать, к примеру, цикл)
  • Ctrl + Q - создает/удаляет однострочный комментарий
  • Ctrl + Shift + Q - создает/удаляет многострочный комментарий
  • Ctrl + I - поиск по проекту
  • Ctrl + R - поиск по имени класса (открытые классы в приоритете)
18
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2012, 23:21
Ответы с готовыми решениями:

Вопрос по теории ООП применительно к ас3
если я создаю файнал класс со статик методами (притом что его еще и не все пекеджи видят) это выгодней для ресурсов системы, чем если я...

Урок по рисованию кнопок с двойным градиентом, есть ли такой урок
Помогите найти урок по рисованию вот таких кнопок с двойным градиентов

Структура, доступная из всех файлов проекта ("глобальная" структура)
Есть четыре структуры (body, gun, enemy, st), описанные в main.cpp. К main.cpp подключен хедер save.h, в котором имеется функция void...

36
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
17.05.2016, 20:50  [ТС]
Ranex, это просто для удобства: пока в проекте 5-10 мувиклипов, это не заметно, но когда их количество превышает несколько десятков, то без структуры бывает очень тяжело найти нужный объект. Особенно если есть большое число вложенных мувиклипов - тогда содержимое библиотеки может исчисляться сотнями и даже больше.
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
18.12.2017, 16:40
что значит,?
ActionScript 3
1
2
3
        _template._mcTest.buttonMode = true;
        
            _template._mcTest.mouseChildren = false;
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
18.12.2017, 18:50  [ТС]
Sayanchik777, эти 2 строчки обеспечивают поведение содержимого как единого объекта-кнопки.
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
18.12.2017, 19:45
Цитата Сообщение от TanaTiX Посмотреть сообщение
эти 2 строчки обеспечивают поведение содержимого как единого объекта-кнопки.
это как?
непойму сути, для чего оно назначается? я комментировал всеравно работает все.
что делают buttonMode и mouseChildren ?
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
18.12.2017, 20:31  [ТС]
Sayanchik777, если у вас объект _mcTest состоит только из одного объекта, то это не имеет значения, а если он состоит из нескольких объектов разной степени глубины, то такой объект без этих строк будет работать не корректно.
mouseChildren говорит, что у объекта нет детей, т.е. он обрабатывается со всеми детьми как одно целое.
buttonMode обеспечивает поведение объекта как кнопки, визуально это замена курсора на руку при наведении.
1
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
18.12.2017, 21:36
TanaTiX, Ага, плюс путем экспериментов разобрался - дошло наконец-то )))
свойство mouseChildren отвечает за то что бы все содержимое обьекта воспринимать как одно целое))
А как сделать что бы можно программно меня текст в кнопке?
как в C# Button1.Text -"Тест";
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
18.12.2017, 21:46
как достучатся к этому полю?
Миниатюры
Урок. Структура АС3-проекта  
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
18.12.2017, 23:36  [ТС]
Текстовое поле _name будет доступнпо в качестве свойства класса, в котором оно находится.
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
19.12.2017, 01:03
Цитата Сообщение от TanaTiX Посмотреть сообщение
Текстовое поле _name будет доступнпо в качестве свойства класса, в котором оно находится.
у меня его нет. Везде облазил
или я не там исчу?
Миниатюры
Урок. Структура АС3-проекта  
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
19.12.2017, 01:10
И кстати и поле где цифры тоже немогу сменить-ошибка
Миниатюры
Урок. Структура АС3-проекта  
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
19.12.2017, 06:34  [ТС]
Sayanchik777, перекомпилить swc не забыл?
1
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
19.12.2017, 20:35
Цитата Сообщение от TanaTiX Посмотреть сообщение
перекомпилить swc не забыл?
не помню)), но заново новый проэкт создал и все поучилось.Спасибо большое.
Прикольно вообще так сделано во влеше, анимируешь на таймлайне, а с кода можно запускать анимацию.Магия просто.
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
19.12.2017, 21:10
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        public function Main()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            
            var p:Panel = new Panel();
            p._knopka._text.text = "Test";
            addChild(p);
            
            p.addEventListener(MouseEvent.CLICK, MClick)
            function MClick(event:Event):void
            {
                trace("Проверка нажатия");
            }
        
        }
Все работает. Хочу как у вас вкинуть это все в отдельный класс, а здесь в этом конструкторе в Main просто вызвать экземпляр класса. как это сделать? Ваш код мне немного запутан- сам нерозбепусь
Миниатюры
Урок. Структура АС3-проекта  
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
19.12.2017, 21:19
а когда все помещаю в отдельный класс и вызываю этот экземпляр, то ругается среда
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package 
{
    /**
     * ...
     * @author 111
     */
    public dynamic class Show 
    {
        
        public function Show() 
        {
                        var p:Panel = new Panel();
            p._knopka._text.text = "Test";
            addChild(p);
            
            p.addEventListener(MouseEvent.CLICK, MClick)
            function MClick(event:Event):void
            {
                trace("Проверка нажатия");
            }
        }
        
    }
 
}
как правильно нужно сделать?
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
19.12.2017, 23:38
Разобрался. Нужно было унаследоватся от класса Sprite и подключить пространство имен где нахдится класс Sprite.
Вот только вроде и понимаю но не полностью - Зачем унаследоватся от Класса Sprite?
Что бы класс Show был не типом Show , класс Show являлся типом Sprite? Потому что AddChild - Может добавить только обьекты типа Sprite И MovieClip?
Класс Main

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    /**
     * ...
     * @author 111
     */
    [Frame(factoryClass = "Preloader")]
    public class Main extends Sprite
    {
        
        public function Main()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            var a:Show = new Show();
            
            a.x = 155;
            a.y = 100;
            addChild(a);
        
        }
    
    }
 
}


Класс Show

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package
{
    
    import flash.display.Sprite;
    
    /**
     * ...
     * @author 111
     */
    public class Show extends Sprite
    {
        
        public function Show()
        {
            var p:Panel = new Panel();
            p._knopka._text.text = "Test";
            addChild(p);
            trace(Show);
            //p.addEventListener(MouseEvent.CLICK, MClick)
            //function MClick(event:Event):void
            //{
            //trace("Проверка нажатия");
            //}
        }
    
    }
 
}
Миниатюры
Урок. Структура АС3-проекта  
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
20.12.2017, 19:16  [ТС]
Не совсем понял вопрос. Добавляемый объект должен реализовывать интерфейс IBitmapDrawable, т.е. обычно это быть наследником Sprite, Bitmap и т.д.

P.S. Постарайтесь избавиться от вложенных функций. Во флеше это не приветствуется.
0
 Аватар для Sayanchik777
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 529
20.12.2017, 22:48
Класс Show - (элементы кнопка, текстовое поле)

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    /**
     * ...
     * @author 111
     */
    public class Show extends Sprite
    {
        
        var p:Panel;
        
        public function Show()
        {
            p = new Panel();
            addChild(p);
        
        }
    
    }
 
}

Control

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    
    /**
     * ...
     * @author 111
     */
    public class Control
    {
        var _s:Panel;
        
        public function Control(s:Panel)
        {
        
            _s = s;
 
        }
    
    }
 
}


Класс Main

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    
    /**
     * ...
     * @author 111
     */
    [Frame(factoryClass = "Preloader")]
    public class Main extends Sprite
    {
        
        public function Main()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            
            var s:Show = new Show();
            var c:Control = new Control(s);
            addChild(s);
        }
    
    }
 
}


Почему я немогу в класс Control передатать в аргумет другой экземпляр класса?
ошибка:
(26): col: 32 Error: Implicit coercion of a value of type Show to an unrelated type Panel.
Добавлено через 1 час 24 минуты
Цитата Сообщение от Sayanchik777 Посмотреть сообщение
(26): col: 32 Error: Implicit coercion of a value of type Show to an unrelated type Panel.
Разобрался, тип принимаемого параметра в классе Control неправильно указал)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.12.2017, 22:48

Оценки, полученные учащимися за урок, занесены в массив. Подсчитать количество «5» и «2», полученных учащимися за урок и средний балл
Оценки, полученные учащимися за урок, занесены в массив. Подсчитать количество «5» и «2», полученных учащимися за урок и средний балл.

Структура проекта
Приветствую. Сегодня решил малость привести в нормальный вид проект, вынести некоторые файлы и добавить namespace и т.д. Имена файлов и...

Структура проекта
Приветствую всех! В общем интересует меня вот что: структура проектов с большим количеством файлов. Обычно у меня один класс - один...

Структура проекта
Не так давно, мы с одним парнем решили накатать игру. Вопрос остается открытым, как нужно построить проект? Был вариант разделить классы...

Структура проекта
Начинаю работу над проектом, который будет содержать множество классов и отдельных функций. Если запихивать их всех в один файл, то это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
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
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru