2014-06-13 2 views
0

Я создаю тело на кнопку мыши с этим довольно стандартным образом box2dweb:В box2dweb как уничтожить созданный орган

*stage.onMouseDown = function(){ 
    var fixDef = new box2d.b2FixtureDef; 
    fixDef.density = 1; 
    fixDef.friction = 0.5; 
    fixDef.restitution = 0.7; 
    var bodyDef = new box2d.b2BodyDef(); 
    bodyDef.type = box2d.b2Body.b2_dynamicBody; 
    bodyDef.position.x = mouseX /scale; 
    bodyDef.position.y = mouseY /scale; 
    fixDef.shape = new box2d.b2CircleShape(Math.random()*100/scale); 
    world.CreateBody(bodyDef).CreateFixture(fixDef);} 

Я действительно не знаю, как вставить имя или идентификатор для моих созданных органов (в конце концов я могу добавить var num++ при каждом создании). Кроме того, я не знаю, как вернуть свое тело через id и вызвать метод .DestroyBody для его удаления.

Я на ранних стадиях с JavaScript и Objective C, так методы и документы, сделанные для Actionscript сделать меня с ума ..

Заранее спасибо.

обновление Вопроса:

Я нашел способ, чтобы получить обратно уже созданный объект, найти тот, я хочу среди всех из них, используя этот путь:

Примечание: myBody глобален

 myBody['enter'+prodNum] = bodyDef; 
     bodyDef.userData = prodNum; 
     myBody['enter'+prodNum].id = bodyDef.userData; 

prodNum - это глобальный var, который имеет «++» в каждом цикле. С этим я могу вспомнить свое тело назад, используя имя дерева var и свойство bodyDef.userData.

со следующей функцией, вызываемой в моей init(), которая выполняется через window.onload, я могу, как показывает console.log, изменить то, что хочу от моего извлеченного тела, однако никаких изменений не применяется к телу в холсте , даже если его свойство в журнале было изменено, я не могу заметить никаких изменений на экране.

function reduceObj(){ 

    var itsMe; 

       itsMe = myBody.enter10; 

     var newPosX = itsMe.position.x; 

     itsMe.active = false; 
     itsMe.awake = true; 
     itsMe.linearVelocity.x = 2000; 
     itsMe.position.x = newPosX+500; 
     itsMe.fixedRotation=true; 
     itsMe.allowSleep=true; 


     console.log(myBody.enter10,itsMe,itsMe.id,'it s me'); 



} 

не удается получить, почему все это происходит .. плюс я уже установлен ступенчатую функцию(), который должен обновить мой мир каждый х миллисекунды ... Помогите пожалуйста

ответ

0

Функция CreateBody должна возвращать ссылку вы можете держать, чтобы разрушить тело позже.

var mybody = CreateBody(bodyDef); 
mybody.CreateFixture(fixDef); 

Вы не можете просто установить свойства в теле, чтобы изменить его, необходимо использовать соответствующие функции:

// later... 
mybody.SetActive(false); 
mybody.SetAwake(true); 

var vel = mybody.GetLinearVelocity(); 
vel.x = 2000; 
mybody.SetLinearVelocity(vel); 

var pos = mybody.GetPosition(); 
pos.x += 500; 
mybody.SetPosition(pos); 

mybody.SetFixedRotation(true); 
mybody.SetSleepingAllowed(true); 

Пожалуйста, имейте в виду, что 500 единиц составляет полкилометра, так что вероятно, не то, что вы хотели бы делать. Используйте измерители для ваших измерений, а не пикселей. Скорость 2000 м/с составляет около 7200 км/ч или mach 6 (в качестве ссылки самый быстрый самолет, когда-либо построенный, делает около mach 8, так что это, скорее всего, не то, что вы хотите). Посмотрите на этой странице для некоторых других распространенных подводных камней: http://www.iforce2d.net/b2dtut/gotchas

+0

Я мог бы добиться успеха в своем намерении делать: Var myBody = world.CreateBody (bodyDef) .CreateFixture (FixDef) , но я не совсем уверен, что это лучший способ; var mybody = CreateBody (bodyDef) только, не инициализирует объект, и я не смог его напомнить как: world.myBody. В любом случае, этот способ работает, и теперь я думаю, что я буду лучше понимать, как работает эта система, спасибо большое – user3190749

+0

Но CreateFixture возвращает прибор ... вам нужно сделать CreateBody и сохранить результат этого. Затем вы можете сделать CreateFixture позже. Я добавил строку в ответе выше. – iforce2d

+0

большое спасибо, он отлично работает XD – user3190749

Смежные вопросы