前のページはこちら
今度はまとめて消去できるremoveAllを扱います。removeAllを扱う事で親子関係や、特定のクラスを取得するregister<T>といったものも同時に学べたのでこちらに記載します。
Contents
ソースコードの変更
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);次のページはこちら