《Java 2D游戏编程入门》—— 1.7 全屏显示模式中的主动渲染

    xiaoxiao2024-06-06  22

    本节书摘来异步社区《Java 2D游戏编程入门》一书中的第1章,第1.7节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.7 全屏显示模式中的主动渲染

    位于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
    最新回复(0)