2014-12-31 3 views
5

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

В 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?

ответ

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 (I Я использую 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», чтобы увидеть смоделированные результаты. В окнах введите следующие значения:

set DEBUG=liquidfun & node hello_liquidfun.js