Search code examples
flameforge2d

how to let SpriteAnimationComponent follow BodyComponent


how to let SpriteAnimationComponent follow BodyComponent, which can fall due to gravity. currently SpriteAnimationComponent still keep in the air, here is my code:

  class Chick extends BodyComponent {
      Vector2 fallPosition;
      SpriteAnimationComponent chick = SpriteAnimationComponent();
    
      Chick({
        this.fallPosition,
      });
    
      final spriteSize = Vector2(32, 34) / 2;
    
      @override
      Future<void> onLoad() async {
        await super.onLoad();
        var spriteData = SpriteAnimationData.sequenced(
            amount: 14, stepTime: 0.1, textureSize: Vector2(32, 34));
        chick = SpriteAnimationComponent.fromFrameData(
            spriteSize, ImageTool.image('chicken.png'), spriteData)
          ..x = fallPosition.x
          ..y = fallPosition.y
          ..anchor = Anchor.center
          ..size = spriteSize;
        await addChild(chick);
      }
    
      @override
      void update(double dt) {
        chick.position = body.position;
        print('body.position ! ${body.position} == $fallPosition}');
        super.update(dt);
      }
    
      @override
      Body createBody() {
        debugMode = true;
    
        final shape = CircleShape()..radius = spriteSize.x / 2;
        var position = fallPosition.clone();
        var worldPosition = viewport.getScreenToWorld(position);
        final fixtureDef = FixtureDef()
          ..shape = shape
          ..restitution = 0.1
          ..density = 0.1
          ..friction = 0.1;
    
        final bodyDef = BodyDef()
          ..userData = this
          ..angularDamping = 0.1
          ..position = worldPosition
          ..type = BodyType.DYNAMIC;
    
        return world.createBody(bodyDef)..createFixture(fixtureDef);
      }
    }

I realize fallPosition, fallPosition, and chick.position has different value, but I dont know how to make this SpriteAnimationComponent follow Body, thanks for any help!


Solution

  • Add the SpriteBodyComponent as a child to the BodyComponent by simply running add, and remove the attempts that you have at synchronizing the positions, this will be done automatically once you have added it as a child.

    To do this you also need to upgrade to a newer version of Flame (preferably v1.4.0 or newer) and a new version of flame_forge2d (> 0.12.3). Do note that addChild has been renamed to add.