![]() |
Как правильно сделать "переключатель" для игровых экранов?
1 экран - меню
2 экран - выбор персонажа 3 экран - выбор снаряжения 4 экран - игра Скажите как правильно работать с экранами, может есть какой то урок на эту тему. Мне приходит в голову каждый экран создать классом на базе sprite, и из меню по onClick делать addChild(например 2 экран). Далее я выбрал персонажа и опять же по onClick что я делаю? Как правильно удалить себя со сцены и добавить следующий? |
синглтон Layers с методами showChar, showGame, showMenu в данном случае пожалуй самый удобный вариант
|
либо экраны имплементят интерфейс IShowable с методами show/hide + класс StageMediator,хранящий ссылку на stage/root и добавляющий экраны когда надо.
|
Цитата:
Если в main.as написать функцию которая будет делать addChild и removeChild по переданому ей параметру, а параметром будет выступать класс экрана. То как в AS передавать этот класс функции? |
в as есть класс Class,но лучше его не использовать т.к. с его помощью можно передать в функцию все что угодно.Правильнее будет завести класс или интерфейс Showable от которого и наследовать все экраны и передавать не класс, а экземпляр класса.
|
Цитата:
Цитата:
|
передача класса в метод:
Код AS3:
Код AS3:
|
Цитата:
Код AS3:
Цитата:
|
у тебя классическая путаница понятий класс/экземпляр класса.Советую таки почитать что-нибудь по ооп чтоб не плавать в терминологии(хоть мука того же самого).Например что делает эта строка:
Код AS3:
2)Создается экземпляр\объект класса/типа Menu(new Menu()), ссылка на свежесозданный объект кладется в переменную MenuScreen. Короче класс - это просто описание типа данных(какую информацию он содержит и что может с ней делать).Экземпляр класса - то, что получается в результате работы оператора new.Т.е. классов обычно немного, а объекты могут штамповаться сотнями. Дальше Цитата:
Код AS3:
Цитата:
|
Цитата:
Код AS1/AS2:
Спасибо за развернутый ответ! |
Цитата:
Обычно в название суперклассов используют слово Base.Например BaseScreen. Сигнатуру ShowScreen в этом случае естественно надо будет сменить на Код AS3:
|
Цитата:
А какой класс отвечает за функцию show/hide? |
Цитата:
В плане что он не содержит реализацию своих методов - нет, это обычный класс. Вообще в AS нет абстрактных классов, но есть интерфейсы(полностью абстрактные классы). Цитата:
Цитата:
|
Вызов HideScreen выдает ошибку "[Fault] exception, information=ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта."
Вы говорили про хранение ссылки на stage... Класс документа - Код AS1/AS2:
Код AS1/AS2:
Код AS1/AS2:
|
ты не понял идею.Методы show/hide нужны чтоб выполнить некое действие при добавлении экрана в дисплей лист(воспроизвести анимацию появления например). добавлять/удалять их должен документ класс, который и хранит ссылку на стейдж. Сами экраны никуда себя добавлять не должны, поэтому им ссылку на стейдж иметь необязательно.Если никаких действий при появлении делать не требуется - наследуй все экраны от Sprite и не парься.
Добавлено через 3 минуты да и документ класс не стоит наследовать от чего-то отличного от Sprite.Еще раз:класс Base - общий родитель для всех экранов, содержащий функционал общий для всех экранов.Документ класс, конечно, к экранам никак не относится.Если у экранов нет общего функционала - то и не надо городить лишние классы.Другой вопрос, что в будущем такой функционал скорее всего появится и придется либо вручную добавлять его во все классы-экраны,либо добавить его один раз в супер класс. Таки настойчиво прошу почитать хоть что-нибудь по теме. |
Цитата:
Все экраны это классы, при необходимости отобразить след. экран как и откуда (из экземпляра текущего экрана?) удалять/добавлять со сцены? |
после "нажали играть" экран посылает событие что пора сменить экран.Кто-то, у кого есть доступ к стейджу ловит это событие (в твоем случае это документ класс, но это может быть кто угодно) и решает что делать дальше какой экран скрыть, а какой показать.
|
Цитата:
Код AS1/AS2:
|
На что ссылается this в этом коде?
|
Этот код у меня в обработчике onClick одной из кнопок меню, если я правильно понимаю, он ссылается на экземпляр класса в котором эта кнопка находится.
|
в таком случае в этом коде не много смысла.Если у экрана есть ссылка на стейдж -this.stage, значит он уже туда добавлен и добавлять его снова имеет смысл только чтоб быстро переместить его поверх всего, что уже есть на стейдже.Все это сильно напоминает г****код.
Еще раз - экран не должен сам добавлять себя никуда.Может статься, что добавлять его надо будет не на стейдж, а в какой-нибудь контейнер.Экран должен оповестить ответственного что его надо показать .Аналогично в нужный момент он должен оповестить что пора его скрыть. |
хм, я решил подобный вопрос иначе, мож поможет. У меня все классы(кроме одного) имеют ссылку на stage, дабы не морочиться кто кого должен добавлять. А дабы не писать спагетти, то у каждого класса есть список моих событий (своих наделал), на что и как реагировать. Нажал человек кнопку "play" кнопка отправило событие "NEW_PLAY". Все классы, которые должны как либо среагировать, подписаны на это событие и выполняют свой код. В итоге все классы общаются друг с другом только через события, зависимости минимальны, фактически можно отключать целые ветки кода и все будет работать, так же удобно включать новые классы, в одном месте общем написал this.addChild(new MyClass), что добавить его на сцену и всё, остальная логика реализуется внутри класса(ов)
|
ага, вот только если выяснится что надо, например, перенести все содержимое из стейджа в рут или еще куда придется править 100500 классов.
|
Цитата:
По поводу ссылки - в main мне надо сделать так да? Код AS3:
Код AS3:
|
если не планируешь код сильно расширять - пиши как удобнее.
Цитата:
this.stage. |
Цитата:
|
Цитата:
на форуме часто рекомендуют не цеплять ничего на стейдж, а все пихать в рут, т.к. стейдж не является DisplayObjectContainer и поэтому некоторые плюхи для него недоступны.Рут по большому счету тоже не является, но он допускает приведение к DisplayObjectContainer. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Код AS3:
Т.е. рут по меньшей мере не обычный DOC. Добавлено через 26 минут Код AS3:
|
Цитата:
|
Цитата:
Цитата:
|
ObOs, если ты прочтешь внимательнее,то увидишь такие слова:
Цитата:
Цитата:
Добавлено через 2 минуты Цитата:
|
DisplayObject
|
как можно DisplayObject привести к DisplayObjectContainer?
|
Что вы имеете ввиду?
Код AS3:
|
т.е. фактически рут - это DOC,просто внутри приложения его зачем-то приводят к DO?Странная логика.
|
Цитата:
Тогда мне тоже не понятно почему Код AS3:
Код AS3:
|
это приведение вверх по иерархии.Сам рут - DisplayObjectContainer,но ссылка на него описана как var root:DisplayObject.Поэтому сам он DO, но допускает приведение к DOC.Зачем так сделано - загадка.
Добавлено через 2 минуты ПС:Кто в курсе как эти смайлы отключить? |
Цитата:
Код AS3:
|
Цитата:
Геттер .root возвращает (имеет) тип DisplayObject. Поэтому компилятор не даст вам вызвать у свойства .root методы и свойства ДОК. Но, вроде, все знают, что рут это экземпляр Документ-класса, а им может быть только наследник DisplayObjectContainer. Зачем такая фишка с .root, я тоже не знаю. С этими ДО и ДОК итак много всякого неочевидного. Взять тот же ТекстФилд, который явно ДОК, ибо в него можно загружать картинки и тп, но он никогда не сознается. И даже простенький Shape внутри содержит слои, что легко заметить, нарисовав несколько завершенных фигур с заливкой друг над другом, и поменяв затем альфу всему шейпу — каждый слой станет полупрозрачным "самостоятельно", то есть под верхней фигурой будет просвечивать нижняя. Зато Stage гордо именует себя контейнером, хотя не поддерживает половину его свойств. |
| Часовой пояс GMT +4, время: 12:19. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.