前のページはこちら

今度はまとめて消去できるremoveAllを扱います。removeAllを扱う事で親子関係や、特定のクラスを取得するregister<T>といったものも同時に学べたのでこちらに記載します。

ソースコードの変更

your_game.dart書き換えます。circle_man.dartは前回と変更ありません。

your_game.dart

import 'dart:math';
import 'package:flame/game.dart';
import 'circle_man.dart';


class YourGame extends FlameGame {
  int worldCount = 0;

  @override
  Future<void> onLoad() async {
    //CircleManというクラスを登録。
    //登録する事で、addしたCircleManクラスの生成物が取得できる。
    children.register<CircleMan>();
  }

  @override
  void update(double dt) {
    super.update(dt);

    //カウントアップ
    worldCount++;

    //カウント50までランダムに円を生成しまくる
    if (worldCount < 50) {
      //半径、X、Yのランダム値生成
      var randomRadius = Random().nextInt(50) as double;
      var randomX = Random().nextInt(300) as double;
      var randomY = Random().nextInt(300) as double;

      //CircleManを生成する。もうadd関数の中で生成しちゃう。
      add(CircleMan(randomRadius, Vector2(randomX, randomY)));
    }

    //カウント200になったら全部消す
    if (worldCount == 200) {
      //自身の子オブジェクトから「CircleMan」クラスのオブジェクトを抽出
      var allCircleMan = children.query<CircleMan>();
      //抽出したものを全消去
      removeAll(allCircleMan);
    }
  }
}

circle_man.dart(前回と変更なし)

import 'package:flame/components.dart';

class CircleMan extends CircleComponent {
  CircleMan(
    double _radius, //受け取る引数・半径
    Vector2 _pos, //受け取る引数・初期位置
  ) : super(
          radius: _radius, //半径を親クラスに渡す
          position: _pos, //初期位置を親クラスに渡す
        );

  @override
  void onRemove() {
    print("消えろと言われた…");
  }
}

実行

大小様々な円があちこちに出現し、しばらく経つと一斉に消えます。

解説

your_game.dartを解説します。

update内の「if(worldCount < 50)」ブロック

    //カウント50までランダムに円を生成しまくる
    if (worldCount < 50) {
      //半径、X、Yのランダム値生成
      var randomRadius = Random().nextInt(50) as double;
      var randomX = Random().nextInt(300) as double;
      var randomY = Random().nextInt(300) as double;

      //CircleManを生成する。もうadd関数の中で生成しちゃう。
      add(CircleMan(randomRadius, Vector2(randomX, randomY)));
    }

位置や大きさのランダム値を作り、それを引数にしてCircleManを生成しaddしています。

update内の「if(worldCount == 200)」ブロック

    //カウント200になったら全部消す
    if (worldCount == 200) {
      //自身の子オブジェクトから「CircleMan」クラスのオブジェクトを抽出
      var allCircleMan = children.query<CircleMan>();
      //抽出したものを全消去
      removeAll(allCircleMan);
    }

カウントが200になったら自身の子オブジェクトから「CircleMan」クラスのオブジェクトを抽出し全消去する、という処理ですがもう少し掘り下げます。

addと親子関係

YourGameがCircleManクラスのオブジェクトをADDします。

そうすると、Addした側とAddされた側で親子関係が発生します

今回の処理はこのように沢山のCirecleManオブジェクトをADDしたので多数の子供がいる状態となります。

children.queryを使った抽出

今回はCirecleManしかいませんでしたが。実際はこのように様々なクラスのオブジェクトが子となります。

そんな時に、「自身の子からCirecleManクラスのオブジェクトだけを抽出する」コードがこちらです。

      //自身の子オブジェクトから「CircleMan」クラスのオブジェクトを抽出
      var allCircleMan = children.query<CircleMan>();

childrenは自身の子供達が格納されており、queryでクラスを指定する事によりそのオブジェクトを全て取得する事が出来ます。

ただし、これを使うためには、クラスの存在を登録する必要があり、それがonLoadに記載してあるこちらのコードになります。

  @override
  Future<void> onLoad() async {
    //CircleManというクラスを登録。
    //登録する事で、addしたCircleManクラスの生成物が取得できる。
    children.register<CircleMan>();
  }

これでremoveAllが使えます。

removeAll(allCircleMan);