class Ball extends BodyComponent with TapCallbacks {
  Ball({Vector2? initialPosition})
      : super(
    fixtureDefs: [
      FixtureDef(
        CircleShape()..radius = 5,
        restitution: 0.8,
        friction: 0.4,
      ),
    ],
    bodyDef: BodyDef(
      angularDamping: 0.8,
      position: initialPosition ?? Vector2.zero(),
      type: BodyType.dynamic,
    ),
  );
  @override
  void onTapDown(_) {...}
}
class Wall extends BodyComponent {
  final Vector2 _start;
  final Vector2 _end;
  Wall(this._start, this._end);
  @override
  Body createBody() {
    final shape = EdgeShape()..set(_start, _end);
    final fixtureDef = FixtureDef(shape, friction: 0.3);
    final bodyDef = BodyDef(
      position: Vector2.zero(),
    );
    return world.createBody(bodyDef)..createFixture(fixtureDef);
  }
}
上一篇講到這個官方範例,今天再用一次。
可以看到BodyComponent在設計上有兩種策略,一是使用建構子、二是使用「createBody」這個函數。
而在createBody中,可以看到world都有相對相似名稱的函數接口去接收建構子中使用到的參數。
這兩個範例主要使用了兩個參數「fixtureDefs」和「bodyDef」,它們也有自己對應並專屬的物件類別「FixtureDef」和「BodyDef」。
靠著一次介紹了兩種不同類型的BodyComponent和不同的使用方式,我們可以一次了解很多東西...
但其實還不夠多。
比如「BodyType.dynamic」這個參數如果修改成「BodyType.static」,則這個BodyComponent會被固定在初始化時賦予的位置上。
比如範例在「FixtureDef」產生時傳入的第一項參數決定了這個BodyComponent的形裝類別,但有哪些形狀類別可以使用?
比如範例在「FixtureDef」產生時傳入的第二項參數「restitution」決定了這個BodyComponent和其他BodyComponent發生碰撞時的彈力大小,但不知道第三項參數的功用?(調整後看不出差異。)
如果要將一個物體設定為「發生碰撞時不旋轉」,就在BodyDef中設定「fixedRotation = true」。
(慢慢研究剩下的參數有何涵義與功能。)
例外,可以看到Forge2D也提供了「TapCallbacks」,還有「DragCallbacks」,只是沒有在範例中使用。