今からはじめるプログラミング15
戦闘(イベント)ようの画面を作り、画面間の制御を行うようにして、
いよいよRPGっぽくなってきましたが、少しGW前後はお休みします。ちょっと絵から離れ過ぎてしまっているのとか、いろいろ野暮用などあり。
すいません。
お休み前にキャラクターをペンギンの画像だけだったので、少し情報を増やします。そんで画面に情報を表示してみます。
というわけで、
UserCharactorクラスを作成しました。
----------------------------------------------------------------
package sample7;
public class UserCharactor {
private static UserCharactor userCharactor = null;
public static UserCharactor getInstance() {
if (userCharactor == null) {
userCharactor = new UserCharactor();
}
return userCharactor;
}
private String name = null;
private int max_hp = 0;
private int hp = 0;
private String command = new String { "なでる", "しらべる", "にげる" };
private ArrayList<String> items = new ArrayList<String>();
private String image_path = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMax_hp() {
return max_hp;
}
public void setMax_hp(int max_hp) {
this.max_hp = max_hp;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public String getCommand() {
return command;
}
public void setCommand(String command) {
this.command = command;
}
public ArrayList<String> getItems() {
return items;
}
public void setItems(ArrayList<String> items) {
this.items = items;
}
public String getImage_path() {
return image_path;
}
public void setImage_path(String image_path) {
this.image_path = image_path;
}
}
----------------------------------------------------------------
こちらはわかりやすいクラスなので、特に解説はしません。ArrayListぐらいはした方がいいですかね、、別の機会にHashmapと説明しましょう。業務アプリケーションでは結構多用していたと思うので。
ユーザーキャラクターのいろいろな属性(プロパティ)をもち、それらのアクセサー(get/setメソッド)を集めたクラスです。
で本来ゲームを始めるにあたって、ここから?的なキャラメイクをプログラムで済ませています。
MainClass7(追記)
----------------------------------------------------------------
package sample7;
public class MainClass7 {
public static void main(String[] args) {
//TODO キャラメイク
UserCharactor user = UserCharactor.getInstance();
user.setName("ぺんぎん");
user.setHp(10);
user.setImage_path("./ぺんぎん.png");
user.setMax_hp(10);
// TODO Auto-generated method stub
new MainFrame();
}
}
----------------------------------------------------------------
キャラメイクといいつつ、セッターを使って値を直接打ち込んでいます。
キャラクターのイメージをキャラクターのクラスに移動したので、
FieldRendererのキャラクターイメージを設定している箇所をUserCharactorクラスから取得するように修正(case 0のところ)
----------------------------------------------------------------
package sample7;
(省略)
public class FieldRenderer implements TableCellRenderer {
(省略)
case 0:
// 0をキャラクターとする
UserCharactor user = UserCharactor.getInstance();
icon = new ImageIcon(user.getImage_path());
label.setIcon(icon);
break;
(省略)
----------------------------------------------------------------
キャラクターのステータスを画面に表示するためのパネルクラス
StatusPanel
----------------------------------------------------------------
package sample7;
import java.awt.GridLayout;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class StatusPanel extends JPanel {
public StatusPanel(UserCharactor user ) {
//画像もろもろの記述が面倒なのでImageIconを使用
ImageIcon icon = new ImageIcon(user.getImage_path());
//ラベルにIconを設定
JLabel label = new JLabel(icon);
StringBuffer sb = new StringBuffer();
sb.append(user.getName());
sb.append("\r\n");
sb.append("HP"+"/"+"最大HP");
sb.append("\r\n");
sb.append(user.getHp()+"/"+user.getMax_hp());
sb.append("\r\n");
String text = sb.toString();
//テキストエリア
JTextArea area = new JTextArea();
//引数のテキストを設定
area.setText(text);
this.setLayout(new GridLayout(1, 2));
//スクロール
JScrollPane scrolLeft = new JScrollPane(label);
JScrollPane scrolRight = new JScrollPane(area);
//パネルにスクロールを設定
this.add(scrolLeft);
this.add(scrolRight);
}
}
----------------------------------------------------------------
ほぼノベルゲームのImageTextPanelのままなのがよくわかります?
作成したパネルをサブ画面に追加。
SubFrame
----------------------------------------------------------------
package sample7;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SubFrame extends JFrame implements ActionListener {
private JFrame parent = null;
public SubFrame(JFrame parent) {
init(parent);
}
private void init(JFrame parent) {
//親画面を使用不可にする
this.parent = parent;
this.parent.setEnabled(false);
//TODO レイアウト
this.setLayout(new FlowLayout());
//キャラクタ取得
UserCharactor user = UserCharactor.getInstance();
//ステータスパネルのインスタンス生成
StatusPanel status = new StatusPanel(user);
//ステータスパネルを追加
this.getContentPane().add(status);
//閉じるボタン TODO 戦闘(いべんと)が終わったらとじるように修正する
JButton btnClose = new JButton("閉じる");
btnClose.setActionCommand("close");//イベント元で処理を分岐させるための設定
btnClose.addActionListener(this);
this.getContentPane().add(btnClose);
this.setSize(new Dimension(300,400));
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand().equals("close")) {
//閉じるボタン TODO 戦闘(いべんと)が終わったらとじるように修正する
//親画面を復帰
this.parent.setEnabled(true);
//自分を廃棄
this.setVisible(false);
this.dispose();
}
}
}
----------------------------------------------------------------
レイアウトを考える時間がないので、文字連結でくっつけました。。。。
実行結果(エンカウント率低いかな?)
どうですかね、モンスターを追加して、コマンド叩けるようにして、たたかうとかできそうなイメージができればいいですね。
なかなか大変な画面なので、丁寧に作って行きたいです。
すいませんが、ちょっと間があいてしまうと思います。
よろしくお願いします。
また回線の調子がいい時にアップします。