Javascript 禁用Matter.js中特定对象的重力
我正在使用Matter.js进行一个项目,在这个项目中,我通常希望启用重力,但我希望能够在特定时间禁用并重新启用单个对象的重力。我不想把那个物体设为静态的,因为我想让物理引擎用其他方式处理它,我只是不想重力影响它Javascript 禁用Matter.js中特定对象的重力,javascript,matter.js,Javascript,Matter.js,我正在使用Matter.js进行一个项目,在这个项目中,我通常希望启用重力,但我希望能够在特定时间禁用并重新启用单个对象的重力。我不想把那个物体设为静态的,因为我想让物理引擎用其他方式处理它,我只是不想重力影响它 我发现,一般来说,这与禁用重力有关,但正如我所说,我希望重力对大多数物体起作用。有没有一种简单的方法可以做到这一点?这似乎提供了一种反作用力。我不确定200是从哪里来的,它刚刚起作用。也许发动机一个循环计算两次力 playerBody.force.y = -engine.world.g
我发现,一般来说,这与禁用重力有关,但正如我所说,我希望重力对大多数物体起作用。有没有一种简单的方法可以做到这一点?这似乎提供了一种反作用力。我不确定200是从哪里来的,它刚刚起作用。也许发动机一个循环计算两次力
playerBody.force.y = -engine.world.gravity.y / 200;
你必须每一个周期运行一次,以保持其正常运行。禁用内置重力,然后有选择地应用你自己的重力,类似这样,但只过滤你想要的身体:
engine.world.gravity.scale = 0;
Events.on(engine, 'beforeUpdate', function() {
var bodies = Composite.allBodies(engine.world);
for (var i = 0; i < bodies.length; i++) {
var body = bodies[i];
if (body.isStatic || body.isSleeping)
continue;
body.force.y += body.mass * 0.001;
}
});
engine.world.gravity.scale=0;
on(引擎“beforeUpdate”函数(){
var Bodys=复合.allbodys(engine.world);
对于(变量i=0;i
这里是一个简单的代码片段,您可以通过打开/关闭来完成您的要求(其中,body
是应该忽略重力的对象,noGravity
是一个布尔值,可以通过切换来打开和关闭它):
我知道这是个老问题,但现在你可以用这个:
body.ignoreGravity=true;
有一个正式的工作示例
this.matter.add.image(100, 100, 'block').setIgnoreGravity(true);
在我的例子中,我想要一个对象跟随鼠标。设置
isStatic:true
使重力不适用于让我完全控制对象的位置。我发现这很容易实现。只需寻找引擎。_body在Matter源代码中应用重力函数,然后只需设置排除某个body所需的任何条件
Engine._bodiesApplyGravity = function (bodies, gravity) {
var gravityScale = typeof gravity.scale !== 'undefined' ? gravity.scale : 0.001;
if ((gravity.x === 0 && gravity.y === 0) || gravityScale === 0) {
return;
}
for (var i = 0; i < bodies.length; i++) {
var body = bodies[i];
// I just added body.ignoreGravity
if (body.isStatic || body.isSleeping || body.ignoreGravity)
continue;
// apply gravity
body.force.y += body.mass * gravity.y * gravityScale;
body.force.x += body.mass * gravity.x * gravityScale;
}
};
Engine.\u body应用重力=功能(body,重力){
var gravityScale=typeof gravity.scale!=“未定义”?gravity.scale:0.001;
if((重力.x==0&&gravity.y==0)| |重力刻度==0){
返回;
}
对于(变量i=0;i
能否将对象加载到主世界中包含的新世界中?从快速浏览API来看,这似乎是唯一一个非常有用的答案,谢谢。修正了我的问题。这只会让我的身体在一个地方旋转。“救命?”SamSverko,我也是。将{x:0,y:0}
替换为主体。定位
以进行修复。(@Derek你能更新答案吗?)从哪个版本开始?结果我错了,这是一个特定于Phaser的功能,Matter.js不直接支持。移相器!=要紧
Engine._bodiesApplyGravity = function (bodies, gravity) {
var gravityScale = typeof gravity.scale !== 'undefined' ? gravity.scale : 0.001;
if ((gravity.x === 0 && gravity.y === 0) || gravityScale === 0) {
return;
}
for (var i = 0; i < bodies.length; i++) {
var body = bodies[i];
// I just added body.ignoreGravity
if (body.isStatic || body.isSleeping || body.ignoreGravity)
continue;
// apply gravity
body.force.y += body.mass * gravity.y * gravityScale;
body.force.x += body.mass * gravity.x * gravityScale;
}
};