こんにちは。
久しぶりにflameを使ってゲーム作ってみました。
とはいえ、こちらのチュートリアルのほぼコピーなのですが、一部そのままだとバグっているところがあったので、直しています。
久々でComponentの作り方から忘れていたので、色々思い出せました。
作ったものはGithub pagesで公開しています。
何度かリロードしないと動かないかも。
なおしたのは、壁の当たり判定。
ball.dart void onCollision(Set<Vector2> intersectionPoints, PositionComponent other) { if (other is ScreenHitbox) { final screenHitBoxRect = other.toAbsoluteRect(); for (final point in intersectionPoints) { if (point.x == screenHitBoxRect.left && !isCollidedScreenHitBoxX) { velocity.x = -velocity.x; isCollidedScreenHitBoxX = true; } if (point.x.toInt() == screenHitBoxRect.right.toInt() && !isCollidedScreenHitBoxX) { velocity.x = -velocity.x; isCollidedScreenHitBoxX = true; } if (point.y == screenHitBoxRect.top && !isCollidedScreenHitBoxY) { velocity.y = -velocity.y; isCollidedScreenHitBoxY = true; } if (point.y.toInt() == screenHitBoxRect.bottom.toInt() && !isCollidedScreenHitBoxY) { removeFromParent(); } } super.onCollision(intersectionPoints, other); } }
壁の右端と下部の境界がイコールなら壁にあたったものとするという判定をdoubleのままでしていたのですが、小数点以下で微妙に値が違っていて、if文をすり抜けてしまいました。
なので、intに直してから判定しています。
もう一つはここです。
my_text_button.dart MyTextButton(String text, {required this.onTapDownMyTextButton, required this.renderMyTextButton}) : super( text: text, size: Vector2(300, 60), anchor: Anchor.centerLeft, );
anchor: Anchor.center
だと、テキストに枠をつけると左にずれていってしまうのでcenterLeftにしました。
実はもう一つバグっているところがあったのですが、それは直せませんでした。
いけてる解決方法があったら教えて欲しいです。
GameOverなると、『GameOver』ボタンが出てくるのですが、そのボタンを押すと一旦ブロックを全消しします。
isClearedの判定条件が、ブロックが全部なくなることなのでそのタイミングで『Clear!』ボタンも出てしまうんですよね。
なんとか大きく変更せずに直せないかと、判定条件をあれこれ模索してみたのですが、結局直せませんでした。
根本的にロジックを変えればいけると思うのですが、修正コードを極力少なくしたいんですよね。
まぁ、解決しなかったんですが。
それでは、次のゲームに取り掛かろうかと思います。