2014-12-31 9 views
5

Ho fatto un gioco con box2dweb e node.js. Tutto ha funzionato fino a quando non ho deciso di passare al motore di Google LiquidFun, anch'esso basato su Box2d.Come includere il motore fisico Liquidfun con nodejs

In box2dweb, è possibile esportare i moduli necessari aggiungendo quanto segue alla fine del file box2d.js.

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

LiquidFun non usa lo stesso namespacing nel suo file compilato così ho provato:

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

ho avuto fortuna a ottenere node.js per esportare una delle funzioni di cui ho bisogno. Qualcuno potrebbe dirmi come esportare correttamente LiquidFun?

risposta

1

Sto utilizzando Node.js v0.10.35 e ho installato il modulo di debug (con "npm install debug"). Quello che segue è il "Ciao LiquidFun" Ho usato per testare le liquidfun.js come in esecuzione su Node.js, come adattato da 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); 
} 

Per fare questo lavoro, aggiungere le seguenti righe per liquidfun.js (I sto usando v1.1.0) per esportare tutte quelle funzioni di costruzione per il programma di cui sopra:

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

si noti che ho definito un metodo "setWorld (_World)" che viene utilizzato per passare l'oggetto mondo dallo script nodejs indietro in questo modulo. Il motivo è che ho trovato che il file liquidfun.js richiede la definizione della variabile "mondo" (che è un oggetto b2World), mentre nel mio esempio ho creato il "mondo" al di fuori del modulo e quindi deve essere riconsegnato per farlo funzionare. In alternativa, puoi creare il "mondo" all'interno del modulo liquidfun.js ed esportarlo nello script nodejs.

A proposito, ricordarsi di impostare l'ambiente "DEBUG = liquidfun" per vedere i risultati simulati. In Windows, digitare quanto segue per eseguire

set DEBUG=liquidfun & node hello_liquidfun.js 
Problemi correlati