
Редактор на основе Flash IDE : Компоненты.

Достаточно часто мы слышим что тот или иной разработчик использует Flash IDE в качестве редактора, есть хорошие посты по этому вопросу у камрада AntKarlov. Но мало кто пользуется компонентами во флеше, а зря, ведь так удобно!
Давайте попробуем создать компонент.
— Нам потребуется создать MovieClip
— В библиотеке кликаем правой кнопкой по нашему клипу и жмем Component Definition

В списке Parameters добавляем нужные нам параметры
Name — имя видимое в компоненте
Variable — переменная будет объявлена в классе TestComponent
Value — значение по умолчанию
Type — тип, типов предостаточно чтоб описать любые свойства.
Class — TestComponent.as класс в котором мы и реализуем работу компонента.
Остальное в данный момент нас не интересует, оставляем так как есть. В библиотеке иконка нашего клипа сменилась, теперь это компонент.
Когда мы перетащим компонент на сцену то увидим на панели Properties такую картину

Ура теперь мы можем редактировать эти свойства прямо на сцене! Но это еще не все, чтоб мы могли с ним работать программно нам нужно написать наш TestComponent.as, выглядеть он будет так
package
{
public class TestComponent
{
[Inspectable(type="String", defaultValue="")]
public var name:String = "";
[Inspectable(type="Number", defaultValue="0")]
public var param1:Number = 0;
[Inspectable(type = "Boolean", defaultValue = "false")]
public var param2:Boolean = false;
public function TestComponent():void{}
}
}
Вот теперь мы сможем настроить этот компонент в IDE и считать данные при выполнении программы.В итоге нам нужно написать парсер мувиклипа уровня как и упоминаемой выше статье, но когда мы натыкаемся на компонент мы получаем значительно больше нужной нам информации нежели при работе с простым мувиклипом.
А теперь попробуем создать простенький редактор для физической игры (для физики мы используем Napе).
1) Создадим компоненту для настройки мира

Для базовой настройки свойств физического мира этих параметров вполне достаточно, гравитация и границы.
2)Физическое тело, список параметров тут немного поинтересней

Статическое ли тело / материал / тип объекта /начальные скорости
Класс выглядит так
public class PhysShim extends Sprite
{
// physic props
protected var _material:String = "none";
protected var _shapeType:String = "none";
protected var _isStatic:Boolean = false;
protected var _vel_x:Number = 0;
protected var _vel_y:Number = 0;
protected var _vel_w:Number = 0;
protected var _type:String = "none";
public function PhysShim()
{
super();
trace("PhysShim:PhysShim->");
}
public function get shapeType():String { return _shapeType; }
public function set shapeType(value:String):void
{
_shapeType = value;
}
public function get material():String { return _material; }
[Inspectable(type="List", enumeration="none,wood,ice,stone,ground,metall,snow,bounce", defaultValue="none")]
public function set material(value:String):void
{
_material = value;
}
public function get isStatic():Boolean { return _isStatic; }
[Inspectable(type="Boolean", defaultValue="false")]
public function set isStatic(value:Boolean):void
{
_isStatic = value;
}
public function get vel_x():Number { return _vel_x; }
[Inspectable(type="Number", defaultValue="0")]
public function set vel_x(value:Number):void
{
_vel_x = value;
trace("PhysShim:vel_x->",vel_x);
}
public function get vel_y():Number { return _vel_y; }
[Inspectable(type="Number", defaultValue="0")]
public function set vel_y(value:Number):void
{
_vel_y = value;
}
public function get vel_w():Number { return _vel_w; }
[Inspectable(type="Number", defaultValue="0")]
public function set vel_w(value:Number):void
{
_vel_w = value;
}
public function get type():String { return _type; }
[Inspectable(type="List", enumeration="none,bullet,target", defaultValue="none")]
public function set type(value:String):void
{
_type = value;
}
}
По коду видно как использовать и задавать списки. Один параметр не возможно задать в компоненте это _shapeType — тип шейпа (прямоугольник / круг / овал / треугольник / любая форма), это сделано для того что дальше мы создаем для каждого типа шейпа свой компонент и задаем значение _shapeType явно. Для примера Круг:
public class CircleShim extends PhysShim
{
public function CircleShim()
{
super();
_shapeType = ShapeType.CIRCLE;
}
}
Выглядят наши физические компоненты на сцене приерно так, и каждый обладает перечисленными свойствами


Строится игровой объект так — создаем обект в которы добавляем и графику и физику, при парсенге физический компонент удаляется после обработки данных.

По такому принципу очень просто сделать набор объектов (у нас тут набор дерева/камня/льда)

Тыкаем их на сцену так как нам нужно, вращаем, скейлим. Теперь написав парсер (не вдаемся в подробности) можно создавать уровни. Получается как то вот так:
На видео мало что видно, на самом деле очень просто и удобно.
Такой же подход использует и WCK — просто супер для ленивих физиков :) редактор в Flash IDE.
- +37
- FlashRush
Комментарии (52)
Вот наверное как то так. В данном примере описание компонента есть и у самого ресурса (объект который лежит на уровне и ждёт парсинга), и у детей ресурса. Например DynamicBody это комбинация одного анимированного спрайта и многих шейпов внутри него. Например там может быть несколько шейпов для имитации физики и один сенсор для просчета попаданий пуль. Шейпы и спрайт мы вытаскиваем по типу (тоже свойство компонента, но в библиотеке это строка, а здесь берем константу по строке). А вообще всё зависит от архитектуры проекта.
Можно высчитывать точки для треугольника из ширины и высоты, там у нас так же есть такие.
Хексагоном удобно создавать объекты типа
Проверяю на > 1, потому как на 0 лежит нужный мне объект.
всё никак руки не доходили покопать в этом направлении, а тут всё на блюдечке ))
А выглядит как и обычно, в котором
position and size
color effect
dysplay
Тоже пользуюсь IDE в качестве редактора. Параметры и свойства объектов передаю в названиях мувиклипов. Это оч. удобно тем что объекты не привязаны к определеным мувиклипам. Можно создать любой мувик, любой формы и с любым рисунком, в названии указать параметры тела. В игре появится уже готовое тело с определенным рисунком и свойствами!
Про компоненты не знал, буду изучать.
В «Component Inspector» есть вкладка «Component Parameters».
типа так? просто я смотрю на ролик и вижу, что там не так.
Насчет потихоньку апдейтить «универсальный» редактор — в определенный момент приходит понимание что не все продумано заранее и что редактор лучше бы вообще переписать с 0 и.т.д…
Конкретная задача (набор однотипных задач) — один специализированный редактор.
ЗЫ: ИМХО
Просто не согласен, что разработка своего редактора не выгодна.
Плюсы своего редактора:
— нет перекомпиляции.
— возможность делегировать работу по созданию уровней.
— разработка уровней для других платформ. (Тестируем уровень сразу на iPhone. Почему бы и нет?)
Для конкретных типов задач(игр) да! и однозначно! нужен специализированный редактор:)
Зачастую (зависит от типа задач) можно воспользоватся Flash IDE, так как есть все необходимое и время затраты значительно меньше.
Интересно услышать мнение камрадов, кто использует свой редактор.
Или поменять в ОС разделитель по умолчанию на точку.
Еще идеи? редактор — CS5 версии.
Кидаю на сцену компонент -> компилирую -> код не видит параметры компонента ((level.getChildAt(i) as Sprite).myVariableName = undefined).
Кидаю на сцену компонент -> меняю любой из моих параметров -> компилирую -> компонент обрабатывается нормально, все параметры определены.
(Flash CS4)
Пара уточнений, если кто друг столкнётся с такими же проблемами, как у меня — класс TestComponent надо сделать наследуемым от MovieClip.
В Component Definition параметры можно врчную не добавлять. Если будет готов сначала ас файл, то после прописывания в после Class нашего файла и нажатия ОК, Inspectable параметры подхватятся сами (это можно проверить, зайдя в Component Definition второй раз).
Не забудьте и в свойствах Linkage вашего компонента поставить такой же класс TestComponent.
Парсинг проводите по событию FRAME_CONSTRUCTED