В 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);}

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

Я на ранних стадиях работы с JavaScript и Objective C, поэтому методы и документы, созданные для Actionscript, сводят меня с ума..

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

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

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

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

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

prodNum - это глобальная переменная, в каждом цикле которой есть "++". После этого я могу вернуть свое тело обратно, используя как имя тела body, так и свойство 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');



 }

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

1 ответ

Решение

Функция 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 км / ч или 6 мАч (в качестве справки самый быстрый из когда-либо построенных самолетов справляется с мах 8, так что это также, скорее всего, не то, что вам нужно). Взгляните на эту страницу для некоторых других распространенных ошибок: http://www.iforce2d.net/b2dtut/gotchas

Другие вопросы по тегам