本節書摘來異步社群《java 2d遊戲程式設計入門》一書中的第1章,第1.2節,作者:【美】timothy wright(萊特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
圖1.1所示的hello world應用程式是第一個遊戲視窗的示例。helloworldapp位于javagames.render包中。除了清除和重新繪制背景,這個視窗中不再渲染其他内容。helloworldapp擴充了jframe類,這是java的swing庫中一個頂級的視窗元件。這個應用程式包含一個framerate對象,該對象用來測量應用程式的幀速率。
由于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>