《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口
本節書摘來異步社區《Java 2D游戲編程入門》一書中的第1章,第1.5節,作者:【美】Timothy Wright(萊特),更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
1.5 創建一個主動渲染的窗口
可以使用主動渲染,將渲染代碼從事件分派線程移動到定制游戲線程。Windows類和Canvas類是兩個可用的類,它們允許創建一個BufferStrategy。通過添加畫布,我們可以訪問緩沖策略,并且強迫畫布的大小與所要求的大小完全一致,就像Hello World應用程序中的JPanel示例一樣。
由于渲染循環為應用程序完成了所有的繪制,因此可以在JFrame上設置setIgnoreRepaint()標志。調用Canvas.createBufferStrategy(),傳入想要緩沖的數目,然后調用Canvas.getBufferStrategy()創建主動渲染所需的緩沖。由于應用程序正在處理繪制,因此這里不需要響應重繪方法。Component.setIgnoreRepaint()方法負責忽略額外的繪制消息。
如果在窗口布局之前創建了BufferStrategy的話,將會有一個奇怪的錯誤發生:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Component must have a valid peer``` 調用pack()方法可以解決這個問題。如果拋出了前面的異常,要注意,在嘗試創建BufferStrategy 之前,確保Component是可見的或者已經包裝了。 游戲循環現在執行渲染,就像之前的小節中所討論的那樣。使用getDrawGraphics()、contentsLost()、show()和dispose()方法,渲染循環控制了應用程序繪圖。一旦圖形對象變得可用,并且之前的屏幕已經清除了,就可以渲染場景了。ActiveRenderingExample代碼可以在javagames.render包中找到。package javagames.render;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javagames.util.*;
public class ActiveRenderingExample extends JFrame implements Runnable {
private FrameRate frameRate;
private BufferStrategy bs;
private volatile boolean running;
private Thread gameThread;
public ActiveRenderingExample() {
frameRate = new FrameRate();
}
protected void createAndShowGUI() {
Canvas canvas = new Canvas();
canvas.setSize( 320, 240 );
canvas.setBackground( Color.BLACK );
canvas.setIgnoreRepaint( true );
getContentPane().add( canvas );
setTitle( "Active Rendering" );
setIgnoreRepaint( true );
pack();
setVisible( true );
canvas.createBufferStrategy( 2 );
bs = canvas.getBufferStrategy();
gameThread = new Thread( this );
gameThread.start();
}
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 );
}
protected void onWindowClosing() {
try {
running = false;
gameThread.join();
} catch( InterruptedException e ) {
e.printStackTrace();
}
System.exit( 0 );
}
public static void main( String[] args ) {
final ActiveRenderingExample app = new ActiveRenderingExample();
app.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
app.onWindowClosing();
}
});
SwingUtilities.invokeLater( new Runnable() {
public void run() {
app.createAndShowGUI();
}
});
}
}`
總結
以上是生活随笔為你收集整理的《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《ZEMAX光学设计超级学习手册》一一2
- 下一篇: 《Photoshop修饰与合成专业技法》