「如果無法製作一個圓弧型的邊界,那就做一個圓形的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」的參數,結果編譯階段會報錯,硬要轉型會導致程式無法執行。
找到正確的解法花的時間遠遠超過研究其他任何技術細節。