日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

《Java 2D游戏编程入门》—— 1.5 创建一个主动渲染的窗口

發布時間:2025/3/18 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《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 创建一个主动渲染的窗口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。