今から始めるプログラミング8
少しは画面のプログラムがかけるようになっていただけていたら、嬉しいです。
画面遷移だけでしたら、前回までのソースで、最初の画面と次の画面を作って、最初の画面のイベント(リスナー)で次の画面の初期化を呼べばいいので結構簡単に実装できますね。
真っ直ぐに進むだけ、のノベルだけならこれでいいと思います。
次によくよく理解したいことといえば、「フラグ」でしょうか。
恋のフラグとか死亡フラグとか、そういうもののフラグと同じというか、このプログラムのフラグが語源ですよね?
フラグを制御して、ルート分岐する。
キーとなるアイテムをもっているかどうか、フラグで制御する。
ノベルゲームでは、このフラグが、ゲームの肝かもしれません。
とはいえ、すでにここまでのプログラムの中で実はフラグは使っています。
直近のファイルチューザーを使ったコーディングでファイル選択の戻り値をif文で判断して処理を分岐しています。
そうです明確に「フラグ」ではないものの、ここではint型の選択されたか、どうかでルート分岐しているのです。下記の記事ですね。
今更かもしれませんが、プリミティブ型というものをそろそろ理解したいと思います。一番簡単な(小さい?)型として「フラグ」そのものである「boolean」というものがあります。これは要するにオンとオフしか表現できません。容量も少ないので、if文やroopの制御に使用できます。
if(フラグ){
フラグがオンの時の処理
}
とか
while(フラグ){
フラグがtrueのときずっと繰り返し
}
みたいな感じです。プログラムもわかりやすいですよね。
なのでなかなか重宝する型です。
では、int型はどうでしょう。こちらは数値の型です。数字なのですが、基本的に計算用の型ですが、先ほどのフラグで3つの条件分岐を行うにはどうでしょうか、フラグを2つにするとかすればできそうですが、いきなり読みづらいコードになりそうですね。
そういう時は、異世界生活でいうところの「ステータス」を表現できそうな、幅を持つ数値(数値でなくてもいいですが)を使います。
ある意味コード化するのに好都合な型です。数値にそれぞれ意味を持たせてプログラムします。ファイル選択を行う場合の操作を思い浮かべると、「ファイルが選択された場合」、「ファイルが選択されなかった場合」、さらに「処理をキャンセルした場合」などのステータスが考えられます。それぞれ1,2,3を割り当てると、戻り値で
if(戻り値==1){
}else(戻り値==2){
}else(戻り値==3){
という感じで分岐することができます。
ただの数値だとわからないので、定数を使うことが多いです。ここでも「JFileChooser.APPROVE_OPTION」という定数を使用していました。
こういう実際の値とその意味を設計することをコード設計といって、システム開発では重要な工程の一つなので理解しておくといいと思います。コード定義とか。
話が長くなりましたが、「フラグ」はプログラムの重要な要素であることは理解いただけたと思います。
というわけで、これからつくるノベルゲームも、ルート分岐を作ってハッピーエンドとバッド?エンドを設定しようかな、とか考えています。
とはいえ、ルート分岐の前までコーディングしないと実際のプログラムがまだまだわからないですよね。
次回は、分岐の画面ぐらいまでは作りたいですので、しばらくかかると思います。
とはいえプログラムが何もないのは寂しいので、今できているクラスをぺけぺけと貼り付けておきます。作り途中なので、「TODO」が多いです。「TODO」コメントはエクリプスがToDoリストを作ってくれるきのうなので、書いておくと忘れてもいいですよ。僕のような記憶の容量の小さい人間には必須の機能です。
MainClass
-----------------------------------
package sample5;
public class MainClass {
public static void main(String[] args) {
new Menu();
}
}
-----------------------------------
Menu
-----------------------------------
package sample5;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Menu extends JFrame {
private String imageSource = "/Users/matsuiyoshikazu/eclipse-workspace/sample/src/resource/風邪と電柱.png";
public Menu() {
showMenu();
}
private boolean initialConfiguration() {
// TODO ロードしたいものがあればここで処理する
return true;
}
private void showMenu() {
this.setTitle("メニュー");
this.setSize(new Dimension(300, 200));
this.setLayout(new BorderLayout());
ImageIcon icon = new ImageIcon(imageSource);
JLabel label = new JLabel(icon);
if (initialConfiguration()) {
// ボタンのオブジェクト生成
JButton btn = new JButton("はじめる");
// ボタンをリスナーに追加
btn.addActionListener(new MenuListener());
// ボタンを画面に追加
this.getContentPane().add(btn, BorderLayout.SOUTH);
this.getContentPane().add(label, BorderLayout.CENTER);
} else {
JLabel message = new JLabel("初期処理に失敗しました");
// ボタンのオブジェクト生成
JButton btn = new JButton("閉じる");
// ボタンをリスナーに追加
btn.addActionListener(new CloseListener());
// ボタンなどを画面に追加
this.getContentPane().add(message, BorderLayout.NORTH);
this.getContentPane().add(btn, BorderLayout.SOUTH);
this.getContentPane().add(label, BorderLayout.CENTER);
}
this.setVisible(true);
}
}
-----------------------------------
MenuListener
-----------------------------------
package sample5;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MenuListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//TODO 次の画面
}
}
-----------------------------------
CloseListener
-----------------------------------
package sample5;package sample5;
import java.awt.event.ActionEvent;import java.awt.event.ActionListener;
public class CloseListener implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
-----------------------------------
ImageTextPanel
-----------------------------------
package sample5;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class ImageTextPanel extends JPanel {
private String imageSource = "";
private String textSource = "";
private JTextArea area = new JTextArea();
public boolean setImageSource(String source) {
//TODO
return false;
}
public boolean setTextSource(String source) {
//TODO
return false;
}
public ImageTextPanel(String img,String text) {
//TODO
}
}
-----------------------------------
ジャンクプログラムもよろしくです。