Как включить физический движок Liquidfun с nodejs

Я делаю игру с помощью box2dweb и узел.js. Все работало нормально, пока я не решил перейти на LiquidFun от Google., который также основан на Box2d.

В box2dweb я мог экспортировать нужные мне модули, добавив следующее в конец файла box2d.js.

module.exports = {
  b2Vec2: Box2D.Common.Math.b2Vec2,
  b2BodyDef: Box2D.Dynamics.b2BodyDef,
  b2Body: Box2D.Dynamics.b2Body
};

LiquidFun не использует то же самое пространство имен в своем скомпилированном файле, поэтому я попробовал:

module.exports = {
  b2Vec2,
  b2BodyDef,
  b2Body
};

Мне не повезло заставить node.js экспортировать любую из нужных мне функций. Подскажите, пожалуйста, как правильно экспортировать LiquidFun?


person two70    schedule 31.12.2014    source источник


Ответы (1)


Я использую Node.js v0.10.35 и установил модуль отладки (с помощью «npm install debug»). Ниже приведено «Hello LiquidFun», которое я использовал для тестирования Liquidfun.js как работающего на Node.js, адаптированного из https://google.github.io/liquidfun/Programmers-Guide/html/.md__chapter02__hello__box2_d.html

var lf=require('./liquidfun.js');
var debug=require('debug')('liquidfun');

var gravity = new lf.b2Vec2(0,-10);
var world = new lf.b2World(gravity);
lf.setWorld(world);
var groundBodyDef = new lf.b2BodyDef();
groundBodyDef.position.Set(0,-10);
var groundBody = world.CreateBody(groundBodyDef);
var groundBox = new lf.b2PolygonShape();
groundBox.SetAsBoxXY(50,10);
groundBody.CreateFixtureFromShape(groundBox,0);


var bodyDef = new lf.b2BodyDef();
bodyDef.type= lf.b2_dynamicBody;
bodyDef.position.Set(0,4);
var body=world.CreateBody(bodyDef);

var dynamicBox = new lf.b2PolygonShape;
dynamicBox.SetAsBoxXY(1,1);

fixtureDef = new lf.b2FixtureDef;
fixtureDef.shape = dynamicBox;
fixtureDef.density = 1;
fixtureDef.friction=0.3;
fixtureDef.restitution=0.5;

body.CreateFixtureFromDef(fixtureDef);
var timeStep=1/60;
var velocityIterations=6;
var positionIteration=2;

for (var i=0;i<60;i++)
{   world.Step(timeStep, velocityIterations, positionIteration);
    var position = body.GetPosition();
    var angle = body.GetAngle();
    debug(position.x+" "+position.y+" "+angle);
}

Чтобы это работало, добавьте следующие строки в Liquidfun.js (я использую v1.1.0), чтобы экспортировать все эти функции конструктора в указанную выше программу:

module.exports = {
    b2Vec2: b2Vec2,
    b2BodyDef: b2BodyDef,
    b2PolygonShape: b2PolygonShape,
    b2FixtureDef: b2FixtureDef,
    b2World: b2World,
    b2_dynamicBody: b2_dynamicBody,
    setWorld: function(_world){ world=_world;   }
};

Обратите внимание, что я определил метод «setWorld(_world)», который используется для передачи объекта мира из скрипта nodejs обратно в этот модуль. Причина в том, что я обнаружил, что Liquidfun.js требует определения переменной «мир» (которая является объектом b2World), в то время как в моем примере я создал «мир» вне модуля и, следовательно, должен быть передан обратно в чтобы заставить его работать. В качестве альтернативы вы можете создать «мир» внутри модуля Liquidfun.js и экспортировать его в скрипт nodejs.

Кстати, не забудьте установить среду «DEBUG=liquidfun», чтобы увидеть смоделированные результаты. В Windows введите следующее для запуска

set DEBUG=liquidfun & node hello_liquidfun.js
person Clifford Choy    schedule 02.03.2015