如何在nodejs中包含liquidfun物理引擎

我一直在做box2dweb和node.js的游戏。 一切工作都很好,直到我决定改用谷歌的LiquidFun引擎,也是基于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导出任何我需要的function。 有人可以告诉我如何正确导出LiquidFun?

我正在使用Node.js v0.10.35并安装了debugging模块(带“npm install debug”)。 以下是我用来testing在Node.js上运行的liquidfun.js的“Hello LiquidFun”,可以从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脚本传递world对象回到这个模块。 原因是我发现liquidfun.js需要定义variables“world”(这是一个b2World对象),而在我的例子中,我在模块外部创build了“world”,因此必须返回使其工作。 或者,您可以在liquidfun.js模块内创build“world”并将其导出到nodejs脚本。

顺便提一下,设置环境“DEBUG = liquidfun”来查看模拟结果。 在Windows上,input以下内容运行

 set DEBUG=liquidfun & node hello_liquidfun.js