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

本节书摘来异步社区《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();

}

});

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值