Flutterアプリケーション開発概論

イベントモーダルを作ってみよう

16人生ゲームを作る。サイコロ処理・イベント分岐・プレイヤー管理・データ設計・アニメーション
FlutteriOSAndroidMacOSWindows基礎から学ぶ開発アプリ開発

忙しい方はここだけ見て

この章で見る大事な場所は、ここです。

Future<void> _showLifeEventModal({
  required String title,
  required String categoryLabel,
  required String subtitle,
  required String description,
  required IconData icon,
  required Color accentColor,
  int? cashChange,
}) async {
  setState(() {
    _phase = GamePhase.showingModal;
  });

  await showDialog<void>(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text(title),
        content: Text(description),
      );
    },
  );
}

イベントモーダルは、簡単に言うと「画面の上に出る説明カード」です。

給料マスに止まった
↓
給料の説明モーダルを出す

税金マスに止まった
↓
支払いの説明モーダルを出す

イベントマスに止まった
↓
ランダムイベントの説明モーダルを出す

まずは、こう覚えればOKです。

_showLifeEventModal()
=
イベント内容を画面に分かりやすく表示する関数

この章でやること

この章では、給料・税金・イベント・通行料などを、画面に分かりやすく表示する「イベントモーダル」を見ていきます。

ゲームでは、何かが起きたときに、すぐ画面で伝えることが大事です。

何が起きたのか
誰に起きたのか
お金が増えたのか
お金が減ったのか
次に何をすればよいのか

これを伝える役割が、イベントモーダルです。


今日のゴール

この章のゴールは、次の3つです。

1. _showLifeEventModal() がイベント表示用の関数だと分かる
2. showDialog() で画面上にモーダルを出していると分かる
3. title・description・cashChange を変えると表示内容が変わると分かる

難しいUIの細かい仕組みは、全部覚えなくて大丈夫です。

まずは「モーダルはイベント説明カード」と考えましょう。


Step 1:イベントモーダルとは?

イベントモーダルとは、画面の上に重なって表示される案内画面です。

例えば、ゲーム中にこのような内容を表示します。

初任給
+500

仕事の成果として給料を受け取りました。

または、

税金・支払い
-250

収入が増えると、税金や固定費も発生します。

プレイヤーに「今、何が起きたか」を伝えるための画面です。


Step 2:_showLifeEventModal()を探す

lib/main.dart を開きます。

検索で、次の文字を探してください。

_showLifeEventModal

このような関数があります。

Future<void> _showLifeEventModal({
  required String title,
  required String categoryLabel,
  required String subtitle,
  required String description,
  required IconData icon,
  required Color accentColor,
  int? cashChange,
}) async {
  setState(() {
    _phase = GamePhase.showingModal;
  });

  await showDialog<void>(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text(title),
        content: Text(description),
      );
    },
  );
}

実際のコードでは、もっとデザインが入っています。

ただし、中心はこの部分です。

await showDialog<void>(
  context: context,
  builder: (BuildContext context) {
    return AlertDialog(...);
  },
);

Step 3:showDialog()とは?

showDialog() は、Flutterでモーダルを表示するための関数です。

showDialog<void>(
  context: context,
  builder: (BuildContext context) {
    return AlertDialog(...);
  },
);

簡単に言うと、

画面の上に、別の小さな画面を出す

ためのものです。

確認画面、警告画面、イベント説明画面などでよく使います。


Step 4:AlertDialogとは?

AlertDialog は、Flutterで用意されているダイアログ用の部品です。

AlertDialog(
  title: Text(title),
  content: Text(description),
)

意味はこうです。

項目意味
title上に表示するタイトル
content中に表示する本文

今回のゲームでは、イベントの説明を見せるために使っています。


Step 5:引数を確認しよう

_showLifeEventModal() には、いろいろな情報を渡しています。

required String title,
required String categoryLabel,
required String subtitle,
required String description,
required IconData icon,
required Color accentColor,
int? cashChange,

意味はこちらです。

引数意味
titleイベント名
categoryLabelイベントの種類
subtitle年齢やステージ
description説明文
icon表示するアイコン
accentColor強調色
cashChangeお金の増減

全部を一気に覚えなくてOKです。

最初は、titledescriptioncashChange を見れば大丈夫です。


Step 6:給料マスでの使い方

給料マスでは、イベントモーダルをこのように呼び出しています。

await _showLifeEventModal(
  title: tile.label,
  categoryLabel: 'PAYDAY',
  subtitle: '${tile.age}歳|${tile.stage}',
  description: tile.description,
  icon: Icons.payments,
  accentColor: AppColors.green,
  cashChange: 500,
);

意味はこうです。

タイトル:マスの名前
種類:PAYDAY
説明文:マスの説明
アイコン:支払いアイコン
色:緑
お金:+500

給料なので、緑色でプラス表示にしています。


Step 7:税金マスでの使い方

税金マスでは、こう使っています。

await _showLifeEventModal(
  title: tile.label,
  categoryLabel: 'TAX',
  subtitle: '${tile.age}歳|${tile.stage}',
  description: tile.description,
  icon: Icons.receipt_long,
  accentColor: AppColors.red,
  cashChange: -250,
);

意味はこうです。

タイトル:税金・支払い
種類:TAX
説明文:税金や固定費の説明
アイコン:領収書アイコン
色:赤
お金:-250

お金が減るので、cashChange はマイナスです。


Step 8:イベントマスでの使い方

ランダムイベントでは、イベントデータを使って表示しています。

await _showLifeEventModal(
  title: event.title,
  categoryLabel: _eventCategoryLabel(event.category),
  subtitle: '${tile.age}歳|${tile.stage}',
  description: event.description,
  icon: _eventCategoryIcon(event.category),
  accentColor: eventColor,
  cashChange: event.cashChange,
);

ここでは、イベントごとに表示内容が変わります。

event.title
↓
イベント名

event.description
↓
イベント説明文

event.cashChange
↓
お金の増減

つまり、_createEventPool() にイベントを追加すると、モーダルの内容も変わります。


Step 9:cashChangeはあってもなくてもよい

cashChange は、このように書かれています。

int? cashChange,

? がついています。

これは、

あってもよい
なくてもよい

という意味です。

給料や税金のように、お金が変わる場合は使います。

cashChange: 500,

通常マスのように、お金が変わらない場合は、書かなくてもOKです。


Step 10:cashChangeの表示を考える

モーダルの中では、cashChange がある場合だけ金額を表示できます。

イメージとしては、こうです。

if (cashChange != null) {
  Text(
    cashChange >= 0 ? '+$cashChange' : '$cashChange',
  );
}

意味はこうです。

cashChange がある
↓
金額を表示する

0以上
↓
+500 のように表示する

0より小さい
↓
-250 のように表示する

これで、収入と出費が分かりやすくなります。


Step 11:_phaseをshowingModalにする理由

モーダルを表示する前に、この処理があります。

setState(() {
  _phase = GamePhase.showingModal;
});

これは、

今はイベント画面を表示中です

という状態にするためです。

この状態にしておくと、モーダル表示中に何度もサイコロを押せないようにできます。


Step 12:モーダルを閉じたあとは?

モーダルを閉じたあとは、元の処理に戻ります。

例えば、給料マスではこの流れです。

イベントモーダルを表示
↓
ユーザーが閉じる
↓
お金を増やす
↓
ログを追加
↓
次のプレイヤーへ

コードでは、このようになっています。

await _showLifeEventModal(...);

_addCashToCurrentPlayer(500);
_addLog('...');
_moveToNextPlayer();

await があるので、モーダルを閉じるまで次の処理に進みません。


Step 13:awaitの役割

ここで大事なのが、await です。

await _showLifeEventModal(...);

これは、

モーダルが閉じるまで待つ

という意味です。

もし await がないと、モーダルを表示しながら、次の処理もすぐ進んでしまう可能性があります。

初心者のうちは、

await = 終わるまで待つ

と覚えればOKです。


Step 14:表示文章を変えてみよう

まずは、給料マスのタイトルや説明を変えるのが簡単です。

_createTiles() の中にある給料マスを探します。

BoardTile(
  index: 4,
  age: 25,
  stage: '初任給・収入期',
  label: '初任給',
  description: '仕事の成果として給料を受け取ります。現金が増え、次の選択肢が広がります。',
  type: TileType.payday,
),

例えば、こう変えます。

label: 'はじめての給料',
description: '初めての給料を受け取りました。少しだけ大人になった気がします。',

すると、モーダルの表示内容も変わります。


Step 15:色を変えてみよう

モーダルの強調色は、accentColor で変えられます。

給料マスは、もともと緑です。

accentColor: AppColors.green,

例えば、金色にしたい場合です。

accentColor: AppColors.gold,

ただし、色を変えすぎると意味が分かりにくくなることがあります。

おすすめはこのような使い分けです。

内容
収入AppColors.green
出費・税金AppColors.red
物件AppColors.gold
通行料AppColors.orange
ゴールAppColors.red

色には意味を持たせると、画面が分かりやすくなります。


触ってみよう

今回は、給料マスの表示文を変えてみましょう。

変更前です。

label: '初任給',
description: '仕事の成果として給料を受け取ります。現金が増え、次の選択肢が広がります。',

変更後です。

label: 'はじめての給料',
description: '初めての給料を受け取りました。使い道を考えるだけで、少しワクワクします。',

保存して、給料マスに止まったときのモーダル表示を確認します。

画面に「はじめての給料」と表示されたら成功です。


もう1つ触ってみよう

税金マスの説明も少しやさしくしてみます。

変更前です。

label: '税金・支払い',
description: '収入が増えると、税金や固定費も発生します。現金が減ります。',

変更後です。

label: '生活費の支払い',
description: '家賃や光熱費など、生活に必要なお金を支払いました。',

これだけでも、ゲームの雰囲気が少しやわらかくなります。


よくあるエラーと直し方

1. 文字の ' を消してしまった

悪い例です。

title: 初任給,

正しくはこちらです。

title: '初任給',

文字は ' で囲みます。


2. カンマを消してしまった

悪い例です。

title: tile.label
categoryLabel: 'PAYDAY',

正しくはこちらです。

title: tile.label,
categoryLabel: 'PAYDAY',

各行の最後にカンマを残します。


3. cashChangeを文字にしてしまった

悪い例です。

cashChange: '500',

正しくはこちらです。

cashChange: 500,

数字は ' で囲みません。


4. マイナスを忘れてしまった

税金や出費は、マイナスです。

悪い例です。

cashChange: 250,

正しくはこちらです。

cashChange: -250,

マイナスを忘れると、出費なのに収入のように表示されます。


5. awaitを消してしまった

悪い例です。

_showLifeEventModal(...);
_addCashToCurrentPlayer(500);

正しくはこちらです。

await _showLifeEventModal(...);
_addCashToCurrentPlayer(500);

await をつけることで、モーダルが閉じるまで次の処理を待てます。


この章で覚えること

この章で覚えることは、3つだけです。

1. _showLifeEventModal() はイベント表示用の関数
2. showDialog() でモーダルを表示している
3. title・description・cashChange を変えると表示内容が変わる

まずはこれだけで大丈夫です。


やる気を維持するコツ

イベントモーダルは、ゲームの「伝え方」を決める部分です。

処理が正しくても、画面に分かりやすく出なければ、ユーザーは何が起きたか分かりません。

逆に、モーダルが分かりやすいと、ゲーム体験が一気に良くなります。

何が起きたか分かる
↓
納得できる
↓
次も遊びたくなる

まずは文章を変えるだけでOKです。

小さな表現の変更でも、ゲームの印象はかなり変わります。


チェックリスト

□ _showLifeEventModal() を見つけた
□ showDialog() がモーダル表示だと分かった
□ AlertDialog が表示カードだと分かった
□ title がイベント名だと分かった
□ description が説明文だと分かった
□ cashChange が金額表示だと分かった
□ await が閉じるまで待つ意味だと分かった
□ 給料マスの表示文を変更した
□ 税金マスの表示文を変更した
□ 保存して画面で確認した

まとめ

この章では、イベントモーダルを作る仕組みを確認しました。

イベントモーダルは、_showLifeEventModal() で表示しています。

中では showDialog() を使って、画面の上にイベント説明用のカードを出しています。

titledescriptioncashChange を変えることで、給料・税金・イベント・通行料などを分かりやすく表示できます。

次の章では、タイムラインUIとアニメーションを見ながら、人生ゲームの見た目を作る仕組みを理解していきます。

教材トップへ戻る