赞
踩
本节书摘来异步社区《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();
}
});
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。