14 августа 2014 г.

Форк от портированной версии Box2d.js

  • левая кнопка мыши - таскать динамические тела
  • - следующий пример
  • - предыдущий пример
  • R - сброс примера
  • S - создать сверху квадрат
  • C - создать сверху круг

Знакомиться с библиотекой эмуляции физики твердых тел Box2D (в оригинале написанной на C++) начал еще с версии для Flash. Но пути IT индустрии складываются так, что Flash стремительно сдает свои позиции. Поэтому решил переметнуться в этой области к Javascript.

Среди многих, на просторах, выделил для себя две версии порта Box2DJS и Box2DWeb. Версия Box2DJS попалась первой, поэтому начал с неё. Но, как оказалось, этот порт не лишен изъянов.

Первое, и самое страшное - это подключение либы. Все классы разбиты пофайлово. А их 64! Решил форкнуть на github, чтобы добавить компилятор и минификатор. А потом пошло-поехало. В результате вот чего доделал:

  • Добавил документацию. Оригинал ссылался на документацию из Flash, но там и из-за разницы версий, и из-за неполной портированности самой либы API сильно отличается. Сделал, конечно, только названия классов. Потому как, документирование - не самое интересное дело.
  • Добавил примеры и из Flash версии, и из Box2DJS (их вы можете видеть в начале поста). Естественно, только те, что позволил текущий API.
  • После того как начал писать примеры понял, что для удобства надо кое-что дописать. В результате появилась раскрашенная debug отрисовка (закончил также для Pulley Joint, которую автор порта не реализовал), методы Initialize у популярных joint'ов и метод QueryPoint для b2World.
  • Также, очень раздражала зависимость от библиотеки prototype.js - убрал.
  • Совсем чуть-чуть поправил форматирование.

В будущем можно было бы:

  • Доделать документацию.
  • Доделать примеры из Flash-версии либы (они, кстати, и там не все сделаны).
  • Рефакторить конструкторы - повторяются определения в функциях-конструкторах и объекте prototype.
  • Рефакторить определения Array и Object.
  • Дописать отсутствующие методы (нет свойства bullet, например, и многого другого).
  • Некоторые классы можно полностью выпилить (все, что имеют Def в названии - это рудименты C++ - для Javascript не имеют смысла совершенно).
  • Думаю, подход к итерациям можно заменить на родной javascript'овский. Хотя бы ради удобства использования.
  • В определителе тел для форм сразу выделяется 64 (по умолчанию) ячейки. Подход C++ - не нужен.

Это - все основные мысли, которые возникли в процессе знакомства с портом библиотеки для Javascript. Я думаю, доработок значительно больше.

У версии Box2DWeb лишь заглянул в код. Он оказался аккуратным. Возможно даже полностью написан вручную. Но, почему-то, прямо на главной странице проекта примеры не работают. Это остановило.

Так вот обстоят дела с Box2D в мире Javascript. Я важное что-то упустил?

2 комментария:

alx-popov комментирует...

> Но, почему-то, прямо на главной странице проекта примеры не работают. Это остановило.

Почему же, работает. Просто загрузка скрипта блокируется.

Создал локальную страничку, открыл исходный код фрейма с примером, скопировал скрипт в конце, закомментировал последнюю строчку, вставил canvas, повесил init() на onload, добавил ссылку на Box2d.min.js -- вуаля. Но там просто несколько тел, всё-таки с манекенами веселее.

Иван комментирует...

> Просто загрузка скрипта блокируется
Это остановило.

Но, возможно, ваша правда. Надо было ковырять Box2dWeb

Отправить комментарий