Scalaでゲームプログラミング - vol4 フルスクリーンにしてみよう -


フルスクリーン化をするにあたって注意することがあります。
キー入力等がオフになっていると戻れなくなる可能性があります。


前回の例ではESCにて終了できるようになっていました。

終了条件
private def isEnd() : Boolean =
{
    if( Keypad.isKeyPressed( Keypad.KEY_ESCAPE ) ) return true
    false
}


とりあえず、フルスクリーン化するかどうかのフラグをEnvironmentにおいておきましょう。

val FULL_SCREEN = false


フルスクリーン化の初期化はMainFrame内にて行います。

frame.scala
import javax.swing._
import java.awt._
import java.awt.image._
//---------------------------------------------------------
// - SCREEN -
//---------------------------------------------------------
class MainFrame extends JFrame
{
    //-----------------------------------------------------
    // initialize
    //-----------------------------------------------------
    val WIDTH  = Environment.Screen.WIDTH
    val HEIGHT = Environment.Screen.HEIGHT
    val DEPTH  = Environment.Screen.DEPTH

    def release() =
    {
        val window = mDevice.getFullScreenWindow()
        if( window == null ) window.dispose()
        mDevice.setFullScreenWindow(null)
    }

    def update() =
    {
        val buffer = getBufferStrategy() 

        if( !buffer.contentsLost ) buffer.show else Debugger.push("\nerror!\n Contents Lost\n")        
        Toolkit.getDefaultToolkit().sync()
        
    }

    //-----------------------------------------------------
    // initialize
    //-----------------------------------------------------
    private val mGE = GraphicsEnvironment.getLocalGraphicsEnvironment
    private val mDevice = mGE.getDefaultScreenDevice
    private val mBufferStrategy = getBufferStrategy()

    {
        setTitle(Environment.Screen.TITLE)
        setBounds(0,0,WIDTH,HEIGHT)
        setIgnoreRepaint(true)
        setResizable(false)

        if( Environment.Screen.FULL_SCREEN )
        {
            try { initFullScreen() } catch { case ex => throw ex }
        }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
        setVisible(true)
        
        val BUFFER_NUM = 2
        createBufferStrategy(BUFFER_NUM)
    }

    private def initFullScreen() =
    {
        setUndecorated(true)

        val image = new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB)
        val point = new Point()
        val tool = Toolkit.getDefaultToolkit()
        val cursor = tool.createCustomCursor(image,point,"")

        setCursor(cursor)
        
        if( !mDevice.isFullScreenSupported ) throw new Exception("FullScreen isnot supported")
        mDevice.setFullScreenWindow(this)

        val mode = new DisplayMode(WIDTH,HEIGHT,DEPTH,DisplayMode.REFRESH_RATE_UNKNOWN)
        mDevice.setDisplayMode(mode)
    }

}


基本的には変わっていませんがinitFullScreenという関数を作りました。

private def initFullScreen() =
{
    setUndecorated(true) // unvisible TitleBar

    val image = new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB)
    val point = new Point()
    val tool = Toolkit.getDefaultToolkit()
    val cursor = tool.createCustomCursor(image,point,"")

    setCursor(cursor)
    
    if( !mDevice.isFullScreenSupported ) throw new Exception("FullScreen isnot supported")
    mDevice.setFullScreenWindow(this)

    val mode = new DisplayMode(WIDTH,HEIGHT,DEPTH,DisplayMode.REFRESH_RATE_UNKNOWN)
    mDevice.setDisplayMode(mode)
}


最初のUndecoratedはタイトルバーを非表示にします。
image うんたら cursor まではカーソルを消す処理を行っています。
1x1の透明なものをカーソルとして登録することで消していますね。


事前に取得しておいたmDeviceを利用します。

private val mGE = GraphicsEnvironment.getLocalGraphicsEnvironment
private val mDevice = mGE.getDefaultScreenDevice
private val mBufferStrategy = getBufferStrategy


mDeviceを通じてsetFullScreenWindowにてフルスクリーン化を行います。
このとききちんと例外処理をしておくといいですよ。


フルスクリーン化したら画面モードを設定します。
ここで縦横の大きさとビットカラーを入れてあげる必要があります。
REFRESH_RATE_UNKNOWNは自動で更新せずに自分でやるという意味を持っています。



以上で、フルスクリーン化できます。


次はfpsやります。たぶん!