Основы as библиотеки Box2d

Content on this page requires a newer version of Adobe Flash Player.

Информация
Автор/переводчик: 
Notion-flash
Описание: 

Ок, давайте рассмотрим что такое box2d вообще и зачем его использовать. Это один из самых продвинутых физических движков. Встречал очень много людей, утверждающих, что такой движок, как Nape намного шустрее. Честно говоря, это так и есть, но только в простейших приложениях (например если создать 3 квадрата 50х50 в Nape и box2d, то первый "съест" меньше памяти(примерно на 1кб). Как правило такие мелочи не сильно влияют на оконечный результат.)

Начнём. Первое что хочу сказать: скачайте box2d.zip и FlashDevelop. Поверьте с FlashDevelop-ом вам будет на много проще работать.

  • Создайте папку с любым именем, например "box2dproject"
  • Разархивируйте туда библиотеку бокс2д
  • Создайте .fla (я назвал main.fla)
  • Во флеше: нажимаем Ctrl+Shift+F12, вкладка Flash, кнопка "Подробности", в новом окошке укажите путь к папке "Box2d"
  • Тоже самое проделываем и в FlashDevelop(Project, Propeties, Classpaths)
  • Всё готово!

Сейчас создайте новый .as и сделаете его документальным классом проекта. Открываем и первое что нам нужно создать, это переменная для инициализации box2d:

private var _world:b2World;

То есть мы просто создали переменную _world (типа b2World). Дальше, в методе-конструкторе "строим мир":

_world = new b2World(new b2Vec2(0, 10), true);

_world - переменная типа b2World
new - создание нового экземпляра
b2World (prop1:b2Vec2, prop2: Boolean) - метод принимает 2 значения prop1 и prop2.
prop1 - гравитация( b2Vec2 (горизонтальное_смещение,вертикальное_смещение ) )
prop2 - спящие объекты

Довольно часто каждое значение присваиваю переменным, можно встретить:

var gravity:b2Vec2 = new b2Vec2(0,10)
var doSleep:Boolean = true;
_world = new b2World(gravity, doSleep);

Ок, с миром ясно. Теперь нам предстоит создать землю (пол) чтобы мы могли построить пирамиду из ящиков. Звучит заманчиво? Начнём!
Что нужно знать при создании "тела" в пространстве box2d:

  • Любое тело - это экземпляр b2Bodyвстретить
  • Чтобы создать b2Body, сначала нужно создать его "описание", а точнее b2BodyDef (этот класс отвечает за размеры, тип, угол..)
  • Дальше нам нужно создать еще один экземпляр класса, теперь b2PolygonShape (этот класс отвечает за форму тела)
  • И последнее, создать экземпляр класса b2FixtureDef (внешний вид глазами box2d)
  • После создания всех необходимых переменных можно и добавить наше тело в "мир".

Теория, это хорошо, но без практики никуда.
Первым делом, сразу создавайте все необходимые переменные:

var box : b2Body; var boxDef : b2BodyDef; var boxShapeDef : b2PolygonShape; var boxFixture : b2FixtureDef;

Далее начинаем создавать само тело. Манипуляции из box: b2BodDef;

boxDef = new b2BodyDef();
boxDef.position.Set(250/ METR, 250 / METR); //позиция тела на сцене 
boxDef.angle = 0;  //угол(в радианах, то есть пишем в градусах, умножаем на ПИ, делим на 180) 
boxDef.type = b2Body.b2_staticBody; //типа тела

Забыл сказать, в box2d пиксели использовать нельзя! Простейшая единица считается метр. То есть чтобы поставить тела в точку 100х100, нужно написать 100/30х100/30. Надеюсь тут всё ясно, ОДИН метр = 30 пикс. У меня в коде METR (public static var METR:int = 30) Манипуляции из box: b2PolygonShape;

boxShapeDef = new b2PolygonShape();
boxShapeDef.SetAsBox((100 / 2) / METR, (100 / 2) / METR); //определяем шейпу как квадрат

Несколько слов о методе SetAsBox (prop1, prop2). В примере выше, я создал квадрат 100х100, но почему записано 100/2? Всё очень просто, точка регистрации в любого тела - по центру. То есть я указал ширину, поделил на 2 и получил середину.
Манипуляции из box: b2FixtureDef;

boxFixture = new b2FixtureDef();
boxFixture.shape = boxShapeDef; //определяем форму 
boxFixture.density = 0.5; //вес тела 
boxFixture.friction = 0.5; //сила трения 
boxFixture.restitution = 0.5; //прыгучесть(отскок)

Тут думаю всё ясно как белый день. Но всё же скажу что: таким свойствам как density, friction, restitution - можно присвоить значение от 0 до 1. Мы всё создали, теперь осталось только добавить тело в "мир".

box = _world.CreateBody(boxDef)
box.CreateFixture(boxFixture);

Всё готово! Тело в мире, но не на сцене =\
Первым делом нам нужно создать событие ENTER_FRAME:

_world.Step(1 / METR, 10, 10);  //рекомендуемые параметры  
_world.ClearForces();

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

var drawThis:b2DebugDraw = new b2DebugDraw();
var spriteToDraw:Sprite = new Sprite();
addChild(spriteToDraw);
drawThis.SetSprite(spriteToDraw);
drawThis.SetFlags(b2DebugDraw.e_shapeBit);
drawThis.SetDrawScale(METR);
drawThis.SetAlpha(0.4);
drawThis.SetLineThickness(1);
_world.SetDebugDraw(drawThis);

У вас, по идеи, должен возникать вопрос: "что это было..". Ответ: "набор методов-отрисовщиков". Теперь каждую строчку по порядку. Сначала, нужно объявить переменную типа b2DebugDraw и создать её экземпляр. Дальше "что-то для прорисовки", точнее Спрайт. Дальше мы обращаемся к drawThis (b2DebugDraw) и её методов.

  1. SetSprite - ясно как белый день. Определяем Спрайт для прорисовки
  2. SetFlags - битовая маска
  3. SetDrawScale - перевод едениц в МЕТРЫ
  4. SetAlpha - интенсивность заливки
  5. SetLineThickness - линии
  6. Всё готово, рисуем! _world.SetDebugDraw(drawThis);

Вот и всё! Надеюсь, для вас эта информация была полезной :)

Исходник: 

Создайте свою первую игру во Flash!

Box2D позволяет людям с небольшим опытом или недостаточными математическими знаниями программирования начать делать вещи, которые раньше они сделать не могли.

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

Уже в ближайшее время, после изучения курса и тренировки вы сможете создать свою первую flash игру-платформер, и чем чёрт не шутит - продать её!

Создайте свою первую игру прямо сейчас!

Комментарии

Аватар пользователя Smitg9

пиши есчо!!!))
круто, давно искал) 

Аватар пользователя Fly

"есчо" - "ещё" правильно...

1) Админ всегда прав
2) Если админ не прав, смотри пункт 1

Мы в контакте -

Аватар пользователя lsdhord

а для девелопа, Adoba Flash нужен?

Аватар пользователя Notion

 lsdhord  не обязательно
 Smitg9 ок, на неделе с меня еще одна статья о боксах(другие статьи есть на сайте источнике..но ссылку дать немогу - сочтут за рекламу)

Аватар пользователя Прохор

Хм... помню недавно поднимал этот вопрос в группе в контакте, вижу, ничего не остается без внимания.
EasyFlash - отличный проект!

goodgood

 

Да, я насколько знаю, есть ещё QuickBox2D, с ней пожалуй поудобнее работать.

Аватар пользователя Smitg9

Fly, не сердитесь, это я специально так написал))
Больше не буду :)

Аватар пользователя Fly
Цитата: Smitg9

Fly, не сердитесь, это я специально так написал)) Больше не буду :)

Я не сержусь, просто на столько грубые описки/ошибки режут глаз :)
P.S. Я же сам не на 100% знаю русский.

1) Админ всегда прав
2) Если админ не прав, смотри пункт 1

Мы в контакте -

Аватар пользователя nilamop

Nation, FlashDevelop рекомендуете, а нельзя ли использовать что-то из продуктов Адобе?

Аватар пользователя Notion

nilamop,
конечно можно, но они платные. Чесно говоря, я еще не встречал редактора лучше FD. Если вам очень хочется продукт Adobe - скачайте Flash Builder

Аватар пользователя sazonoff

Есля я не ошибаюсь есть ешё Adobe Dreamweaver)

Аватар пользователя Smitg9
Цитата: sazonoff

Есля я не ошибаюсь есть ешё Adobe Dreamweaver)

 
а он то ту при чем?? О_о 

Аватар пользователя VittyRude

Люди! Зачем себя утруждать и писать по 20-30 строчек, чтобы сделать только квадрат и стены?? Есть  QuickBox2D ! Там это можно сделать за 3 строчки 

yes

Аватар пользователя Notion

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

Аватар пользователя Vetalos

подскажите кто знает
вообщем у меня такая проблема, использую Box2d Flash Alchemy Port + World Construction Kit и возникла такая проблема,есть 2 тела, одно статично второе динамично, и вот при перемещении (динамического тела) куба, о статическое(например пол), он или скользит как по льду или вообще не двигается, а мне нужно сделать так чтобы у него было минимальная сила трения, то есть чтобы куб перемещался вообще без трения, может кто сталкивался с WCK прошу помощи, буду очень признателен.