没有重力的小JavaScript Box2D程序会让物体移动。。。为什么?
我有一个小的Box2D东西(使用box2dweb.js),但是尽管将重力设置为(0,0),并且没有对任何对象施加力/脉冲,但当我开始绘制循环时,场景中唯一的动态形状会移动。我不知道为什么 有人知道为什么击球后“球”会移动吗 相关代码位为:没有重力的小JavaScript Box2D程序会让物体移动。。。为什么?,javascript,box2d,Javascript,Box2d,我有一个小的Box2D东西(使用box2dweb.js),但是尽管将重力设置为(0,0),并且没有对任何对象施加力/脉冲,但当我开始绘制循环时,场景中唯一的动态形状会移动。我不知道为什么 有人知道为什么击球后“球”会移动吗 相关代码位为: // shortcut aliasses var d = Box2D.Dynamics, v = Box2D.Common.Math, s = Box2D.Collision.Shapes; var ball, gravity = n
// shortcut aliasses
var d = Box2D.Dynamics,
v = Box2D.Common.Math,
s = Box2D.Collision.Shapes;
var ball,
gravity = new v.b2Vec2(0,0);
world = new d.b2World(gravity, true);
// setup the world box
var setupWorldBox = function(worldbox) {
var fixDef = new d.b2FixtureDef;
fixDef.density = 0;
fixDef.friction = 0;
fixDef.restitution = 0;
var bodyDef = new d.b2BodyDef;
bodyDef.type = d.b2Body.b2_staticBody;
bodyDef.position.x = worldbox.width/2;
bodyDef.position.y = worldbox.height/2;
fixDef.shape = new s.b2PolygonShape;
fixDef.shape.SetAsBox(worldbox.width/2, worldbox.height/2);
world.CreateBody(bodyDef).CreateFixture(fixDef);
}
// draw loop
var drawFrame = function() {
world.Step(1/60,10,10);
world.ClearForces();
ball.update(); // only updates the ball's DOM element position
requestAnimFrame(drawFrame);
};
// start the game
function start() {
var worldParent = document.querySelector("#world");
setupWorldBox(worldParent.getBoundingClientRect());
ball = new Ball(worldParent, document.querySelector(".ball"), d,v,s, world);
drawFrame();
}
对于主体,定义“球”的代码如下:
据我所知,这两段代码都没有引入力,所以如果有人知道球的坐标为什么会改变,请告诉我,这样我就可以把它变成有用的东西,而不是令人困惑的东西=)事实证明,我的代码创造了一个像游戏世界一样的实体,这意味着Box2D试图执行碰撞解析,因为“球”位于另一个实体对象内 解决方案(基于box2dweb API调用,但使用box2dweb API调用)如下:
// setup the world box
var setupWorldBox = function(worldbox) {
var worldAABB = new Box2D.Collision.b2AABB;
worldAABB.lowerBound.Set(0,0);
worldAABB.upperBound.Set(worldbox.width, worldbox.height);
var gravity = new b2Vec2(0, 0);
var doSleep = true;
var world = new b2World(worldAABB, gravity, doSleep);
[....]
}
// setup the world box
var setupWorldBox = function(worldbox) {
var worldAABB = new Box2D.Collision.b2AABB;
worldAABB.lowerBound.Set(0,0);
worldAABB.upperBound.Set(worldbox.width, worldbox.height);
var gravity = new b2Vec2(0, 0);
var doSleep = true;
var world = new b2World(worldAABB, gravity, doSleep);
[....]
}