1976年生まれのプログラミング初心者のゲーム制作日記

ひょんなことからJavaでゲームを作ることになり、その過程を記しています。

3DダンジョンRPGを作る 2

<タイトル画面を作成>

f:id:ryisnow:20150704133128j:plain


ウィンドウができたので、まずタイトル画面を作ってみました。

ウィンドウを作るのには「JFrame」というものを使いましたが、それに加え、

・Container
・JPanel
・JLabel
・Jbutton

というものをこのタイトル画面を作成するのに使用しました。

まず「RAINDIA」というでっかいタイトル文字ですが、これを「JLabel」というものを使って書いています。JLabel というのはテキストを表示する領域のようなもので、作成にはこのような書き方をしています:

JLabel titleL = new JLabel("RAINDIA");        

「titleL」とは任意につけた JLabel の名前で、カッコの中にある「RAINDIA」というのが画面に表示されているテキストです。


一方その下にある「Start」と「Continue」は「JButton」というものを使って書いています。

なぜこっちは JLabel ではなく JButton かというと、JButton というのは名前の通りボタン的な機能を持つもので、押すことでなんらかのアクションが発生するように、いろんな機能を付与することができるからです。
「Start」と「Continue」は押すことでゲームが始まったり、データを読み込んだりする必要があるので「JLabel」ではなく「JButton」を使いました。


次に作成した JLabel と JButton をウィンドウ上のどこに配置するかを設定する必要があるのですが、この位置を決めるのに使用しているのが「JPanel」です。

JPanel というのはテキストやボタンを載せる土台のようなもの(?)で、たとえば

JPanel titleP1 = new JPanel();
titleP1.setBounds(100,300,1000,200);

といった感じで配置する座標を指定します。
カッコ内の数字は左から(X座標、Y座標、横の長さ、縦の長さ)
という意味になるようです。

この場合は「X座標100、Y座標300の地点から横に1000ピクセル、縦に200ピクセルの広さのパネル(titileP1)を置く」といった感じです。

このパネルの上にさっき作成した「RAINDIA」という文字の書かれた JLabel(titleL)を置きます。コードはこんな感じです。

titleP1.add(titleL);

これでパネル「titleP1」の上に「titleL」が載りました。

同様に「Start」と「Continue」を書いた「JButton」に関してもパネルを作成し、その上に追加します。

JPanel titleP2 = new JPanel();
titleP2.setBounds(485, 600, 200, 120);
で、パネルを作成し、

titleP2.add(titleB1);
で、その上にボタンを追加


これで完了…かと思いきやそうではなく、最後の仕上げとしてこの2つのパネルを「Container」というものの上に載せる必要があります。Container というのはすべてのコンテンツを載せるさらなる土台といった感じでしょうか。

Container の作成方法はパネルやラベルとは少し違って、このように書きます。

Container con = window.getContentPane();

「con」は Container に任意につけた名前、「window」は前回作成したウィンドウ(JFrame)に任意でつけた名前です。

そしてこの Container に2つのパネルを載せます。

con.add(titleP1);
con.add(titleP2);

これでようやく画面に「RAINDIA」、「Start」、「Continue」の3つの文字が表示されます。

階層としては

JFrame(ウィンドウ)
  ↓
Container
  ↓
JPanel
  ↓
JLabel または JButton
    
といった感じで上に重なっています。


あとはデザイン的な微調整となり、背景の色やボタンのデザイン、フォントの種類などの要素を追加していきます。

背景色は黒にし、フォントは「Times New Roman」を使用しました。

このタイトル画面の全体のプログラムはこんな感じです。

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

import java.awt.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Raindia extends JFrame
{
    JFrame window;
    Font titlefont, basicfont;
    Container con;
    
    public static void main(String[ ]args)
    {
        Raindia game = new Raindia();
        game.TitleScreen();        
    }
    
    public void TitleScreen()
    {        
        window = new JFrame();
        window.setBounds(0,0,1200,950);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().setBackground(Color.black);
        window.setLayout(null); //Disabling the default layout.
        window.setVisible(true);        
        
        //FONT Setting
        titlefont = new Font("Times New Roman", Font.PLAIN, 146);
        basicfont = new Font("Times New Roman", Font.PLAIN, 34);
        
        //TITLE Panel   
        JPanel titleP1 = new JPanel();
        titleP1.setBounds(100,300,1000,200);
        titleP1.setBackground(Color.black);
        titleP1.setForeground(Color.white);        
        JPanel titleP2 = new JPanel();
        titleP2.setBounds(485, 600, 200, 120);
        titleP2.setBackground(Color.black);
        titleP2.setForeground(Color.white);
        titleP2.setLayout(new GridLayout(2,1));        
        JPanel titleP3 = new JPanel();
        titleP3.setBounds(100, 800, 980, 50);
        titleP3.setBackground(Color.black);
        titleP3.setForeground(Color.white);    
        
        //TITLE Labe
        JLabel titleL = new JLabel("RAINDIA");        
        titleL.setFont(titlefont);
        titleL.setForeground(Color.white);   
        
        //TITLE Button
        JButton titleB1 = new JButton("Start");
        titleB1.setBackground(Color.black);
        titleB1.setForeground(Color.white);
        titleB1.setBorder(null);
        titleB1.setFont(basicfont);
        titleB1.setFocusPainted(false);


        JButton titleB2 = new JButton("Continue");
        titleB2.setBackground(Color.black);
        titleB2.setForeground(Color.white);
        titleB2.setBorder(null);
        titleB2.setFont(basicfont);
        titleB2.setFocusPainted(false);            

        //ADD      
        titleP1.add(titleL);
        titleP2.add(titleB1);
        titleP2.add(titleB2);    
        titleP3.add(titleM);    


        Container con = window.getContentPane();
        con.add(titleP1);
        con.add(titleP2);
        con.add(titleP3);
    }
}

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

・このタイトル画面以外の場所でも使用することが予想される「JFrame(window)」、「Font(titlefontとbasicfont)」、「Container(con)」に関しては「TitleScreen」の中ではなくプログラム冒頭で宣言することにしました。こうすることで「TitleScreen」メソッドの外でもこれらを呼び出して使えるようになります。

・「setBackground(Color.black)」で背景色を黒に、「setForeground(Color.white)」でフォントの色を白に指定しています。

・「JButton」はデフォルトで使用すると四角い縁が表示されるのですが、それらを消してテキストだけを表示するため「titleB1.setBorder(null)」という形で書いています。