日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

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

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