我在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);}
我真的不知道如何为我创建的实体插入名称或ID(最终我可以在每次创建时添加var num++
)。另外,我不知道如何通过id取回我的身体并调用方法.DestroyBody来删除它。
我现在处于使用JavaScript和Objective C的早期阶段,因此为Actionscript制作的方法和文档让我疯狂。
提前致谢。
问题更新:
我找到了一种方法来取回我已经创建的对象,使用这种方式在所有对象中找到我想要的对象:
注意:myBody是全球性的
myBody['enter'+prodNum] = bodyDef;
bodyDef.userData = prodNum;
myBody['enter'+prodNum].id = bodyDef.userData;
prodNum是一个全局变量,每个循环都有一个“++”。有了这个,我可以使用body的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');
}
无法理解为什么会发生这种情况..加上我已经设置了step()函数,它应该每隔x毫秒刷新我的世界......帮助请
答案 0 :(得分: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个单位是半公里,所以这可能不是你想要做的。使用米来表示尺寸,而不是像素。 2000m / s的速度大约是7200km / h或6马赫(作为有史以来最快的飞机参考马赫8,所以这很可能不是你想要的)。请查看此页面以了解其他一些常见问题:http://www.iforce2d.net/b2dtut/gotchas