5

box2dwebと node.jsでゲームを作っています。これも Box2d に基づいているGoogle のLiquidFunエンジンに切り替えることにするまで、すべてがうまく機能していました。

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 を適切にエクスポートする方法を教えてください。

4

1 に答える 1

1

Node.js v0.10.35 を使用しており、デバッグ モジュールをインストールしました (「npm install debug」を使用)。以下は、 https://google.github.io/liquidfun/Programmers-Guide/html/md__chapter02__hello__box2_d.htmlから適応した、Node.jsで実行されているliquidfun.jsをテストするために使用した「Hello LiquidFun」です。

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;   }
};

nodejs スクリプトからこのモジュールにワールド オブジェクトを渡すために使用するメソッド「setWorld(_world)」を定義したことに注意してください。その理由は、liquidfun.js では変数 "world" (b2World オブジェクト) を定義する必要があることがわかりましたが、私の例では、モジュールの外側で "world" を作成したため、モジュールに戻す必要があります。それを機能させるために。または、liquidfun.js モジュール内に「世界」を作成し、それを nodejs スクリプトにエクスポートすることもできます。

ちなみに、シミュレーション結果を見るには環境を「DEBUG=liquidfun」に設定してください。Windows では、次のように入力して実行します

set DEBUG=liquidfun & node hello_liquidfun.js
于 2015-03-02T04:04:34.780 に答える