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 频道,我会尽力帮助您。
我是 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 频道,我会尽力帮助您。