天天看點

《Java 2D遊戲程式設計入門》—— 1.2 建立Hello World應用程式

本節書摘來異步社群《java 2d遊戲程式設計入門》一書中的第1章,第1.2節,作者:【美】timothy wright(萊特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

圖1.1所示的hello world應用程式是第一個遊戲視窗的示例。helloworldapp位于javagames.render包中。除了清除和重新繪制背景,這個視窗中不再渲染其他内容。helloworldapp擴充了jframe類,這是java的swing庫中一個頂級的視窗元件。這個應用程式包含一個framerate對象,該對象用來測量應用程式的幀速率。

《Java 2D遊戲程式設計入門》—— 1.2 建立Hello World應用程式

由于swing庫不是線程安全的,是以你應該總是在swing事件線程上建立并展示一個jframe。然而,該程式的main()方法并不是在事件線程上調用的,是以,必須要使用swingutilities類來啟動遊戲視窗。通過使用swingutilities類,我們在相同的線程上建立了gui元件。在使用swing元件進行渲染的時候,遵從java對于線程的規則是很重要的,因為忽略這些規則可能會導緻不确定的行為,而這些行為是很難調試的。

我知道有的程式員會針對要在整個站點上部署的應用程式注釋掉swingutilities代碼,以測試是否真的需要swingutilities類來啟動遊戲視窗。每過幾天,一些人就會報告應用程式在剛啟動的時候崩潰。注意,我從來不會做這種事情,但這種做法似乎确實管用。

package javagames.render;

import java.awt.*;

import javax.swing.*;

import javagames.util.*;

public class helloworldapp extends jframe {

  private framerate framerate;

  public helloworldapp() {

    framerate = new framerate();

  }

  protected void createandshowgui() {

    gamepanel gamepanel = new gamepanel();

    gamepanel.setbackground( color.black );

    gamepanel.setpreferredsize( new dimension( 320, 240 ) );

    getcontentpane().add( gamepanel );

    setdefaultcloseoperation( exit_on_close );

    settitle( "hello world!" );

    pack();

    framerate.initialize();

    setvisible( true );

  private class gamepanel extends jpanel {

    public void paint( graphics g ) {

      super.paint( g );

      onpaint( g );

    }

  protected void onpaint( graphics g ) {

    framerate.calculate();

    g.setcolor( color.white );

    g.drawstring( framerate.getframerate(), 30, 30 );

    repaint();

  public static void main( string[] args ) {

    final helloworldapp app = new helloworldapp();

    swingutilities.invokelater( new runnable() {

      public void run() {

        app.createandshowgui();

      }

    });

}<code>`</code>