![]() |
Привязать иерархию своих классов к символам из библиотеки для вывода на stage.
Добрый день!
Столкнулся с такой проблемой. Итак, делаю игру Rogue-like RPG (разновидлность пошаговой РПГ с полем в виде клеток, где на каждой клетке дискретно размещены элементы, например, пустой пол, кусок стены, игрок, монстр, и.т.д, несколько кусков стены в ряд формирует стену, к примеру), где, в простейшем виде есть базовый класс - Entity: всё, что имеет графичесое представление, будь то стена, пол, или монстр. Мне кажется логичной такая идея(в простейшем виде): от Entity наследуется несколько классов: стена, пол, актёр. От актёра, в свою очередь наследуется класс игрока и монстра. От монстра наследуется целая иерархия их разновидностей до 9-го колена, т.к. у каждого семейства монстров могут быть свои дополнительные методы: типа кинуть камень, или убежать за угол и.т.п. Вопрос вот в чём. Я наследую базовый класс всех отображаемых предметов (так как они анимированы) от movieclip. В библиотеке во Flash CS5 я строю иерархию графических элементов: стены, пол, игрок, монстры, и.т.д с помощю системы каталогов (например, каталог Goblin имеет разновидности гоблинов(symbol): пещерный, лесной, зелёный, злой, и.т.д. :)). Насколько я правильно понимаю, если в свойствах символа не указать "Export for ActionScript", то через as файлы нельзя будет отображать экземпляры символов на stage(поправьте, если я неправ). Допустим я указываю импортировать в AS. по умолчанию создаваемый класс наследуется от Movieclip. ДОпустим, я хочу работать с классом Wall. Свой базовый класс Entity я наследовал от того же Movieclip. От него я наследую, например, класс Wall. Когда я пишу в коде, который был создан после активизации галочки "export for AS", вместо "extends movieclip" "extends Entity" я получаю сообщение об ошибке. Хтя, казалось бы, при наследовании от класса, который наследуется от Movieclip, у него должны быть все те же методы и свойства, что и у movieclip. Как мне поступить, чтобы я мог воспользоваться полиморфизмом в иерархии своих классов, а именно, методом Display() для любого объекта подкласса базового класса Entity, который позволяет отобразить монстра, стену, и.т.п. на stage, не говоря об отображении их различных состояний: убитый монстр, раненый монстр, целый монстр, и.т.п? У базового класса предполагается как минимум свойства координат в игровом пространстве, которые наследуются по всей иерархии. |
Цитата:
Код AS3:
|
Пробовал и так и сяк. делал так:
Создаю новый проект. в нём в корне создаю новый файл test.fla в этом файлк создаю в библиотеке символ CWall (рисую что-то, экспортирую как символ, не экспортирую) В корне проекта создаю файл Main.as : Код AS3:
в ней создаю файл CEntity.as: Код AS3:
Код AS3:
захожу в библиотеку, пытаюсь назначить класс для символа Cwall. При этом Adobe Flash создаёт новый файл, так как не находит описание класса, которое написано уже в Entity\Cwall.as как решить проблему? |
Эм, зачем создавать класс, расширенный от пустышки, если вы используете FlashIDE, а не swc-библиотеку? Просто переименуйте классы так, как названы классы-пустышки у мувиклипов. Указывать пакет в вашем случае нужно обязательно, раз во вложенных папках все лежит.
Добавлено через 5 минут Хотя, я неправильно понял ваш вопрос. Так вот, что делаем: классы-поведения мы делаем иерархически, как вы и делаете. А вот в каждом классе-поведении создавать нужно экземпляр класса-пустышки-мувиклипа и с ним работать. Логика ясна? |
Иными словами воспользоваться композицией? Меня тоже посещала эта мысль. То есть композиция вместо наследования. и тогда в библиотеке может быть произвольная иерархия классов..
|
Конечно. Это же проще - все внимание на коде и в коде.
|
Но я не знаю, как это реализовать. Когда я привязываю новый символ в библиотеке, создаётся новый файл с пустым шаблоном по типу:
Код AS3: Код AS3:
|
Да, столько и будет. Они нужны только для того, чтобы написать в классе-поведении что-то типа:
Код AS3:
|
В общем вопрос, как это всё организовать, чтобы потом не запутаться, т.к. предполагаю наличие нескольких сотен таких вот символов в иерархии.
|
Называйте классы-пустышки понятными именами. RightWall, LeftWall и прочее. Можно использовать суффиксы или постфиксы: Monster_GreenOgr, Monster_RedOgr. Ну и раскидывать в библиотеке по папкам. Это уже чисто для удобства. Дело вкуса. А можно потом экспортировать в swc-библиотеку и использовать в другой игре.
|
Цитата:
|
Это вам виднее, я написал в предыдущем посте про это.
|
Я понял идею. Попробую реализовать. Спасибо за наводку!
|
Предсказываю следующий ваш вопрос!
ответ: getDefinitionByName ЗЫ: почитайте пожалуйста конвенции кодирования AS3. оффтоп: надо добавить факи по AS3 - штук 10 сходу скажу) |
Кстати, вот, только что наткнулся
Оптимизация под FP |
Вложений: 1
Если я правильно Вас понял, то все реализуется именно так, как и задумывалось.
|
dimarik
Огромное спасибо за этот пример, это именно то, что было нужно! Котяра Проницательность у Вас, я скажу :) Именно так! Насчёт Фак-а, мне, как впервые севшего за AS3, но имеющего опыт работы на других языках и платформах (думаю, таких, как я, немало) наибольшее число вопросов возникает по взаимодействию (или попросту ввод-вывод) AS3 и визуальных объяектах. В большом количестве существующих книг этим вопросам уделяется мало внимания. Кроме того, важгнными остаются вопросы о правильном проектировании средних и больших проектов, как правильно организовывать файлы в проекте, как правильно проектировать классы (не вообще, а в контексте привязки к Flash). Насчёт конвенции я не очень понял, Вы имеете ввиду отсутствие комментариев в кусочках кода, что я приводил; или отступы-стиль кодирования? |
http://opensource.adobe.com/wiki/dis...ng+Conventions
а у вас C#. Код AS3:
Код AS3:
И поставьте себе FlashDevelop - там хорошо табуляции ставятся) и прошу на Т. |
Ну, насчёт отступов и прочего, тут такое дело. В принципе, у каждого программиста есть свой стиль, удобный для него. Проблема возникает при чтении этого кода другим программистом. Проблема эта решается очень просто, есть специальные утилиты (да они достаточно простые, чтобы их самому написать), которые меняют отступы, строки, перенос, и.т.д. т.е. если идёт работа в команде, то при передаче коллегам прогоняется код через утилиту, и наоборот, и проблема решена. Ну, если уж работа постоянная и корпорация серьёзная, то можно и приучиться к корпоративному стилю. Если есть веская причина отказаться от своего стиля , то это, безусловно стоит делать.
свой стиль я вырабатывал методом проб и ошибок лет 15, и обоснования для его использования такие. 1) фигурные скобки (операторные скобки) размещены на одном уровне, чтобы блок кода был чётко различим, что хромает, скажем так, в стиле Кернигана-Ричи, когда открывающаяся скобка следует в конце строки. К плюсам КР стиля относят то, что на фигурную скобку отводится на одну строку меньше. Однако, если делать т.н. полуотступы, т.е. фигурные скобки находятся на нечётных позициях, а код - на чётных (если считать с нуля), то можно код писать прямо за фигурной скобкой, т.е. выполнятся одновременна два преимущества: визуализация блока операторов и экономия строки, что видно в приведённом мной коде. В стиле К-Р можно бы и привыкнуть к тому, что отступ автоматически одначает где-то-там фигурную скобку, но в случае, например, того же цикла приходится обращать внимание - есть ли там скобка, или её нет? Цикл "for" работает на ощдной строке, или же на блоке операторов? Внимание рассеивается, так как фигурная скобка находится в произвольном месте по горизонтали, в конце строки. Ухудшается читаемость кода. ну и кроме того однотипные операторы я предпочитаю писать в одной строке. Иными словами я стремлюсь к тому, чтобы максимум информации помещался на странице при чёткой иерархичности и структурированности кода. Насчёт названий переменных, к сожалению, Flash Builder по intellisence явно уступает комбинации Visual Studio + Resharper, и я задумываюсь о венгерской нотации, хоть она и имеет свои минусы. А вот Xx и правда, от балды :) |
Да я про отступы и форматирование ничего не говорил. Я говорил о нэйминге. Почитайте по ссылке, которую я вам дал и примите к сведению - что с большой, что с маленькой. и.т.п. Венгерская нотация неприменима.
ЗЫ: а скобки и табуляция применяют 2 видов: 1) Код AS3:
Код AS3:
|
Совершенно согласен с Котярой
|
Насчёт названий переменных и констант согласен с указанным документом. Насчёт отступов, второй вариант нагляднее, хотя можно привыкнуть и к первому варианту.
В конвенции говорится об отступах в 4 пробела, при ограничении в 80 символов выходит, что при 6-ти кратном уровне вложения около трети пространства оказывается незадействованным. |
Цитата:
т.к. сворачиваются {} то при свёртывании получаем строку вида: Код AS3:
никогда не было проблем с 6 и более кратном вложении - чем больше пустого места - тем легче читается код. Код AS3:
Код AS3:
например: http://code.google.com/p/as3isolib/ А по поводу конвенции с ней не надо соглашаться - её надо стараться соблюдать) Просто реально бесит, когда приходят со своим уставом в наш монастырь) Это относится к box2D, pushButtonEngine и Паше Колюжному) |
Вложений: 1
насчёт табуляции, в большинстве статей касательно оформления кода говорится, что табуляция нежелательна и её следует задавать пробелом. большие отступы приводят к плохзой читаемости кода. Недавно разбирался в коде С++ для Roguelike движка. уже шесть вложений отодвигают вызов метода setBack довольно далеко. Строка, которая не влезла имеет длину 116 символов. Удобно ли это? вот скриншот:
хотя я уже склоняюсь к тому, чтобы переучиться-привыкнуть к более стандартному стилю оформления кода, потому что слишком часто слышу упрёки в свой адрес по поводу форматирования, и эта борьба напоминает войну с ветряными мельницами. |
На самом деле тема уже давно ушла в оффтоп)
Но пока не прикрыли - продолжим на тему конвенций) Нормальный скрин, очень хорошая табуляция - код очень хорошо читается. Просто у вас разрешение на мониторе очень маленькое, да и для 116 символов - всё равно: 24 плюс - 24 минус (это я про табуляции 6 уровня), всё равно не влезет :) Кроме того - если надо узнать что там конкретно делает 2 setBack - ничто не мешает прокрутить скроллом, хотя (еще раз повторюсь) на нормальном разрешении в 99% случаев даже длинные строки влезают, хоть на 8 уровне) Кроме того, это лишний повод не писать длинных строк) вместо: Код AS3:
Код AS3:
PS: А что за статьи про вредные табуляции? Не верю я им. :) PPS: Цитата:
|
просто вложение ограничение имеет на 800 на 600, я его кропнул. В принципе, по-новому гляжу на Керниган-Ричи стиль, в принципе, привыкнуть можно. Но вообще у меня привычка к 80 столбиков и 25 строчек DOS-стилю, и поэтому такое скупое отношение к отступам и пустым строчкам.
Добавлено через 58 минут Надо бы отдельную тему завести... вред табуляций: http://en.wikipedia.org/wiki/Program..._for_languages в конце есть список соглашений об оформлении кода в разных языках. В Сшарп табы низзя. Про соглашение по AS3 оно длинное, надо бы распечатать да почитать :) экономия места - значит пустоты в окне редактирования кода. Встречались мне коды с 8-ми кратным вложэением циклы-ифы, и.т.д., и 8(!!) пробелов отступов. Читаемость падает резко. В скриншоте я привёл удобный для меня размер шрифта в абсолютной величине. Человеческий глаз не может охватить очень много за один раз, мозг не может очень много помнить, поэтому при размышлении об алгоритме над экраном надо стараться сосредоточить код, чтобы глаз мог одновременно охватить цельный блок кода. Если глаз охватывает код, то мозг может из памяти подгружать больше кода, который где-то там. если же код рассредоточен 8-ми пробельными отступами и пустыми строками, то меньше информации можно одновременно удерживать в голове. Мелкий же шрифт приводит к утомляемости зрения. поэтому это компромисс между комфортом для глаз и количеством информации в телесном угле зрения. Добавлено через 1 час 3 минуты В конвенции по AS3 про 80 символов говорится в явном виде: Wrap code to 80-character lines. This has the following advantages: * Developers with smaller screens don't have to scroll horizontally to read long lines. * A comparison utility can display two versions of a file side-by-side. * The font size can be increased for projection before a group without requiring scrolling. * The source code can be printed without clipping or wrapping. |
Цитата:
Только я считаю это не минусом к использованию табуляции, а плюсом к разбиению длинных строк на много маленьких. |
| Часовой пояс GMT +4, время: 10:49. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.