2016-04-03 34 views
0

aşağıdaki 2 dosya, birinci Fizik/world.js adres:şey gerektiren dosya

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; 

ve 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(); 

     }); 
    } 

} 

sorun olduğunu ikinci dosya bana world.addBody'nin bir işlev olmadığını söyler ancak dünyayı ilk dosyadan dışa aktarır, bu yüzden ne yapıyorum ne yapıyorum ya da ne olduğunu anlamıyorum ne modül.exports anlamıyorum

+0

İlk dosyanın Physics/world.js olduğunu varsayalım mı? Her bölüm için dosya adları burada yardımcı olabilir. –

+0

evet, üzgünüm unuttum. Düzenledim –

+0

Dairesel referanslar görüyorum. Ayrıca - world.js'de initWorld'ü bir parametre olarak "world" ile yapılandırıp pkg_world'de çalışacak şekilde içe aktarın. Dairesel referanslara sahip olmamak ve dünyayı pkg_world'deki param olarak ele almak mantıklı olmaz mıydı? Belki de burada bir şey özlüyorum. –

cevap

0

SorunDairesel bağımlılıklar nedeniyle oluşur ve module.exports diğer modülde kullanılmak üzere yeterince erken ayarlanmadığından. Bunun çok basit bir düzeltme module.exports ve pkg_world.js içinrequire() önce world.jsyılında world beyanı taşımaktır:

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

Başka bir seçenek yerine kadar world.js onun require() erteleme pkg_world.js değiştirmektir senin initWorld() ve setWorld() içeride fonksiyonlar.

İlgili konular