今からはじめるプログラミング15

戦闘(イベント)ようの画面を作り、画面間の制御を行うようにして、

いよいよRPGっぽくなってきましたが、少しGW前後はお休みします。ちょっと絵から離れ過ぎてしまっているのとか、いろいろ野暮用などあり。

すいません。

お休み前にキャラクターをペンギンの画像だけだったので、少し情報を増やします。そんで画面に情報を表示してみます。

というわけで、

UserCharactorクラスを作成しました。

----------------------------------------------------------------

 

package sample7;

 

import java.util.ArrayList;

 

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();

}

 

}

 

}

 ----------------------------------------------------------------

レイアウトを考える時間がないので、文字連結でくっつけました。。。。

実行結果(エンカウント率低いかな?)

 

f:id:yo2an:20210415190451p:plain

ステータスをサブ画面に表示


どうですかね、モンスターを追加して、コマンド叩けるようにして、たたかうとかできそうなイメージができればいいですね。

なかなか大変な画面なので、丁寧に作って行きたいです。

すいませんが、ちょっと間があいてしまうと思います。

よろしくお願いします。

また回線の調子がいい時にアップします。