2016-04-03 60 views
0

我有以下2个文件,第一个物理/ world.js:有什么问题,需要在文件

var p2 = require('p2'); 
var pkg_world = require('../redis_pkgs/pkg_world.js'); 

var redisObjectMap = new Array(); // redis_id - world_id 

var world = new p2.World({ 
    gravity:[0,-9.82] 
}); 

//el piso 
var groundShape = new p2.Plane(); 
var groundBody = new p2.Body({ 
    mass:0 
}); 
groundBody.addShape(groundShape); 
world.addBody(groundBody); 

initWorld = pkg_world.initWorld(); //traigo el estado inicial de redis 
initWorld.done(function(){ 
    redisObjectMap = initWorld.valueOf(); 
}); 

var timeStep = 1/60; 
setInterval(function(){ 
    world.step(timeStep); 
    pkg_world.setWorld(world,redisObjectMap); 
/* console.log(world.bodies[0].id); 
    console.log(world.bodies.length);*/ 


},1000 * timeStep); 

module.exports = world; 

和redis_pkgs/pkg_world.js:

var client = require('../redisClient.js'); 
var p2 = require('p2'); 
var world = require('../Physics/world.js'); 
var q = require('q'); 

var D_object = require('../schemas/d_object_schema.js'); 


module.exports = { 

    initWorld: function(){ 
     return q.Promise(function(resolve,reject){ 
      var result = Array(); 
      client.hvals('d_object',function(err,obj){ 
       if(err){ 
        reject(err); 
       }else{ 
        var tmp; 
        obj.forEach(function(o){ 
         tmp = JSON.parse(o); 
         var circleBody = new p2.Body({ 
          mass:5, 
          position:[tmp.position.x,tmp.position.y] 
         }); 
         var circleShape = new p2.Circle({radius:1}); 
         circleBody.addShape(circleShape); 
         world.addBody(circleBody); 
         result[tmp.id] = world.bodies.length; // Mapeo al id del mundo asi despues acutualizo 
        }); 

        resolve(result); 
       } 
      }); 
     }); 
    }, 

    setWorld: function(redisObjectMap){ 
     return q.Promise(function(resolve,reject){ 
      redisObjectMap.forEach(function(world_id){ 
       var object = new D_object({ 
        id:redisObjectMap.indexOf(world_id), 
        position:{ 
         x:world.bodies[world_id].position[0], 
         y:world.bodies[world_id].position[1] 
        } 
       }); 
       console.log(JSON.stringify(object)); 
       client.hset("d_object",object.id,JSON.stringify(object)); 
      }); 

      resolve(); 

     }); 
    } 

} 

的问题是,在第二文件它告诉我,world.addBody不是一个函数,但我从第一个文件中导出世界,这是一个函数,所以我不明白什么即时通讯做错了什么,我是不是从module.exports了解什么是

+0

我们是否假定第一个文件是Physics/world.js?每个部分的文件名可能有帮助。 –

+0

是的,抱歉,我忘了。我编辑它 –

+0

我看到通告参考。另外 - 你在world.js中用“world”作为参数构建initWorld,然后将其导入到pkg_world中。没有循环引用,并在pkg_world中将世界作为该参数是不合理的?也许我在这里错过了一些东西。 –

回答

0

问题既因循环依赖性而存在,又因为module.exports未设置得足够早而不能在其他模块中使用。这样做的一个简单的解决方法是移动module.exportsworld申报world.jsrequire()之前pkg_world.js

var p2 = require('p2'); 
var world = module.exports = new p2.World({ 
    gravity:[0,-9.82] 
}); 
var pkg_world = require('../redis_pkgs/pkg_world.js'); 
// ... 

另一种选择是,而不是修改pkg_world.js它的world.jsrequire()按照您的initWorld()setWorld()内功能。