我在对Rect对象应用重力时遇到了问题,我想通过使用body.position tion.y更新代码中Rect的位置来沿Y轴自由下落。下面是我的代码片段:
import 'dart:ui';
import 'package:box2d_flame/box2d.dart';
import 'package:flame/sprite.dart';
import 'package:mimo/mimo-game.dart';
class Mimo {
final MimoGame game;
CircleShape shape;
Body body;
List<Sprite> mimoSprite;
List<Sprite> deadSprite;
double flyingSpriteIndex = 0;
Rect mimoRect;
bool isDead = false;
bool isOffScreen = false;
Mimo(this.game, double x, double y) {
shape = CircleShape(); //build in shape, just set the radius
shape.p.setFrom(Vector2.zero());
shape.radius = .1; //10cm ball
BodyDef bd = BodyDef();
bd.position = new Vector2(x,y);
bd.type = BodyType.DYNAMIC;
body = game.world.createBody(bd);
body.userData = this;
FixtureDef fd = FixtureDef();
fd.restitution = 0.5;
fd.density = 0.05;
fd.friction = 0;
fd.shape = shape;
body.createFixtureFromFixtureDef(fd);
mimoSprite = List();
mimoSprite.add(Sprite('mimo/mimo-1.png'));
mimoSprite.add(Sprite('mimo/mimo-2.png'));
mimoSprite.add(Sprite('mimo/mimo-3.png'));
mimoSprite.add(Sprite('mimo/mimo-4.png'));
mimoSprite.add(Sprite('mimo/mimo-5.png'));
deadSprite = List();
mimoRect = Rect.fromLTWH(body.position.x, body.position.y, game.mimoSize, game.mimoSize);
}
void render(Canvas c) {
mimoSprite[flyingSpriteIndex.toInt()].renderRect(c, mimoRect.inflate(2));
}
void update(double t) {
mimoRect = mimoRect.translate(body.position.x, body.position.y);
}
}在update方法中,我使用mimoRect = mimoRect.translate(body.position.x, body.position.y);行,这样body.position就可以实时更新我的Rect对象。但是什么都不会发生,因为我产生的对象总是固定在一个位置上,不会移动。我决定将body.position.y登录到控制台,并注意到它没有改变。
在我的主类中,我创建了一个世界对象,如下所示:
//Needed for Box2D
static const int WORLD_POOL_SIZE = 100;
static const int WORLD_POOL_CONTAINER_SIZE = 10;
//Main physic object -> our game world
World world;
//Zero vector -> no gravity
final Vector2 _gravity = Vector2(0, 4.0);
Body body;
CircleShape shape;
//Scale to get from rad/s to something in the game, I like the number 5
double sensorScale = 5;
//Draw class
Paint paint;
//Initial acceleration -> no movement as its (0,0)
Vector2 acceleration = Vector2.zero();
MimoGame() {
world = new World.withPool(_gravity,
DefaultWorldPool(WORLD_POOL_SIZE, WORLD_POOL_CONTAINER_SIZE));
initialize();
}你知道我能做些什么吗?
发布于 2020-06-09 01:13:25
您需要在游戏的flame中使用Box2DGame (flame 0.22.0^)类,并且要对其应用重力的对象需要扩展BodyComponent,然后在Box2DGame中创建BodyComponent的一个实例,并使用add函数将其添加到游戏循环中,这将确保每次迭代都会在其上调用update和render。
在火焰源here中有一个很好的例子。
还要记住,如果你的重力是正的,你的物体就会向上飞。
https://stackoverflow.com/questions/61721182
复制相似问题