Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Привязать иерархию своих классов к символам из библиотеки для вывода на stage. (http://www.flasher.ru/forum/showthread.php?t=140090)

Alexk553 20.05.2010 03:21

Привязать иерархию своих классов к символам из библиотеки для вывода на 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, не говоря об отображении их различных состояний: убитый монстр, раненый монстр, целый монстр, и.т.п? У базового класса предполагается как минимум свойства координат в игровом пространстве, которые наследуются по всей иерархии.

bars80080 20.05.2010 12:01

Цитата:

вместо "extends movieclip" "extends Entity"
а
Код AS3:

import Entity;

в заголовке пакета с Wall ставили?

Alexk553 20.05.2010 20:11

Пробовал и так и сяк. делал так:
Создаю новый проект.
в нём в корне создаю новый файл test.fla
в этом файлк создаю в библиотеке символ CWall (рисую что-то, экспортирую как символ, не экспортирую)

В корне проекта создаю файл Main.as :
Код AS3:

package
{import flash.display.MovieClip;
 import Entity.Cwall;
 public class Main extends MovieClip
  {
  public function Main()
    {
    trace("OK!");
    var JWall:CWall = new CWall();
    //    JWall.Dr();
    // addChild(JWall);
    }
  }
}

в проекте создаю папку Entity
в ней создаю файл CEntity.as:

Код AS3:

package Entity 
{public class CEntity
  {protected var Xx,Yy : int;
  public function CEntity()
    {Xx=100;Yy=100;
    }
  }
}

в этой же папке создаю файл CWall
Код AS3:

package Entity 
{import Entity;
 public class Cwall extends CEntity
  {public function Cwall()
    {Xx=200;Yy=200;
    this.x=Xx;this.y=Yy;
    }
    public function Dr()
    {this.x=Xx;this.y=Yy;
      addChild(this)
    }
  }
}

при компиляции E:\Flash\Test\Main.as, Line 12 1046: Type was not found or was not a compile-time constant: CWall.

захожу в библиотеку, пытаюсь назначить класс для символа Cwall. При этом Adobe Flash создаёт новый файл, так как не находит описание класса, которое написано уже в Entity\Cwall.as

как решить проблему?

КорДум 20.05.2010 20:21

Эм, зачем создавать класс, расширенный от пустышки, если вы используете FlashIDE, а не swc-библиотеку? Просто переименуйте классы так, как названы классы-пустышки у мувиклипов. Указывать пакет в вашем случае нужно обязательно, раз во вложенных папках все лежит.

Добавлено через 5 минут
Хотя, я неправильно понял ваш вопрос. Так вот, что делаем: классы-поведения мы делаем иерархически, как вы и делаете. А вот в каждом классе-поведении создавать нужно экземпляр класса-пустышки-мувиклипа и с ним работать. Логика ясна?

Alexk553 20.05.2010 20:31

Иными словами воспользоваться композицией? Меня тоже посещала эта мысль. То есть композиция вместо наследования. и тогда в библиотеке может быть произвольная иерархия классов..

КорДум 20.05.2010 20:33

Конечно. Это же проще - все внимание на коде и в коде.

Alexk553 20.05.2010 20:36

Но я не знаю, как это реализовать. Когда я привязываю новый символ в библиотеке, создаётся новый файл с пустым шаблоном по типу:
Код AS3:
Код AS3:

package CEntity {
 
        import flash.display.MovieClip;
 
 
        public class CWall extends MovieClip {
 
 
                public function CWall() {
                        // constructor code
                }
        }
 
}

А что делать дальше? Выходит, сколько символов в библиотеке, столько будетт этих шаблонных файлов?

КорДум 20.05.2010 20:38

Да, столько и будет. Они нужны только для того, чтобы написать в классе-поведении что-то типа:
Код AS3:

private var clip:CWall = new CWall();


Alexk553 20.05.2010 20:39

В общем вопрос, как это всё организовать, чтобы потом не запутаться, т.к. предполагаю наличие нескольких сотен таких вот символов в иерархии.

КорДум 20.05.2010 20:43

Называйте классы-пустышки понятными именами. RightWall, LeftWall и прочее. Можно использовать суффиксы или постфиксы: Monster_GreenOgr, Monster_RedOgr. Ну и раскидывать в библиотеке по папкам. Это уже чисто для удобства. Дело вкуса. А можно потом экспортировать в swc-библиотеку и использовать в другой игре.

Alexk553 20.05.2010 20:44

Цитата:

Сообщение от КорДум (Сообщение 909701)
Да, столько и будет. Они нужны только для того, чтобы написать в классе-поведении что-то типа:
Код AS3:

private var clip:CWall = new CWall();


В этом случае, чтобы не запутаться, наверное имеет смысл называть эти символы типа Entity_Actor_Monster_Irish_Leprechaun_AncientLeprechaun?

КорДум 20.05.2010 20:45

Это вам виднее, я написал в предыдущем посте про это.

Alexk553 20.05.2010 20:45

Я понял идею. Попробую реализовать. Спасибо за наводку!

Котяра 20.05.2010 22:15

Предсказываю следующий ваш вопрос!
ответ: getDefinitionByName
ЗЫ: почитайте пожалуйста конвенции кодирования AS3.

оффтоп: надо добавить факи по AS3 - штук 10 сходу скажу)

gloomyBrain 20.05.2010 22:44

Кстати, вот, только что наткнулся
Оптимизация под FP

dimarik 21.05.2010 15:16

Вложений: 1
Если я правильно Вас понял, то все реализуется именно так, как и задумывалось.

Alexk553 21.05.2010 18:37

dimarik
Огромное спасибо за этот пример, это именно то, что было нужно!

Котяра
Проницательность у Вас, я скажу :) Именно так!
Насчёт Фак-а, мне, как впервые севшего за AS3, но имеющего опыт работы на других языках и платформах (думаю, таких, как я, немало) наибольшее число вопросов возникает по взаимодействию (или попросту ввод-вывод) AS3 и визуальных объяектах. В большом количестве существующих книг этим вопросам уделяется мало внимания. Кроме того, важгнными остаются вопросы о правильном проектировании средних и больших проектов, как правильно организовывать файлы в проекте, как правильно проектировать классы (не вообще, а в контексте привязки к Flash).

Насчёт конвенции я не очень понял, Вы имеете ввиду отсутствие комментариев в кусочках кода, что я приводил; или отступы-стиль кодирования?

Котяра 21.05.2010 22:52

http://opensource.adobe.com/wiki/dis...ng+Conventions
а у вас C#.
Код AS3:

package Entity 
{public class CEntity
  {protected var Xx,Yy : int;
  public function CEntity()
    {Xx=100;Yy=100;
    }
  }
}

лучше как то так:
Код AS3:

package entities {
 public class Entity  {
  protected var x: int;
  protected var y : int;
  public function Entity() {
    x=100;
    y=100;
    }
  }
}

.. а то очень глаз режет.
И поставьте себе FlashDevelop - там хорошо табуляции ставятся)
и прошу на Т.

Alexk553 22.05.2010 02:36

Ну, насчёт отступов и прочего, тут такое дело. В принципе, у каждого программиста есть свой стиль, удобный для него. Проблема возникает при чтении этого кода другим программистом. Проблема эта решается очень просто, есть специальные утилиты (да они достаточно простые, чтобы их самому написать), которые меняют отступы, строки, перенос, и.т.д. т.е. если идёт работа в команде, то при передаче коллегам прогоняется код через утилиту, и наоборот, и проблема решена. Ну, если уж работа постоянная и корпорация серьёзная, то можно и приучиться к корпоративному стилю. Если есть веская причина отказаться от своего стиля , то это, безусловно стоит делать.
свой стиль я вырабатывал методом проб и ошибок лет 15, и обоснования для его использования такие.
1) фигурные скобки (операторные скобки) размещены на одном уровне, чтобы блок кода был чётко различим, что хромает, скажем так, в стиле Кернигана-Ричи, когда открывающаяся скобка следует в конце строки. К плюсам КР стиля относят то, что на фигурную скобку отводится на одну строку меньше. Однако, если делать т.н. полуотступы, т.е. фигурные скобки находятся на нечётных позициях, а код - на чётных (если считать с нуля), то можно код писать прямо за фигурной скобкой, т.е. выполнятся одновременна два преимущества: визуализация блока операторов и экономия строки, что видно в приведённом мной коде. В стиле К-Р можно бы и привыкнуть к тому, что отступ автоматически одначает где-то-там фигурную скобку, но в случае, например, того же цикла приходится обращать внимание - есть ли там скобка, или её нет? Цикл "for" работает на ощдной строке, или же на блоке операторов? Внимание рассеивается, так как фигурная скобка находится в произвольном месте по горизонтали, в конце строки. Ухудшается читаемость кода.
ну и кроме того однотипные операторы я предпочитаю писать в одной строке. Иными словами я стремлюсь к тому, чтобы максимум информации помещался на странице при чёткой иерархичности и структурированности кода.



Насчёт названий переменных, к сожалению, Flash Builder по intellisence явно уступает комбинации Visual Studio + Resharper, и я задумываюсь о венгерской нотации, хоть она и имеет свои минусы. А вот Xx и правда, от балды :)

Котяра 22.05.2010 09:54

Да я про отступы и форматирование ничего не говорил. Я говорил о нэйминге. Почитайте по ссылке, которую я вам дал и примите к сведению - что с большой, что с маленькой. и.т.п. Венгерская нотация неприменима.

ЗЫ: а скобки и табуляция применяют 2 видов:
1)
Код AS3:

package entities {
 public class Entity  {
 
  protected var x: int;
  protected var y : int;
 
  public function Entity() {
    x=100;
    y=100;
  }
  }
}

2)
Код AS3:

package entities 
{
 public class Entity 
 {
  protected var x: int;
  protected var y : int;
 
  public function Entity() 
  {
    x=100;
    y=100;
  }
  }
}

Но никак не ваш - подразумевается, что с кодом работаете не только Вы, а ваша табуляция - ужасна для неподготовленного человека)

OnEg1n 22.05.2010 12:48

Совершенно согласен с Котярой

Alexk553 22.05.2010 16:23

Насчёт названий переменных и констант согласен с указанным документом. Насчёт отступов, второй вариант нагляднее, хотя можно привыкнуть и к первому варианту.
В конвенции говорится об отступах в 4 пробела, при ограничении в 80 символов выходит, что при 6-ти кратном уровне вложения около трети пространства оказывается незадействованным.

Котяра 22.05.2010 20:11

Цитата:

Сообщение от Alexk553 (Сообщение 910145)
Насчёт названий переменных и констант согласен с указанным документом. Насчёт отступов, второй вариант нагляднее, хотя можно привыкнуть и к первому варианту.
В конвенции говорится об отступах в 4 пробела, при ограничении в 80 символов выходит, что при 6-ти кратном уровне вложения около трети пространства оказывается незадействованным.

1 вариант удобнее сворачивать (в ФД например..)
т.к. сворачиваются {}
то при свёртывании получаем строку вида:
Код AS3:

 [+] public function open():void {..

отступы в ФД задаются табом, а не пробелами.
никогда не было проблем с 6 и более кратном вложении - чем больше пустого места - тем легче читается код.

Код AS3:

x = a + b;
y = b - a;

лучше чем:
Код AS3:

x=a+b; y=b-a;

Возьмите посмотрите как оформлена какой нибудь реальный опенсорсный движок,
например: http://code.google.com/p/as3isolib/

А по поводу конвенции с ней не надо соглашаться - её надо стараться соблюдать)
Просто реально бесит, когда приходят со своим уставом в наш монастырь)
Это относится к box2D, pushButtonEngine и Паше Колюжному)

Alexk553 22.05.2010 22:49

Вложений: 1
насчёт табуляции, в большинстве статей касательно оформления кода говорится, что табуляция нежелательна и её следует задавать пробелом. большие отступы приводят к плохзой читаемости кода. Недавно разбирался в коде С++ для Roguelike движка. уже шесть вложений отодвигают вызов метода setBack довольно далеко. Строка, которая не влезла имеет длину 116 символов. Удобно ли это? вот скриншот:

хотя я уже склоняюсь к тому, чтобы переучиться-привыкнуть к более стандартному стилю оформления кода, потому что слишком часто слышу упрёки в свой адрес по поводу форматирования, и эта борьба напоминает войну с ветряными мельницами.

Котяра 22.05.2010 23:33

На самом деле тема уже давно ушла в оффтоп)
Но пока не прикрыли - продолжим на тему конвенций)

Нормальный скрин, очень хорошая табуляция - код очень хорошо читается.
Просто у вас разрешение на мониторе очень маленькое, да и для 116 символов - всё равно: 24 плюс - 24 минус (это я про табуляции 6 уровня), всё равно не влезет :)
Кроме того - если надо узнать что там конкретно делает 2 setBack - ничто не мешает прокрутить скроллом, хотя (еще раз повторюсь) на нормальном разрешении в 99% случаев даже длинные строки влезают, хоть на 8 уровне)
Кроме того, это лишний повод не писать длинных строк)
вместо:
Код AS3:

sampleConsole.setBack(x,y,TCODColor::lerp(lightground....))

надо
Код AS3:

int color = TCODColor::lerp(lightground....)
sampleConsole.setBack(x,y,color)

намного лучше читаются 10 маленьких строк чем одна большая, да и рефакторить намного лучше. ( а за 116 символов в строке - как в примере - надо бить молотком по пальцам)

PS: А что за статьи про вредные табуляции? Не верю я им. :)
PPS:
Цитата:

около трети пространства оказывается незадействованным.
Это тут причём? Экономим электричество? Или что за место имеется в виду? И что такое 80 символов/строка? Печатаем на бумаге что-ли? Или на мобиле код пишем?

Alexk553 22.05.2010 23:43

просто вложение ограничение имеет на 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.

Котяра 24.05.2010 11:02

Цитата:

Сообщение от Alexk553 (Сообщение 910243)
В конвенции по AS3 про 80 символов говорится в явном виде...

Принимается.
Только я считаю это не минусом к использованию табуляции, а плюсом к разбиению длинных строк на много маленьких.


Часовой пояс GMT +4, время: 10:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.