本节书摘来异步社区《Java 2D游戏编程入门》一书中的第1章,第1.7节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。
位于javagames.render包中的FullScreenRenderingExample,包含了主动渲染框架和切换到全拼模式的显示模式代码;它创建了一个简单的全屏游戏框架。这个示例包含了前面各部分中展示的很多代码。此外还可以直接给JFrame设置背景颜色并且忽略重绘,以及设置setUndecorated()标志。由于在前面的示例中应用程序是从窗口模式切换到全屏模式的,因此没有设置该标志;但是当只使用全屏模式的时候,应该对JFrame进行该项设置。
保存当前的显示模式,切换到全屏模式,并且修改显示模式之后,应使用JFrame方法而不是窗口模式示例中的Canvas方法来创建缓冲策略。
即便还没有涉及键盘,但你还是需要知道退出程序的一些方法。因为JFrame是未装饰的,所以没有控件能够关闭窗口。当用户按下Escape键的时候,如下的代码将会关闭应用程序。
// FullScreenRenderingExample.java addKeyListener( new KeyAdapter() { public void keyPressed( KeyEvent e ) { if( e.getKeyCode() == KeyEvent.VK_ESCAPE ) { shutDown(); } } });``` 在这个示例中,为了简单起见,显示模式直接编码为800×600、32位。在实际的产品级应用程序中,可用的显示模式应该像前面例子中那样进行枚举。如果你的系统不支持这种显示模式,请确保修改你的代码。private DisplayMode getDisplayMode() { return new DisplayMode( 800, 600, 32, DisplayMode.REFRESH_RATE_UNKNOWN );}`由于没有办法关闭该窗口,也就不需要有一个窗口监听器。当按下Escape键并且示例关闭时,在游戏循环关闭后,显示模式返回为常规模式。
package javagames.render; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import javagames.util.*; public class FullScreenRenderingExample extends JFrame implements Runnable { private FrameRate frameRate; private BufferStrategy bs; private volatile boolean running; private Thread gameThread; private GraphicsDevice graphicsDevice; private DisplayMode currentDisplayMode; public FullScreenRenderingExample() { frameRate = new FrameRate(); } protected void createAndShowGUI() { setIgnoreRepaint( true ); setUndecorated( true ); setBackground( Color.BLACK ); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); graphicsDevice = ge.getDefaultScreenDevice(); currentDisplayMode = graphicsDevice.getDisplayMode(); if( !graphicsDevice.isFullScreenSupported() ) { System.err.println( "ERROR: Not Supported!!!" ); System.exit( 0 ); } graphicsDevice.setFullScreenWindow( this ); graphicsDevice.setDisplayMode( getDisplayMode() ); createBufferStrategy( 2 ); bs = getBufferStrategy(); addKeyListener( new KeyAdapter() { public void keyPressed( KeyEvent e ) { if( e.getKeyCode() == KeyEvent.VK_ESCAPE ) { shutDown(); } } }); gameThread = new Thread( this ); gameThread.start(); } private DisplayMode getDisplayMode() { return new DisplayMode( 800, 600, 32, DisplayMode.REFRESH_RATE_UNKNOWN ); } public void run() { running = true; frameRate.initialize(); while( running ) { gameLoop(); } } public void gameLoop() { do { do { Graphics g = null; try { g = bs.getDrawGraphics(); g.clearRect( 0, 0, getWidth(), getHeight() ); render( g ); } finally { if( g != null ) { g.dispose(); } } } while( bs.contentsRestored() ); bs.show(); } while( bs.contentsLost() ); } private void render( Graphics g ) { frameRate.calculate(); g.setColor( Color.GREEN ); g.drawString( frameRate.getFrameRate(), 30, 30 ); g.drawString( "Press ESC to exit...", 30, 60 ); } protected void shutDown() { try { running = false; gameThread.join(); System.out.println( "Game loop stopped!!!" ); graphicsDevice.setDisplayMode( currentDisplayMode ); graphicsDevice.setFullScreenWindow( null ); System.out.println("Display Restored..."); } catch( InterruptedException e ) { e.printStackTrace(); } System.exit( 0 ); } public static void main( String[] args ) { final FullScreenRenderingExample app = new FullScreenRenderingExample(); SwingUtilities.invokeLater( new Runnable() { public void run() { app.createAndShowGUI(); } }); } 相关资源:敏捷开发V1.0.pptx