2014-12-31 18 views
5

के साथ तरल पदार्थ भौतिकी इंजन को कैसे शामिल करें मैं box2dweb और node.js. के साथ एक गेम बना रहा हूं। सब कुछ ठीक काम कर रहा है जब तक कि मैंने Google के LiquidFun इंजन पर स्विच करने का निर्णय लिया, जो कि Box2d पर भी आधारित है।नोडजेस

बॉक्स 2 डीवेब में मैं बॉक्स 2 डी.जेएस फ़ाइल के नीचे निम्नलिखित जोड़कर आवश्यक मॉड्यूल निर्यात कर सकता था।

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

LiquidFun अपने संकलित फ़ाइल में एक ही नेमस्पेसिंग उपयोग नहीं करता है तो मैं करने की कोशिश की:

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

मैं कार्यों की आवश्यकता के किसी भी निर्यात करने के लिए Node.js करने में बिल्कुल भी भाग्य पड़ा है। क्या कोई मुझे बता सकता है कि लिक्विडफन को सही ढंग से कैसे निर्यात किया जाए?

उत्तर

1

मैं नोड.जेएस v0.10.35 का उपयोग कर रहा हूं और डीबग मॉड्यूल स्थापित किया है ("एनपीएम इंस्टॉल डीबग" के साथ)। पीछा कर रहा है "नमस्ते LiquidFun" मैं इस काम करे, इसके liquidfun.js निम्न पंक्तियां जोड़ें बाहर के रूप में 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); 
} 

से अनुकूलित, Node.js पर चल रहा है के रूप में 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 को परिवर्तनीय "दुनिया" को परिभाषित करने की आवश्यकता है (जो एक बी 2 वर्ल्ड ऑब्जेक्ट है), जबकि मेरे उदाहरण में, मैंने मॉड्यूल के बाहर "दुनिया" बनाया है और इसलिए इसे वापस पास किया जाना है इसे काम करने के लिए। वैकल्पिक रूप से, आप liquidfun.js मॉड्यूल के अंदर "दुनिया" बना सकते हैं और nodejs स्क्रिप्ट को निर्यात कर सकते हैं।

वैसे, अनुरूपित परिणामों को देखने के लिए पर्यावरण "DEBUG = liquidfun" सेट करने के लिए याद दिलाया जाए। विंडोज़ पर,

set DEBUG=liquidfun & node hello_liquidfun.js 
चलाने के लिए निम्न टाइप करें