Go to Previous Page Go to Contents Go to Java Page Go to Next Page
New Features of Java2 SDK, Standard Edition, v1.4
 
 

Full Screen

 
 

ゲームを作ってみたいけど...

 
 

Java のアプリケーションは AWT でも Swing でも、ウィンドウを表示してしまいます。普通のアプリケーションであれば、それでいいのでしょうけど。Window クラスや JWindow クラスを使えば、ウィンドウのタイトルバーは消すことはできます。でも、画面全面を使って見たいと思いませんか。

特にある特定のアプリケーションではぜひほしい機能です。その特定のアプリケーションというのは、ようするにゲームです。

Quake でもなんでもいいのですが、ゲーム特にアクションやシューティング系のゲームでは画面全面を使っているものが多いです。また、解像度もゲームに最適になるように変更しています。

もし、Java でゲームを作ろうとしたとき、今まではまずこの点で壁にぶつかってしまいました。Java のパフォーマンスはかなり向上しており、アクションゲームも十分に作れるほどになってきています。

だからこそ、なおさらフルスクリーンのサポートが望まれていたのです。Java 2 SE, v1.4 でやっとフルスクリーンがサポートされました。もちろん、解像度の変更もできますよ。

 

 
 

なにはともあれやってみよう

 
 

とりあえず、フルスクリーンにしてみましょう。

次のサンプルアプリケーションはフルスクリーンのボタンを生成します。ボタンを押せばアプリケーションが終了します。

アプリケーションのソース FullScreenTest1.java

フルスクリーンにするには GraphicsDevice クラスを使用します。GraphcisDevice クラスはディスプレイやプリンタなど描画できるデバイスを表したクラスですが、v1.4 でかなり機能強化されました。

 1:    GraphicsDevice device;
 2: 
 3:    public FullScreenTest1(){
 4:        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
 5:        device = ge.getDefaultScreenDevice();
 6:        GraphicsConfiguration gc = device.getDefaultConfiguration();
 7:             
 8:        try{
 9:            JFrame frame = new JFrame(gc);
10:            frame.setUndecorated(true);
11:
12:            JButton button = new JButton("OK");
13:            button.addActionListener(new ActionListener(){
14:                    public void actionPerformed(ActionEvent e){
15:                        device.setFullScreenWindow(null);
16:                        System.exit(0);
17:                    }
18:                });
19:            
20:            frame.getContentPane().add(button);
21:            device.setFullScreenWindow(frame);
22:            frame.setVisible(true);
23:        }catch(Exception ex){
24:            device.setFullScreenWindow(null);
25:            System.exit(0);
26:        }
27:    }

まず、4 行目で GraphicsEnvironment オブジェクトを static メソッドの getLocalGraphicsEnvironment を使用して取得します。GraphcisEnvironment クラスはディスプレイやプリンタなどの描画デバイス (GraphicsDevice) とフォントをまとめるクラスです。このクラスの getDefaultScreenDevice メソッドを使用することでディスプレイを表す GraphcisDevice オブジェクトを得ることができます (5 行目)。

9 行目でフルスクリーンにする JFrame オブジェクトを生成しています。コンストラクタの引数には GraphicsConfiguration オブジェクトを使用しています。GraphicsConfiguration の取得は GraphicsDevice クラスの getDefaultConfiguration メソッドを使用します (6 行目)。

フルスクリーンにできるクラスは java.awt.Window クラスの派生クラス、すなわち AWT の Frame, Window, Dialog、Swing の JFrame, JWindow, JDialog などです。

10 行目の setUndecorated メソッドは Frame のタイトルバーを表示しないようにするためのメソッドです。フルスクリーンにしてしまえば、タイトルバーはあまり必要ないのでこのような関数が追加されました。

12 行目から 18 行目は表示するボタンの生成とイベントリスナの設定です。

そして、フルスクリーンにしているのが 21 行目です。フルスクリーンにするためのメソッドは GraphcisDevice クラスの setFullScreenWindow メソッドです。引数にはフルスクリーンにするオブジェクトを指定します。

フルスクリーンからもとの状態に戻すには getFullScreenWindow メソッドの引数を null にしてコールします (15 行目、24 行目)。

23 行目から 25 行目までの例外処理ではフルスクリーンを元に戻しています。アプリケーションを終了するときには必ず元に戻すことを忘れないでください。

 

 
 

解像度を調べてみよう

 
 

ある解像度に変更したいときに、それができるかどうかを調べる必要があります。そのために、まず解像度を調べてみましょう。

次に示すサンプルはアプレットですが、実行されている環境で使用できる解像度と色数、リフレッシュレートの一覧を表示するものです。

Applet の HTML DisplayModeList.html
Applet のソース DisplayModeList.java,
DisplayModeTableModel.java

解像度などを表すために v1.4 では新たに java.awt.DisplayMode クラスが追加されました。

現在の DisplayMode や、そのコンピュータで使用できるすべての DisplayMode を調べるにはそれぞれjava.awt.GraphicsDevice クラスの getDisplayMode メソッドと getDisplayModes メソッドを使用します。

DisplayModeList ではすべての DisplayMode を調べるので init メソッドの中で getDisplayModes メソッドを使用しています。

    public void init(){
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = ge.getDefaultScreenDevice();
 
        DisplayMode[] modes = device.getDisplayModes();
        JTable table = new JTable(new DisplayModeTableModel(modes));
 
        getContentPane().add(new JScrollPane(table));
    }

始めに GraphcisEnvironment オブジェクトと GraphicsDevice オブジェクトを取得するのは、前のサンプル FullScreenTest1 と同じです。

GraphcisDevice オブジェクトが取得できたら getDisplayModes メソッドを使って、使用できるすべての DisplayMode オブジェクトを取得します。取得した DisplayMode オブジェクトを JTable を使用して表にしています。

DisplayMode クラスでは次のような情報を表すことができます。

情報 表し方 getter メソッド
横方向の解像度 整数 getWidth
縦方向の解像度 整数 getHeight
色数 ビット数 getBitDepth
リフレッシュモード 周波数 getRefreshRate

解像度を変更するときも DisplayMode を使用します。

 
 

解像度の変更をしてみる

 
 

解像度が分かったので、次に解像度を変更してみましょう。

アプリケーションのソース FullScreenTest2.java

FullScreenTest1 との違いはわずかです。異なる部分を赤で示しておきました。

    GraphicsDevice device;
    DisplayMode orgMode;
 
    public FullScreenTest2(){
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        device = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = device.getDefaultConfiguration();
             
        orgMode = device.getDisplayMode();
        DisplayMode mode = new DisplayMode(640, 480, 32, DisplayMode.REFRESH_RATE_UNKNOWN);
 
        try{
            JFrame frame = new JFrame(gc);
            frame.setUndecorated(true);
 
            JButton button = new JButton("OK");
            button.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){
//                        device.setDisplayMode(orgMode);
                        device.setFullScreenWindow(null);
                        System.exit(0);
                    }
                });
            
            frame.getContentPane().add(button);
            device.setFullScreenWindow(frame);
            device.setDisplayMode(mode);
            frame.setVisible(true);
        }catch(Exception ex){
//            device.setDisplayMode(orgMode);
            device.setFullScreenWindow(null);
            System.exit(0);
        }
    }

解像度を変更するためには、変更する DisplayMode オブジェクトを生成する必要があります。リフレッシュモードはディスプレイカードやディスプレイによっていろいろあるので、特定するのが難しいです。このために、DisplayMode.REFRESH_RATE_UNKNOWN という定数が定義されています。この定数を使用すると、デフォルトのリフレッシュレートが使用されます。

この例では解像度が 640 × 480、色数が 32bit になっています。ビデオカードが 256 色 (8bit) など 32 bit をサポートしていない場合はここの部分を適当に修正してみてください。たいていの場合は 32, 24, 16, 8 のどれかになります。

DisplayMode を変更するには GraphicsDevice クラスの setDisplayMode メソッドを使用します。この引数に変更したい DisplayMode オブジェクトを指定します。

orgMode は現在の状態を保持するためのものです。Full Screen のチュートリアルにはアプリケーションを終了するときに、元に戻すように記述されているのですが、これを行うとうまく動作してくれないので、コメントアウトしておきました。現状では J2SDK はベータ版なので、正式版では修正されるかもしれません。

(補) FCS ではこの部分は修正されていました。ただ、null のままでも正常に動作しますので、どちらでもいいみたいです。(Apr. 2002)

たったこれだけで、フルスクリーンとディスプレイの解像度を変更できます。なんか、あっけないほどですね。

 

 
 

おまけ

 
 

フルスクリーンはゲームに使えそうなので、次のようなサンプルを作ってみました。

転がるボールアプリケーションのソース FullScreenField.java
Ball.java

単にボールが転がるサンプルです。マウスの右クリックでボールの進行方向が変化します。また、右クリックでボールを増やします。キーボードから「q」を入力すれば終了します。

かなり、多くのボールでもスムーズに動いていませんか。これぐらいできれば、実際のゲームにも十分使えそうですね。

今回使用したサンプルはここからダウンロードできます。

参考 URL

(Jun. 2001)

 
 
Go to Previous Page Go to Contents Go to Java Page Go to Next Page