2

我正在重写一个使用 easlejs 和 Box2Dweb 制作的游戏,以使用 box2d 的 dart 端口来扑动火焰引擎。我的问题是物体移动真的很慢。重力设置似乎以线性方式进行。

我读到了比例因子等......只是不知道如何将它们联系起来。世界级没有那个,有人可以告诉我一个如何设置初始屏幕到 box2d 世界比率的例子吗?我使用火焰调整大小覆盖获得 screenSize,我想用它来设置比例或任何有效的方法。

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

一个带有圆形或方形下降(正确)的简单屏幕将不胜感激。这是我实例化代码的方式。(我需要对象为 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.setTransform 来增加 position.y 等,但它似乎只是穿过静态物体(地板)。

4

1 回答 1

3

由于正方形的密度为 0,因此不受重力影响,请尝试将其设置为更高的值,看看对象是否受到更大的影响。

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

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

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

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

于 2020-09-15T07:50:27.317 回答