как я могу применить гравитацию к моему игровому объекту в библиотеке 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 вызывается на каждой итерации.

Существует хороший пример источника пламени здесь.

Также помните, что если ваша сила тяжести положительная, ваш объект будет лететь вверх.

Другие вопросы по тегам