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やります。たぶん!