Javaでゲームを作ろう<アドベンチャーゲーム>6回目

プログラム

本日の課題

「story」配列からゲーム進行の情報を取り出し実行する。
このメソッドの役割
このメソッドの役割は、指定されたストーリーポイント(index)に基づいてゲーム画面を更新することです。ストーリーの文章や画像、行動ボタンを正しく配置し、プレイヤーが次のアクションを選択できるようにします。

今回のゲームプログラムの実質的な中心になる部分になります。

ソースコード

// ゲーム画面の更新
private static void updateGameScreen(JFrame frame, int index) {
// 一度全てのコンポーネントを削除
frame.getContentPane().removeAll();

// レイアウトを再設定
frame.setLayout(null);

// ストーリーの文章を表示するエリア
JTextArea storyArea = new JTextArea(story[index][0]);
storyArea.setEditable(false);
storyArea.setLineWrap(true);
storyArea.setWrapStyleWord(true);
// storyArea.setPreferredSize(new Dimension(WIDTH, 280));
storyArea.setBounds(0, 400, 640, 80); // 変更点
frame.add(storyArea);

// 画像を表示するエリア
// 新しく追加されたコード
JLabel imageLabel = new JLabel(new ImageIcon(“images/” + story[index][9]));
imageLabel.setBounds(0, 0, 400, 400); // 画像の位置とサイズ
frame.add(imageLabel);

// 行動1のボタン
JButton action1Button = new JButton(story[index][1]);
// action1Button.setPreferredSize(new Dimension(WIDTH, 100));
action1Button.setBounds(400, 0, 240, 100); // 変更点
action1Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][5]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action1Button);

// 行動2のボタン
JButton action2Button = new JButton(story[index][2]);
// action2Button.setPreferredSize(new Dimension(WIDTH, 100));
action2Button.setBounds(400, 100, 240, 100); // 変更点
action2Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][6]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action2Button);

// 行動3のボタン
JButton action3Button = new JButton(story[index][3]);
// action2Button.setPreferredSize(new Dimension(WIDTH, 100));
action3Button.setBounds(400, 200, 240, 100); // 変更点
action3Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][7]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action3Button);

// 行動4のボタン
JButton action4Button = new JButton(story[index][4]);
// action2Button.setPreferredSize(new Dimension(WIDTH, 100));
action4Button.setBounds(400, 300, 240, 100); // 変更点
action4Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][8]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action4Button);

// 空白の行動1の場合はスタート画面に戻る
if (story[index][1].isEmpty()) {
action1Button.setText(“スタート画面に戻る”);
action1Button.addActionListener(e -> {
frame.dispose();
showStartScreen();
});
}

// 空白の行動2の場合はボタンを非表示にする
if (story[index][2].isEmpty()) {
action2Button.setVisible(false);
}

// 空白の行動3の場合はボタンを非表示にする
if (story[index][3].isEmpty()) {
action3Button.setVisible(false);
}

// 空白の行動4の場合はボタンを非表示にする
if (story[index][4].isEmpty()) {
action4Button.setVisible(false);
}

frame.revalidate(); // 変更点
frame.repaint(); // 変更点
frame.setVisible(true);
}

解説


ウィンドウのクリア
frame.getContentPane().removeAll();
・画面を更新するために、まずウィンドウのすべてのコンポーネントを削除します。


レイアウトの再設定
frame.setLayout(null);
・レイアウトマネージャを無効にし、手動でコンポーネントの位置を設定します。


ストーリーの文章表示エリア
JTextArea storyArea = new JTextArea(story[index][0]);
storyArea.setEditable(false);
storyArea.setLineWrap(true);
storyArea.setWrapStyleWord(true);
storyArea.setBounds(0, 400, 640, 80);
frame.add(storyArea);
・JTextArea を使ってストーリーの文章を表示します。story[index][0] から文章を取得し、編集不可に設定しています。
・setBounds で表示位置とサイズを設定し、フレームに追加します。


画像表示エリア
JLabel imageLabel = new JLabel(new ImageIcon(“images/” + story[index][9]));
imageLabel.setBounds(0, 0, 400, 400);
frame.add(imageLabel);
・JLabel を使って画像を表示します。story[index][9] から画像ファイル名を取得し、フレームに追加します。


行動1~4のボタン

JButton action1Button = new JButton(story[index][1]);
action1Button.setBounds(400, 0, 240, 100);
action1Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][5]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});

frame.add(action1Button);
・他の行動ボタンもほぼ同様に設定されます。
・行動2、3、4も同じようにボタンを作成し、addActionListener でボタンがクリックされたときの動作を設定します。
・すべてのボタンが frame に追加されます。
・選択肢を増やしたい場合はこのプログラムを増やすと追加が簡単にできます。
【詳細解説】
ボタンの作成
JButton action1Button = new JButton(story[index][1]);
・JButton クラスを使って新しいボタンを作成しています。
・story[index][1] でストーリーデータの中から、このボタンに表示するテキストを取得します。例えば、「次へ進む」や「調べる」といったテキストが表示されます。

ボタンの位置とサイズの設定
action1Button.setBounds(400, 0, 240, 100);
・setBounds メソッドでボタンの位置とサイズを設定しています。
・400 はX座標、つまり左からの位置です。
・0 はY座標、つまり上からの位置です。
※2個目(100)、3個目(200)、4個目(300)
※高さが100なので、100単位で開始位置を調整しています。
・240 はボタンの幅です。
・100 はボタンの高さです。
※ボタンが4個なので、「400/4=100」になり高さが100になります。
選択肢を増やす場合
※選択肢が5個ならば、「400/5=80」になり、高さと開始位置を「80」にすればOK
割れない数であっても、下に隙間が開いてもOKなら好きな数字にしてOK
選択肢が増えすぎるとデータの管理が大変なので、気をつけましょう

ボタンがクリックされたときの動作を設定
action1Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][5]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
・addActionListener メソッドでボタンがクリックされたときに実行される処理を定義しています。
・ラムダ式(e -> { … })を使って処理を簡潔に記述しています。

次のストーリーポイントの取得
int nextIndex = Integer.parseInt(story[index][5]);
・story[index][5] から次のストーリーポイントのインデックスを取得します。これは文字列なので、Integer.parseInt を使って整数に変換します。

セーブデータの保存
saveData(nextIndex);
saveData メソッドを呼び出して、現在の進行状況(次のインデックス)を保存します。

次の画面の表示
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
・nextIndex が 999 の場合はスタート画面を表示します。
・frame.dispose(); は現在のウィンドウを閉じます。
・showStartScreen(); はスタート画面を表示するメソッドです。
・nextIndex が 999 でない場合は、updateGameScreen メソッドを呼び出して次のストーリーポイントに基づいた画面を更新します。

ボタンをフレームに追加
frame.add(action1Button);
frame.add(action1Button); でボタンをウィンドウに追加します。


空白の行動ボタンの処理
if (story[index][1].isEmpty()) {
action1Button.setText(“スタート画面に戻る”);
action1Button.addActionListener(e -> {
frame.dispose();
showStartScreen();
});
}
if (story[index][2].isEmpty()) {
action2Button.setVisible(false);
}
if (story[index][3].isEmpty()) {
action3Button.setVisible(false);
}
if (story[index][4].isEmpty()) {
action4Button.setVisible(false);
}
・行動ボタンが空白の場合、それぞれのボタンに対して特定の処理を行います。
・行動1が空白の場合はスタート画面に戻るように設定
・行動2~4が空白の場合はボタンを非表示にします。
選択肢を増やす場合


ウィンドウの再描画
frame.revalidate();
frame.repaint();
frame.setVisible(true);
・フレームを再描画して、変更を反映させます。これにより、ウィンドウが正しく表示されます。
※当初は文字が2重に表示され読めなくなったり、画像が切り替わらなかったりしました。
※この処理を追加して解消されました。

目次に戻る

スポンサーリンク

コメント

タイトルとURLをコピーしました