Mining Truck 2. Загадочный редактор физики

После моего небольшого упоминания о простой реализации физического редактора на основе Flash IDE, у меня создалось такое впечатление, что некоторые из моих читателей сделали не совсем верные выводы и представили себе нечто универсальное. Что же, прийдется немножко вас разочаровать.

Меня вот вчера все спрашивали куда я пропал, почему ничего не пишу — похоже, что однажды мне этот блог просто так забросить не получится :) Я конечно особо ни куда не пропадал, просто не прекращающееся пекло меня уже изрядно вымотало и у меня что-то уже не хватает на все сил. Последние несколько дней по настоящему адские, ни когда бы не подумал что у меня будет выбор: запечься в духоте заперев плотнее окошки, или задохнуться смогом но хотя бы в утренней прохладе. Впрочем такими обстоятельствами сейчас уже по-моему никого не удивить. Лето нынче выдалось по настоящему жгучим, причем после такого в морозную зиму верится уже с большим трудом.

В общем, без вентилятора в такую жару работать получается плохо, поэтому все мои планы по разработке игры немного сдвинулись, а сама разработка чуть затянулась. К установленному самому себе дедлайну для отправки игры на торги я чуть-чуть не успел :) Но все же решил не спешить и не двигать остальные планы. В общем я решил покинуть жаркую и смогливую Москву на недельку и взял себе билеты в более прохладную Анапу, чтобы набраться немного сил и по возвращению все закончить! :) Но прежде чем убежать, я все же чуть-чуть расскажу о своем секретном редакторе уровней.

На самом деле все до безобразия просто. Новый редактор это лишь усовершенствованный класс парсинга и создания уровня на основе одного мувиклипа из предыдущей игры Mining Truck. Признаюсь, мне очень понравилась идея создания редакторов уровней на основе Flash IDE — ведь там есть все необходимые инструменты для работы с графикой, можно использовать повторяющиеся клипы из библиотеки и делать с ним совершенно любые трансформации, что в итоге открывает широчайший простор для фантазии при создании декораций игрового уровня. Более того, используя клипы можно создавать не только оформление но и физический образ игрового уровня и я решил попробовать сделать так чтобы при создании физического образа уровня так же можно было бы включать фантазию и создавать всякие интересные штуки :)

Все началось с идеи добавить в игру динамические мосты, которые бы от перегрузок ломались, что на первый взгляд задача очень не простая. Не имея хорошего редактора физики с возможностью вывода данных в xml такие конструкции через код достаточно трудно сооружать. Я конечно не имел и по прежнему не имею редактора физики, более того мне очень не хотелось разрабатывать такой редактор самостоятельно потому что это достаточно трудоемкая работа. Поэтому я начал думать как можно быстро решить эту задачу на базе Flash IDE.

Цель редактора очень простая: создавать разные тела, задавать им соеденения и реагировать на действия игрока. При этом в самих клипах с уровнями не должно быть никакого кода. Как это все можно сделать когда во Flash IDE клипу в качестве идентификатора можно задать только имя? ? тут мне пришла очень простая идея наложений разных клипов.

Суть идеи такова, что есть разные клипы с условно разными качествами могут находится друг над другом и таким образом можно определить их связи. Конечно сами клипы не имеют никаких уникальных качеств кроме своего графического контента (иконки) и уникального имени по которому мы можем определить, что за объект на месте этого клипа необходимо создать и какими свойствами он должен обладать. То есть грубо говоря при создании уровня во Flash IDE используются клипы пустышки с различными именами, на основе которых создается физический уровень и задаются уникальные свойства физическим объектам.

Пример создания простого уровня

Есть клип с именем «Box» — это значит, что это ящик и когда мой класс будет парсить клип уровня на вложенные клипы и наткнется на клип с таким именем, то на месте этого клипа он создаст физический объект с заранее заданными физическим свойствами. Правда таким подходом опытных Flash девелоперов уже не удивишь. Я не раз слышал о том, что многие пользуются подобными способами :)

Код примера создания простого уровня на основе клипа:

var level:MovieClip = new MyGameLevel();
for (var i:int = 0; i < level.numChildren; i++)
{
    if (level.getChildAt(i) is Sprite)
    {
        switch ((level.getChildAt(i) as Sprite).name)
        {
            case "Box" : 
                // Создаем физический объект ящик
            break;
            case "Barrel" :
                // Создаем физический объект бочка
            break;
            // и т.д. для всех физических объектов
        }
    }
}

Такой способ годится только для создания никак не взаимосвязанных игровых объектов в игровом пространстве. Мне же хотелось большей свободы, которая бы позволила в момент создания уровня собирать различные физические конструкции.

Возвращаясь к идее наложения клипов

Если мы можем создавать физические тела на основе клипов пустышек, то значит на их же основе мы можем задавать и дополнительные возможности определенным игровым объектам. Например, можно визуально скрепить два клипа «Plank» клипом пустышкой «Joint» и в итоге при разборе клипа уровня получить две доски скрепленные болтовым соеденением.

В общем от теории к делу, ведь проще один раз увидеть как это работает чем долго и нудно читать. Я открыл клип с игровым уровнем и совершенно спонтанно придумал самую простецкую физическую конструкцию, процесс конструирования которой во Flash IDE я записал на видео. Смотрим.

Видео ускорено на 50% чтобы не утомлять вас долгими перемещениями мышки. Музыка: International Pony - Bubble In The Bottle

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

Как это работает?

Определить наложение клипов можно самым простым методом hitTestPoint(). В случае с креплениями нужно всего лишь знать положение крепления/клипа крепления по X и Y, а так же то, какие клипы находится под ним. Сам процесс разбора уровня сводится к тому, что изначально все клипы с именами сортируются по критериям. В моем случае я крепления заношу в один список, а тела в другой список, а далее перебираю список с креплениями и проверяю их столкновения со списком объектов методом hitTestPoint(). Если крепление сталкивается с двумя клипами, то они оба тут же создаются в физическом мире и крепятся согласно положению клипа крепления. На деле все достаточно просто.

Кроме физических игровых объектов я заранее определил и несколько типов различных креплений с разными параметрами. Например: фиксированные крепления, ограниченные крепления, крепления двигатели, а так же добавил несколько видов действий которые могут удалять крепления или изменять их свойства. Таким образом такой набор заранее запрограммированных тел и креплений позволяет при помощи их комбинирования создавать различные конструкции.

Пример конструкции

Пример робота загрузчика действие которого активируется игроком.

Но к сожалению, такой способ создания физического мира подходит только для простых игровых конструкций. Когда мне понадобилось собрать сложного робота разгрузчика который должен разгружать груз — я уперся в тупик. Дело в том, что робот должен иметь несколько фаз действий которые выполняются последовательно с некоторым интервалом: опустить захват, захлопнуть захват, поднять захват, повернуть стрелу, открыть захват и т.п. Такого робота используя данный метод уже достаточно сложно реализовать, потому что на разные крепления должны быть разные действия которые выполняются последовательно. Реализовать такое конечно можно и я даже был близок к тому как это сделать, но в итоге я решил все упростить и сделать подобных роботов отдельным классом, где они созадается кодом и все их действия заранее запрограммированы и отлажены :)

В любом случае, подобный редактор уровней отлично подойдет для игр типа IQ Ball или Roly-Poly Cannon 3 — ведь в играх такого плана нет сложных физических конструкций! :)

Кстати, именно за счет ввода в игру различных конструкций которые могут ломаться и выполнять различные игровые действия новая игра стала чуть больше чем просто «загрузи и довези». Добавились простые фановые головоломки и дополнительные задачи которые с ними связаны. За счет головоломок и задач в игре появился и исследовательский стимул — уровни стали чуть больше и более запутанные. Кроме этого исследовательский стимул я еще решил подстегнуть уникальными трофеями, которые будут спрятаны на каждом игровом. Трофеи представляют собой не просто бездарные безделушки которые игроки привыкли видеть в играх на отдельных трофейных экранах. Я решил, что сбор трофеев для отдельного экрана — это скучно, поэтому в качестве трофеев выступают неожиданные улучшения для дрезины которые меняют не только внешний вид транспорта но и его характеристики, а так же добавляют бесполезные фичи :) Но подробнее об этом я расскажу как-нибудь потом. А пока лишь могу сказать, что за счет этих всех нововведений сложность и время разработки игровых уровней увеличилось почти в три раза! Но я не унываю и стараюсь не отступать от задуманного — дело потихоньку движется к финишу :)

 

О круть!!! Я первый в этот раз неплохая статья в прочем как всегда !!!

иван
6 Августа 2010
— 16:20
#

Просто прикланяюсь перед мастерством!:) Всё очень круто.

Darkvam
6 Августа 2010
— 17:24
#

Читал статью с отвисшей челюстью, думая "Ничего себе, вот это он молодец, настоящий профи!"
Я искренне рад за хозяина блога, то что он делает это ЗДОРОВО!!!

Samana
6 Августа 2010
— 22:57
#

Антон, желаю тебе в Анапе накупаться, хорошенько загореть, набраться новых положительных эмоций))

Удачного отдыха!!!

Vadim M.
7 Августа 2010
— 01:45
#

http://www.sideroller.com/wck/
World Construction Kit is is a toolset / framework for rapidly developing physics based games / websites within the Flash IDE. WCK allows you to layout your 2d worlds / game levels entirely within Flash and have them hook into the physics simulation without writing any code.

?зучать box2d стал, наткнулся на это. Вроде похоже. Сам не использую, потому что flashIDE не имею.

WeslomPo
7 Августа 2010
— 10:05
#

? да, удачного отдыха в Анапе:)

WeslomPo
7 Августа 2010
— 10:14
#

? ещё забыл сказать, графика ведь очень насыщенная, проработанная, сделана с душой!!!

Samana
7 Августа 2010
— 11:13
#

Ты мне просто открыл глаза на создание уровней! Большое спасибо! :-)
? по-моему тут можно сделать упрощение, если использовать не name, а определять тип создаваемого объекта через его linkage. Тогда не придется каждому мувику задавать отдельное имя.

zakhej
7 Августа 2010
— 12:22
#

Супер! ОТличная идея и она работает ! А исходники демки можете выложить?

shaman4d
7 Августа 2010
— 14:19
#

Дочитал до конца - знатная игрушка у вас получается. Ждем с нетерпением.

shaman4d
7 Августа 2010
— 14:35
#

Привет!

?дея редактора супер!

Я так делал в одной игрушке, тока я поступал проще, я в library создавал элементы игры в виде кастомных классов (галочка "export for action script" в свойствах мувиклипа). В итоге разбор мувиках сводился к сравнению типа...

Еще был один 3д проект и там были большие текстры для земли, например травка, кое где выступает песочек, кое где дорожка, кое где тень и т.д. Все делалось в FLASH IDE путем копирования поворота и скейла. В итоге получался swf который был весом примерно 200-300 кб против jpg весом 1-2 мб.
При загрузке такой текстуры она рисуется в битмап и все дела.

Кстати, в приведенном выше коде лишние два вызова функции getChildAt(i) и свойство name есть у DisplayObject который возвращается getChildAt(i). Поэтому нецелесообразно вызывать два раза getChildAt(i) и один раз приводить его к Sprite ))). Это так - лекция по повышению производительности ))))

SuperMan
7 Августа 2010
— 19:38
#

Странно что народ незнает

Box 2D + Flash IDE

http://wiki.github.com/jesses/wck/

Пример

http://www.sideroller.com/wck/

очень похожая идея + с исходниками

Бог ?мп
8 Августа 2010
— 01:31
#

Ага, я уже говорил

WeslomPo
8 Августа 2010
— 01:57
#

хм я такую идею с наложением клипов использовал во флеш-игре еще года два назад - помоему тут ничего сверхъестевственного, все лежит на поверхности

Ага
8 Августа 2010
— 22:27
#

@WeslomPo, спасибо за ссылку. Не знал о таком, надо будет посмотреть :)

Ant.Karlov
8 Августа 2010
— 23:12
#

@zakhej, мне кажется, что linkage не очень удобно использовать в качестве идентификаторов клипа. В имени можно задавать еще дополнительные параметры. Например, когда ставлю светофор, то я с помощью дополнительного слова определяю какой свет у него должен быть включен :) Поэтому вариант с именем мне нравится больше.

Ant.Karlov
8 Августа 2010
— 23:17
#

@shaman4d, исходников пока никаких в качестве примера выложить не могу :(

Ant.Karlov
8 Августа 2010
— 23:18
#

@SuperMan, я примерно так же и делаю в своих проектах как вы описали. Только в моем случае вовсе векторная графика :) А в самой игре при загрузке уровня все это растеризируется, что в итоге очень сильно сокращает размер финального *.swf.

?спользовать имя в качестве идентификатора игровых объектов мне кажется более привлекательным, потому что через него можно задавать дополнительные параметры :)

Я написал пример без лишних переменных чтобы пример был читаемым. В своих работах я фильтрую объекты оформления от всех остальных по классу Sprite. Когда я создаю игровой уровень, все объекты оформления имеют тип Graphic, а остальные же которые учавствуют в игре, имеют тип MovieClip. Когда производится достаточно много проверок и различных условий на предмет содержимого имени, то мне кажется более оптимальным отсеять все лишние спрайты не имеющие к игровому уровню отношения на этапе if (level.getChildAt(i) is Sprite) { ... } :)

Ant.Karlov
8 Августа 2010
— 23:29
#

@Бог ?мп, большинство наверное знает о WCK, а мне вот как-то до этого не приходилось сталкиваться с этим плагином :)

Ant.Karlov
8 Августа 2010
— 23:32
#

@Ага, действительно, идея на поверхности. Но ни кто и не говорит, что я изобрел очередной уникальный велосипед. Я лишь поделился тем как я решил свои задачи ;)

Ant.Karlov
8 Августа 2010
— 23:34
#

Антон, ты в видео показываешь как вращаешь объекты в редакторе, и после этого они у тебя создаются уже повернутые в игре.
Я создаю тела в Box2D как SetAsBox(), при этом ширину и высоту беру из клипа на сцене. Также из клипа на сцене я беру угол поворота в градусах (ну и положение). Только вот когда я в IDE поворачиваю свой объект, то у меня меняются параметры высоты и ширины(!), и. в итоге Box2D создает тело с параметрами отличными от нужных мне. Как ты решил эту проблему?

Netouch
9 Августа 2010
— 21:42
#

Сорри за флуд -но как вариант:
можно строительные блоки при парсинге файла задать фиксированной шириной/высотой (то есть не брать высоту/ширину из клипа уровня), а из клипа уровня брать только позицию и угол поворота.

Netouch
9 Августа 2010
— 22:19
#

@Netouch, я тоже столкнулся с этой забавной проблемой :-) Решается все просто, перед заданием параметров создаваемого тела ставишь rotation оригинала в 0 и всё! :-) А потом возвращаешь если надо старое значение rotation.

zakhej
9 Августа 2010
— 23:12
#

Самое простое, что приходит в голову с углом поворота: запоминаешь угол поворота, потом устанавливаешь его в 0, и вот - пожалуйста, у тебя реальные width & height + есть угол поворота. Какбэ очевидно :) По крайней мере я так делал, когда подобную штуку реализовывал.

P.S. Я, кстати, тоже делал через linkage. ? поэтому дополнительные параметры задавал различными графическими свойствами об-в - пустышек во FlashIDE. Например torque мотора или плотность планок можно задавать альфой.

Frikazoid
10 Августа 2010
— 01:04
#

Упс, надо было страничку обновить прежде чем постить. Простите за повтор.

Frikazoid
10 Августа 2010
— 01:05
#

Спасибо. Порой самое простое решение лежит на поверхности, нужно только его увидеть :)

Netouch
10 Августа 2010
— 01:49
#

Спасибо. Для Box2D есть и другие варианты, как например использование Inkscape: http://www.ezqueststudios.com/blog/creating-levels-box2d/

artsiom
11 Августа 2010
— 13:11
#

Зацените ка игру. Как по мне то ни разу не похоже на Mining Truck )). Конечно может автор этой игры нам всем известен, но зная Антона по записям в блоге я сомневаюсь.

http://www.freeonlinegames.com/racing-games/tractors-power.html

AntonKovalev
12 Августа 2010
— 00:34
#

AntonKovalev, там графика используется от Mining Truck, плагиат.

artsiom
12 Августа 2010
— 15:46
#

Уже всплывала в каких то сообщениях. Кстати ее даже в игромании рекламировали (походу я один покупаю этот журнал :( ).

WeslomPo
12 Августа 2010
— 16:30
#

Да, рекламировали. При чем совсем недавно.

f-duck
12 Августа 2010
— 19:09
#

Как всегда отличная статья!
Ребята уже вспоминали про wck, так вот очень удобный подход, в Flash CS5 есть возможность делать очень просто компонент, в библиотеке выбираем нужный клип ->contextmenu->component definition и создаем компоненту с нужными нам полями (свойствами), потом так же просто редактируем эти свойства в Flash IDE, теперь у нас не только имена но и все нужные нам свойства.

FlashRushGames
16 Августа 2010
— 12:34
#

Да и во Flash CS3 это делается точно так же. Тем не менее чисто визуально гораздо удобнее метод заслуженного машрумера индустрии)) Я как раз думал как бы безболезненно внедрить джойнты в новую игрушку - и свершилось! Спасибо за наводку - очень полезная инфа. Кстати выглядит новый грузовик очень симпатично. Я даже наверно пожелаю успеха не только с флешем но и с портами на другие платформы)) Занятная штука получается.

RaymondGames
16 Августа 2010
— 22:34
#

Молодца! Как всегда на высоте... Хорошая статья. Жаль видео я не смог посмотреть... Для моей страны мол запретили на ютубе... ... но по тексту, в целом и так понятно о чём речь... Так держать! :)

Alxs
19 Августа 2010
— 00:19
#

Воплотил джойнты по образу и подобию. Нарадоваться не могу :D Спасибо о великий! :D

Сейчас думаю как лучше справиться со скриптами. Накладывать простенькие базовые скрипты поверх объектов - круто только с визуальной стороны. А с невизуальной проще их куда нибудь спрятать, а в полях параметров объекта указать явно какой скрипт задействован (по имени). А на ините смотрим айди скрипта в параметрах и линкуем. Если оч.хочется сохранить визуал - дропаем поверх значок скрипта (мувиклип)(как сейчас) а в имени указываем айдишник. Ну и чтоп реализовать сложного робота достаточно прописать отдельный скрипт который на ините берет линки на все нужные части и потом ими балуется как хочет. ?мхо.

RaymondGames
19 Августа 2010
— 11:09
#

А я вот отказался от подхода набирать уровни во flash IDE по причине того, что на каждый тест уровня нужна компиляция. Все хорошо, пока fla файл меньше 30-50mb и не содержит звука / музыки, если же fla`ха разрастается, левелдизайн превращается в мучение.

Smrdis
20 Августа 2010
— 00:36
#

Классная графика.

Долгое время пользовался почти таким-же методом создания уровней, правда определял объекты по типам. Потом встала необходимость задавать каждому из них определенные свойства (скорость мотора/вес/враг-друг/ломается джойнт или нет, и т.п.) и начал писать отдельный редактор.

> более того мне очень не хотелось разрабатывать такой редактор самостоятельно потому что это достаточно трудоемкая работа.

Не так все страшно, имхо. Есть http://www.senocular.com/?id=1.371 которая реализует функции трансформации, перемещения клипов. Все, что нужно для уровня как выше - какой-нибудь туллист с иконками (строить можно просто описав массив типа [клип, имя объекта]. При клике на иконку - создать объект уровня, и сделать .startDrag() на его клипе. При сохранении уровня - попытке в него поиграть, считать со сцены, все что набросано со всеми параметрами вроде поворота/масштаба/childIndex`а, и выгрузить в XML. Дальше загрузить его в игре, что тоже относительно просто через мап "имя в xml" => класс

Плюсов море - можно делать полигоны и задавать им текстуры, веревки - не соединяя каждую часть, просто указав две точки. Контролировать, к какому телу джойнт присоединен, ну и конечно - сделать из него редактор для пользователей.

James
21 Августа 2010
— 03:00
#

А статические объекты для формирования трассы расставляются вручную? Это же огромный объем работы!.. Разве Flash IDE не умеет автоматически по периметру Shape расставлять какие-либо объекты?

art
26 Августа 2010
— 16:35
#

@Smrdis, можно программировать и компилировать в FlashDevelop с Flex SDK или в Flash Builder, а графику с уровнями растащить по нескольким FLA файлам. ? не придется тратить время на создание своего редактора.

art
26 Августа 2010
— 17:15
#

@Smrdis, согласен с тем, что при тестировании уровня приходится компилировать всю флешку — это действительно очень не удобно особенно когда игра близится к релизу, так как компиляция начинает занимать достаточно много времени. В моем случае компиляция начинает занимать много времени когда в игру добавляются звуки и музыка, поэтому я их стараюсь вставлять в игру в последний момент. В остальном, разработать подобный Flash IDE редактор для создания именно таких уровней как я делаю для игр типа MT — достаточно трудоемкая задача и этим я пока не могу себе позволить заняться :(

Ant.Karlov
26 Августа 2010
— 23:14
#

@art, да, абсолютно все объекты расставляются вручную. Flash что-то там умеет расставлять автоматически и по периметру, но это уже получается не так красиво и слишком аккуратно. А качество требует трудозатрат ;)

Даже если все разбить на отдельные fla, то при компиляции они все равно будут собираться в кучу и это по прежнему будет занимать ровно столько же времени.

Ant.Karlov
26 Августа 2010
— 23:21
#

@Ant.Karlov, но Flex SDK умеет делать инкрементальную сборку, поэтому компиляция, даже очень большого проекта, происходит за несколько секунд ;)

art
27 Августа 2010
— 13:26
#

@art, здорово если так на самом деле. Я с Flex SDK не работал, поэтому не знаю :)

Ant.Karlov
27 Августа 2010
— 18:05
#

Антон прикольно но редакторы у нас 1 в 1 копия). Но эт ладно. В общем я вот что хотел спросить:

В общем как статическими прямоугольными блоками реализовать ямы это и ежу понятно). Но вот только дело доходит до горок то очень напрягает то что прямоугольники приходится по пиксельно подгонять друг к другу или будет торчать какой ни будь угол и герой будет чутко тормозить в этом месте, а то и вообще зацепляться за этот участок. это с учетом того что герой описан не просто прямоугольником а 7`миугольником...

Zloba
7 Сентября 2010
— 02:01
#

@Zloba, да, описанная тобой проблема может существовать но её можно решить как минимум двумя способами (а лучше обоими одновременно):

1. Не допускать таких стыков на которых персонаж может цепляться и застревать. Если такой угол все же получается и персонаж там цепляется, то можно попробовать скрыть выступ под небольшой сферой (круглой кочкой), если конечно это позволяет игра и это решение не скажется на геймплее.

2. А еще можно сделать очень пологий низ у семиугольника представляющего персонажа. Например, как у лодки — тогда возможно это позволит снизить застреваемость. Ну и конечно же стоит поиграться с настройками трения.

Возможно еще есть интересные решения, но это первое что мне пришло в голову.

P.S.: Можно вообще маленькие невидимые колесики сделать :D

Ant.Karlov
7 Сентября 2010
— 18:36
#

Сони заблокировали твой клип. очень жаль. Может убрать музыку?

k0t0vich
15 Сентября 2010
— 13:28
#

А почему именно Мувиклипы? почему не Спрайты?
Может у мувиклипов есть какие-то приемущества, и это сделано специально?!

Dan4ez
5 Декабря 2010
— 21:00
#

@Dan4ez, во Flash IDE есть три возможных типа объекта: MovieClip, Graphic и Button. В качестве динамических объектов которые нужно про парсить и извлечь их параметры в игру при загрузке уровня — я использую тип MovieClip. Для остальных объектов не имеющих отношения к игровому процессу и выполняющих роль оформления — я использую тип Graphic. В коде перебираю весь уровень (клип уровня) и определяя тип вложенных объектов в коде выполняю необходимые действия в соответствии с типом.

Ant.Karlov
5 Декабря 2010
— 21:28
#

Добрый день.
case "Box" :
// Создаем физический объект ящик
break;
я так понял, что
var my_body:b2BodyDef = new b2BodyDef();
var my_box:b2PolygonShape = new b2PolygonShape();
var my_fixture:b2FixtureDef = new b2FixtureDef();
my_fixture.shape = my_box;
body = world.CreateBody(my_body);
body.CreateFixture(my_fixture);

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

АВК
13 Февраля 2011
— 17:18
#

@АВК, получаем ссылку на экземпляр клипа объекта из клипа уровня и считываем его координаты и размеры например следующим образом:

var clip:Sprite = level.getChildAt(i) as Sprite;
my_body.position.Set(clip.x / DRAW_SCALE, clip.y / DRAW_SCALE);
my_body.angle = clip.rotation * (Math.PI / 180);
clip.rotation = 0;
my_box.SetAsBox(clip.width / 2 / DRAW_SCALE, clip.height / 2 / DRAW_SCALE);

Где DRAW_SCALE — это константа с пропорциями вашего физического мира по отношению к графике.

Ant.Karlov
13 Февраля 2011
— 17:31
#

По правде сказать, я совсем запутался, В клипе уровня, все клипы - это movieClipы. Тогда почему var clip:это Sprite , внутреуровневые клипы связывают через линкедж или ...истина где-то рядом?!?!

АВК
13 Февраля 2011
— 23:20
#

@АВК, MovieClip — это потомок класса Sprite. Поскольку нам нужны лишь стандартные параметры клипа: размеры, поворот и положение, то мы можем обратится к клипу как к спрайту. Но никто вам не мешает написать и level.getChildAt(i) as MovieClip.

Внутре-уровневые клипы линковать не нужно.

Ant.Karlov
14 Февраля 2011
— 02:51
#

Спасибо за быстрые и доходчивые ответы. Блог супер, восхищаюсь!

АВК
14 Февраля 2011
— 17:51
#

Добрый день.
Уважаемый Ant.Karlov, подскажите:
в Component Definition создаю свойство material, потом редактирую это свойство в клипе на сцене. Но при обращении
(this.getChildAt(i) as MovieClip).material результат undefined, хотя имя объекта получаю нормально (this.getChildAt(i) as MovieClip).name).

Bodikus
14 Марта 2011
— 13:19
#

@Bodikus, проблема в том, что вы обращаетесь к компоненту как к MovieClip, а у MovieClip нет заданных вами свойств. Нужно экспортировать компонент как и любой MovieClip в код и обращаться к нему в коде так:

(this.getChildAt(i) as MyComponent).material;

Ant.Karlov
14 Марта 2011
— 13:37
#

То есть в Component Definition в поле Class прописать класс компонента, в котором определить геттер свойства, и уже через него получать значение свойства?

Bodikus
14 Марта 2011
— 14:33
#

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

Ant.Karlov
14 Марта 2011
— 17:06
#

Спасибо огромное, работает!

Bodikus
15 Марта 2011
— 18:06
#

Антон а зачем вы в коде парсите сцену, если просто в IDE можно накидать физические обыъекты как вы сделали, а для каждого типа (Box, Barrel) написать класс и в export мувика указать этот класс и он автоматически вызываться будет и вся сцена пропарситься сама. ?ли есть еще какой то смысл ?? спасибо

?ван
20 Апреля 2011
— 18:35
#

@?ван, даже не знаю как так просто и лаконично ответить :) В моем случае предложенный вами вариант просто не сработает. Потому что на самом деле, то что мы видим во Flash IDE и то, что мы видим в игре — это не одно и тоже. Если бы я загружал клип с уровнем как есть, то производительность была бы на нуле.

В реальности же клип с уровнем из Flash IDE используется лишь как коробка с информацией об общем графическом представлении уровня и о расположении физических объектов. Во время создания уровня я делаю растровые «фотоснимки» с реального клипа и на основе расположения особых клипов создаю физические объекты, а оригинальный векторный клип уровня в топку... То есть в игре не происходит управление непосредственно теми клипами которые я расставляю на игровом уровне потому что они векторные и тормозные — таким образом я не могу к ним привязывать какие-либо классы.

Ant.Karlov
20 Апреля 2011
— 21:16
#

Антон спасибо что ответили, я понимаю что вы растеризуете сам уровень, но ведь те самые особые клипы - они пустышки лишь для создания физики и если им прописать класс экспорта, то при загрузки в классе в конструкторе можно создать физический объект (как вы это делаете в цикле) и удалить его со сцены (этот особый клип) получиться тоже самое только не нужно делать циклы и проверку и заполнение уровня. вроде так.

?ван
21 Апреля 2011
— 16:11
#

?ван, как потом обращаться к физическим объектам, если нигде не хранятся на них ссылки?

zakhej
21 Апреля 2011
— 17:11
#

@?ван, предлагаемый вами способ только кажется удобным. Если клипы пустышки никак не участвуют в игре и хранят в себе только информацию для создания игровых объектов, то к ним нет никакого смысла привязывать классы.

1. Во первых, для каждого игрового объекта и так существует класс, который отвечает за его жизнедеятельность. А в предлагаемом вами случае для каждого типа объектов прийдется заводить два класса: первый класс креатор привязывается к клипу и создает игровой объект.

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

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

4. Привязывая к клипам классы не возможно использовать ранее созданные игровые объекты из кэша.

На самом деле циклы с различными проверками на этапе создания игрового уровня — это совсем не страшно :) Все ресурсо-затраты в основном ложатся на создание растрового кэша уровня и создание игровых объектов если они не берутся из кэша.

Ant.Karlov
21 Апреля 2011
— 17:49
#

zakhej а зачем к ним обращаться в данном случае это статический уровень.
Ant.Karlov
Спасибо за ответ.
по поводу пунктов, с первыи и вторым не полностью согласен, можно сделать в одном классе , но 3 пункт походу самый главный и это в корне меняет все. на счет 4 я не очень понял(( почему это нельзя

?ван
21 Апреля 2011
— 18:08
#

видимо вы имели в виду то что базовым класом будет векторный мувик и при создание новых объектов с ним нужно будет опять бороться(растерезовать), согласен это тоже проблема и ваш подход лучше. просто я думал что физика уровня не изменяется и новые объекты не добовляються

?ван
21 Апреля 2011
— 18:13
#

Антон, приветствую! Сейчас как раз пытаюсь реализовать свой примитивный редактор во Flash IDE, но наткнулся на такое препятствие. Каждый объект, в пределах текущей сцены/клипа, должен иметь уникальное имя (по крайней мере, у меня компилятор на это ругается). Как тогда добавить и считать парсером, например две бочки или два ящика ?

Я не бот!
6 Июня 2011
— 16:39
#

@Я не бот!, странно что ругается, первый раз о таком слышу. Может быть что-то делается немного не так?

Альтернативный вариант — это экспортировать клипы которые обозначают игровые объекты на сцены в код как классы, но не привязывать их к внешним *.as файлам. Просто ставим галочку экспорта клипа в код, указываем его имя класса и родительский класс делаем MovieClip или Sprite. А далее примерно так же перебираем и создаем игровые объекты:

for (var i:int = 0; i < level.numChildren; i++)
{
var mc:MovieClip = level.getChildAt(i);
if (mc is Barrel_mc)
{
// makeBarrel(mc.x, mc.y);
}
else if (mc is Box_mc)
{
// makeBox(mc.x, mc.y);
}
}

Ant.Karlov
6 Июня 2011
— 21:53
#

Я бот!

БОТ
15 Августа 2011
— 13:40
#

Антон, сделал редактор на примере вашего, но флеш ругается, что на кадре находятся мувики с одинаковыми инстанс неймами, в которых я прописываю соответственно ground/active. Почему в вашем случае такого не наблюдается, ведь у вас тоже как я понял клипы с одинаковыми инстанс неймами расставлены по сцене?

YureZZ
4 Января 2012
— 17:38
#

Прочитал верхний коммент, все понятно.

YureZZ
4 Января 2012
— 17:51
#

Спасибо. Очень полезная статья. Респект =)

airomagic
19 Апреля 2012
— 23:09
#

Прошу помощи люди как сделать соединения всю голову уже изломал!!!!!HELP!!!

Денис
21 Августа 2012
— 21:22
#