2014-12-31 11 views
5

Robiłem grę z box2dweb i node.js. Wszystko działa dobrze, dopóki nie zdecydowałem się na przejście na silnik Google LiquidFun, który jest również oparty na Box2d.Jak dołączyć silnik fizyki płynów z nodejs

W box2dweb mogłem wyeksportować potrzebne moduły, dodając poniższe na dole pliku box2d.js.

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

LiquidFun nie używać tej samej przestrzeni nazw w skompilowanego pliku więc próbowałem:

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

nie miałem szczęścia w coraz node.js eksportować dowolnej funkcji potrzebne. Czy ktoś mógłby mi powiedzieć, jak prawidłowo eksportować LiquidFun?

Odpowiedz

1

Używam Node.js v0.10.35 i zainstalowałem moduł debugowania (z "npm install debug"). Poniżej znajduje się „Hello LiquidFun” Kiedyś przetestować liquidfun.js jak działa na node.js, jak adaptacja 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); 
} 

Aby dokonać tej pracy, należy dodać następujące linie do liquidfun.js (I używam v1.1.0), aby wyeksportować wszystkie te funkcje konstruktora powyższego programu:

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

pamiętać, że nie zdefiniowano metodę „setWorld (_world)”, który jest używany do przekazywania obiektu świat z nodejs skryptu z powrotem do tego modułu. Powodem jest to, że znalazłem plik liquidfun.js wymagający zdefiniowania zmiennej "world" (która jest obiektem b2World), podczas gdy w moim przykładzie stworzyłem "świat" poza modułem i dlatego musi zostać zwrócony w aby to działało. Alternatywnie możesz utworzyć "świat" w module liquidfun.js i wyeksportować go do skryptu nodejs.

Przy okazji, pamiętaj, aby ustawić środowisko "DEBUG = liquidfun", aby zobaczyć symulowane wyniki. W systemie Windows wpisz następujące polecenie, aby uruchomić

set DEBUG=liquidfun & node hello_liquidfun.js