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

标签 javascript node.js box2dweb liquidfun

我一直在用 box2dweb 制作游戏和 node.js。在我决定切换到 Google 的 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 导出我需要的任何功能。有人可以告诉我如何正确导出 LiquidFun 吗?

最佳答案

我正在使用 Node.js v0.10.35 并安装了调试模块(使用“npm install debug”)。以下是我用来测试在 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 脚本传回此模块。原因是我发现 liquidfun.js 需要定义变量“world”(这是一个 b2World 对象),而在我的示例中,我在模块外部创建了“world”,因此必须传回让它工作。或者,您可以在 liquidfun.js 模块中创建“世界”并将其导出到 nodejs 脚本。

顺便提醒一下,设置环境“DEBUG=liquidfun”才能看到模拟结果。在 Windows 上,键入以下命令运行

set DEBUG=liquidfun & node hello_liquidfun.js

关于javascript - 如何在 nodejs 中包含 liquidfun 物理引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715782/

相关文章:

javascript - 在 viewConfig 属性的 getRowClass 中分配颜色代码后,背景颜色不会改变

javascript - 我有 3 个按钮,每个按钮都有一个 JavaScript 函数,但只有一个按钮在工作

javascript - 如何在 Typescript 项目中使用 chakramjs?

javascript - Box2DWeb b2EdgeShape

javascript - 评估 'this.batman()' 时,未定义不是一个函数

javascript - 跨域postMessage,识别iFrame

javascript - 在新窗口中发布会出现空白页面(jquery)

javascript - 设置输入值而不是 sendKeys() - Selenium WebDriver nodejs

javascript - node.js 中的 http 请求

javascript - IE10 延迟呈现用于快速定位更改