省エネ

Flutter、vue3修行中。

久々にゲーム作ったので備忘録

こんにちは。
久しぶりにflameを使ってゲーム作ってみました。
とはいえ、こちらのチュートリアルのほぼコピーなのですが、一部そのままだとバグっているところがあったので、直しています。
久々でComponentの作り方から忘れていたので、色々思い出せました。

blog.flutteruniv.com

作ったものはGithub pagesで公開しています。

qkuronekop.github.io

何度かリロードしないと動かないかも。

なおしたのは、壁の当たり判定。

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!』ボタンも出てしまうんですよね。
なんとか大きく変更せずに直せないかと、判定条件をあれこれ模索してみたのですが、結局直せませんでした。

根本的にロジックを変えればいけると思うのですが、修正コードを極力少なくしたいんですよね。
まぁ、解決しなかったんですが。

それでは、次のゲームに取り掛かろうかと思います。