В 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