【Java】ゲーム用画面遷移

2018年3月11日

本稿はJava標準APIを利用し、ゲームの画面遷移を実現する方法について説明します。

画面遷移の実装方法は、いろいろ考えられますが、今回はせっかくJPanelを使ってるのでそのJPanelを入れ替える方法で画面遷移を実現してみたいと思います。

画面遷移を簡単に実現するためのメソッドを作成

これまでJFrameオブジェクトにJPanelオブジェクトをはめ込んでサンプルを紹介してきましたが、このJPanelを継承した複数のクラスを定義し、画面遷移を実現する方法を考えてみます。

JFrameのaddメソッドで追加するのはこれまでもサンプルで出てきましたが、当然削除メソッドも用意されています。

remove(外したい画面オブジェクト)やremoveAllメソッドを利用するとはめ込んだ画面を削除できます。

ただ、JFrameのremoveAllメソッドを利用するとデフォルトで用意されている必要なパネルが外されてしまうので、getContentPaneメソッドで取得できるオブジェクトのremoveメソッドを呼び出しましょう。

なぜContenPaneを操作するのかというと、JFrameにはデフォルトでJRootPane等のパネルがはめ込まれているのですが、addメソッドではめ込んだパネルはこのデフォルトで既に入れられているパネルにはめ込まれているからです。

今回はremoveメソッドとaddメソッドを利用して新たに画面を差し替えるchangeメソッドを作成します。

それでは、画面遷移の実装サンプルをご覧ください。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test{
	public static void main(String[] args) throws InterruptedException{
		GameWindow gw = new GameWindow("テストウィンドウ",400,300);
		gw.setVisible(true);
		gw.change(new GameView());
		Thread.sleep(1000);
		gw.change(new TitleView());
		Thread.sleep(1000);
		gw.change(new GameView());
		Thread.sleep(1000);
		gw.change(new TitleView());
		Thread.sleep(1000);
	}
}
class GameWindow extends JFrame{
	private Thread th = null;
	public GameWindow(String title, int width, int height) {
		super(title);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(width,height);
		setLocationRelativeTo(null);
		setResizable(false);
	}
	
	//画面切り替え用メソッド
	public void change(JPanel panel) {
		//ContentPaneにはめ込まれたパネルを削除
		getContentPane().removeAll();
		
		super.add(panel);//パネルの追加
		validate();//更新
		repaint();//再描画
	}
}
class TitleView extends JPanel{
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.WHITE);
		g.fillRect(0,0,400,300);

		g.setColor(Color.BLACK);
		g.drawString("タイトル画面", 170, 50);
	}
}
class GameView extends JPanel{
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.BLACK);
		g.fillRect(0,0,400,300);
		
		g.setColor(Color.WHITE);
		g.drawString("ゲーム画面", 170, 50);
		g.fillRect(150,125,100,50);
	}
}
実行結果

1秒ごとに画面遷移をしているのがわかると思います。

changeメソッドでは、JPanelの入れ替え以外にvalidate、repaintメソッドを実行しています。

validateですが、ただ入れ替えるだけだと、うまく描画命令が呼び出されないこともあるようなので、入れ替えた後にvalidateメソッドを呼び出して更新しています。

その後は再描画処理を実行したいので一回だけrepaintメソッドを呼び出しています。

mainメソッドでJPanelクラスを継承した二つの画面クラスを定義し、1秒ごとにタイトル画面とゲーム画面を遷移しています。

これで画面を増やしたいときは、JPanelを継承したクラスを作成するだけでできるようになります。

Java

Posted by nompor