天天看點

《Java 2D遊戲程式設計入門》—— 1.6 修改顯示模式

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

要建立全屏的應用程式,需要修改顯示模式。displaymodetest如圖1.4所示,它使用了swing元件。這個示例也位于javagames.render包中。如果你還沒有編寫過任何的swing程式,一些代碼可能會看上去很陌生。有很多相關的圖書和教程可供參考,并且如果要詳細介紹swing所提供的所有功能,需要比這本書更大的篇幅。

《Java 2D遊戲程式設計入門》—— 1.6 修改顯示模式

這個示例應用程式列出了所有可用的螢幕分辨率,這允許使用者在全屏模式之間來回切換,以使用任何可用的顯示模式。這個示例不僅展示了使用swing元件程式設計,而且這段代碼還用來建立一個初始的遊戲界面,以供在切換到全屏遊戲之前使用。這使得使用者可以使用正常的swing元件來配置系統。

這個示例還包含了一個名為displaymodewrapper的内部類。盡管我并不癡迷于内部類,但這個類使得該示例更容易在單個檔案中展示。我甯願每個檔案中隻有一個類,在其他類的内部建立類以使它們可以通路私有方法這種做法很有趣,但為了簡短起見,我還是另尋它途。包裝類使用equals()方法隻比較顯示模式的寬度和高度,而不包括位深度或重新整理速率。根據作業系統的不同,很多顯示模式可能隻是在位深度或重新整理速率上有所差異:

640×480 32 bit 59 hz

640×480 32 bit 60 hz

640×480 32 bit 75 hz

640×480 16 bit 59 hz

640×480 16 bit 60 hz

由于該程式把顯示模式建立為32位并且忽略了其他模式,是以16位的模式是不可用的。為了讓軟體決定使用哪種重新整理速率,使用了refresh_rate_unknown值。通過這種方式,隻有640×480的顯示模式會被使用,而其他的模式會被略過。

構造方法包含了儲存目前顯示模式所需的代碼。在軟體啟動之前,這個模式和使用者系統的顯示模式進行比對。當應用程式傳回到視窗模式的時候,使用這個顯示模式來離開全屏模式。

// displaymodeexample.java

protected void onenterfullscreen() {

  if( graphicsdevice.isfullscreensupported() ) {

    displaymode newmode = getselectedmode();

    graphicsdevice.setfullscreenwindow( this );

    graphicsdevice.setdisplaymode( newmode );

  }

}<code>`</code>

onexitfullscreen()方法使用所儲存的顯示模式,将顯示傳回到視窗模式。這些方法的調用,是按照進入全屏模式時相反的順序來進行的。由于隻有在全屏模式中才可以修改顯示模式,是以在更改顯示模式之前必須先切換模式,并且在最初的顯示模式重置之前,不能設定回視窗模式。