Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 禁用Matter.js中特定对象的重力_Javascript_Matter.js - Fatal编程技术网

Javascript 禁用Matter.js中特定对象的重力

Javascript 禁用Matter.js中特定对象的重力,javascript,matter.js,Javascript,Matter.js,我正在使用Matter.js进行一个项目,在这个项目中,我通常希望启用重力,但我希望能够在特定时间禁用并重新启用单个对象的重力。我不想把那个物体设为静态的,因为我想让物理引擎用其他方式处理它,我只是不想重力影响它 我发现,一般来说,这与禁用重力有关,但正如我所说,我希望重力对大多数物体起作用。有没有一种简单的方法可以做到这一点?这似乎提供了一种反作用力。我不确定200是从哪里来的,它刚刚起作用。也许发动机一个循环计算两次力 playerBody.force.y = -engine.world.g

我正在使用Matter.js进行一个项目,在这个项目中,我通常希望启用重力,但我希望能够在特定时间禁用并重新启用单个对象的重力。我不想把那个物体设为静态的,因为我想让物理引擎用其他方式处理它,我只是不想重力影响它


我发现,一般来说,这与禁用重力有关,但正如我所说,我希望重力对大多数物体起作用。有没有一种简单的方法可以做到这一点?

这似乎提供了一种反作用力。我不确定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;
            }
        };