как я могу применить гравитацию к моему игровому объекту в библиотеке Flutters Flame
У меня возникают проблемы с применением силы тяжести к объекту Rect. Я хочу свободно падать по оси Y, обновив позицию Rect в моем коде с помощью body.position.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();
}
Пожалуйста, есть идеи, что я могу сделать?
1 ответ
Вам нужно использовать Box2DGame
(flame 0.22.0^) в пламени для вашей игры, и объект, к которому вы хотите применить гравитацию, должен расширяться BodyComponent
, затем вы создаете экземпляр своего BodyComponent
в вашем Box2DGame
и использовать add
функция, чтобы добавить его в игровой цикл, чтобы убедиться, что update
а также render
вызывается на каждой итерации.
Существует хороший пример источника пламени здесь.
Также помните, что если ваша сила тяжести положительная, ваш объект будет лететь вверх.