Flutter 上的 Box2D 仿真非常慢

Box2D emulation on flutter painfully slow

我是 re-writing 一款使用 easlejs 和 Box2Dweb 制作的游戏,通过 box2d 的 dart 端口使用 flutter 的火焰引擎。我的问题是 object 移动得非常慢。重力设置似乎以线性方式进行。

我阅读了比例因子等...只是不知道如何link。世界 class 没有那个, 有人可以告诉我如何设置初始屏幕与 box2d 世界比率的示例吗? 我使用 flames resize override 获得了 screenSize 我想用它来设置比例或任何工作。

GitHub 中的示例似乎从来没有使用过它,即使我当时下载了 运行 它们......再次痛苦地缓慢下落的物体。

一个带有圆圈或正方形下落(正确)的简单屏幕将不胜感激。 下面是我如何实例化代码。 (我需要 object 为 80x80 像素)

class MyGame extends Game with TapDetector {
    MyGame() : _world = Box2D.World.withGravity(Box2D.Vector2(0, 10)) {
        _world.setAllowSleep(true);
        spawnBlocks();
    }

    void createSquare(int index, double w, double h, double x, double y) {
        int randomNumber = random.nextInt(letters.length);
        var bodyDef = Box2D.BodyDef();
        bodyDef.type = Box2D.BodyType.DYNAMIC; 
        bodyDef.position = Box2D.Vector2(x - 5, y); 
        bodyDef.angle = 0; 
        dynamicBody = _world.createBody(bodyDef); 
    
        dynamicBody.userData = letters[randomNumber];
        var boxShape = Box2D.PolygonShape();
        boxShape.setAsBox(w / 2, h / 2, Box2D.Vector2(w / 2, -h * 2), 0);

        var boxFixtureDef = Box2D.FixtureDef();
        boxFixtureDef.shape = boxShape;

        boxFixtureDef.density = 0;
        boxFixtureDef.restitution = 0;
        boxFixtureDef.friction = 1;
        dynamicBody.createFixtureFromFixtureDef(boxFixtureDef);

        blocks.add(dynamicBody);
  }

  spawnBlocks() {
      for (var i = 0; i < 8; i++) {
        createSquare(
          i, blockWidth, blockHeight, blockWidth * i + 18, -100 * i.toDouble());
      }
  }
}

无论我将重力设置多高,body 仍然以相同的速度下落。 即使当他们撞到地板时,他们反弹得非常慢,我已经使用 body.setTransform 来增加 position.y 等,但它似乎只是通过静态 body(floor).

由于你方块的密度为 0,因此不受重力影响,尝试将其设置为更高的值,看看物体是否受到更大的影响。

如果你真的不需要,请不要使用 body.setTransform,因为它会破坏世界中的物理设置。

你试过这个例子吗? https://github.com/flame-engine/flame/tree/master/doc/examples/box2d/contact_callbacks

并且不要忘记将 scale 参数添加到你的世界中,否则你会很快达到速度限制,因为你会被缩小。

我是 box2d for flame(现为 Forge2D)的维护者,如果您有更多问题,可以加入我们 discord 的 box2d 频道,我会尽力帮助您。