iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Mobile Development

用Flutter Flame做遊戲!Live!系列 第 23

將多個Component連結起來的Joint

  • 分享至 

  • xImage
  •  

「如果無法製作一個圓弧型的邊界,那就做一個圓形的BodyComponent,將其他BodyComponent包在裡面吧!」

這個想法很簡單,但實際上不可行。(雖然可以在BodyComponent內執行添加Component的動作,但終究是包含在外面的World,而不是這個BodyComponent內。)

「如果要製作功能,推薦使用Joint。」
好吧!那就來研究怎麼使用Joint吧!(「教練,我想做Canvas繪圖。」)



@override
  Future<void> onLoad() async {
    await super.onLoad();

    camera.viewport.add(FpsTextComponent());
    Ball ball0 = Ball(initialPosition: Vector2(2, -4), radius: BaseRound.SmallRadius, paintType: 0);
    Ball ball1 = Ball(initialPosition: Vector2(2, 0), radius: BaseRound.SmallRadius, paintType: 1);
    Ball ball2 = Ball(initialPosition: Vector2(2, 4), radius: BaseRound.SmallRadius, paintType: 2);
    world.add(ball0!);
    world.add(ball1!);
    world.add(ball2!);

    world.addAll(createBoundaries());

    await Future.wait([
      ball0.onLoad(),
      ball1.onLoad(),
      ball2.onLoad(),
    ]);

    // Create a revolute joint between the two balls
    final constantVolumeJoint = ConstantVolumeJointDef()
      ..frequencyHz = 10
      ..dampingRatio = 0.8;

    constantVolumeJoint.addBody(ball0.body);
    constantVolumeJoint.addBody(ball1.body);
    constantVolumeJoint.addBody(ball2.body);

    world.createJoint(ConstantVolumeJoint(world.physicsWorld, constantVolumeJoint));

    world.gravity = Vector2(10, 0);
  }

這樣就把三個Ball串連起來了!

中間有個小插曲就是...


world.createJoint(ConstantVolumeJoint(world.physicsWorld, constantVolumeJoint));

不管是官方範例還是AI copilot,都是直接使用「world」當「ConstantVolumeJoint」的參數,結果編譯階段會報錯,硬要轉型會導致程式無法執行。
找到正確的解法花的時間遠遠超過研究其他任何技術細節。


上一篇
不規則的牆(Wall:BodyComponent)
下一篇
繼續講Joint...來做一輛「車子」吧!
系列文
用Flutter Flame做遊戲!Live!26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言