LibGDX圖形模塊之查詢與配置圖形界面

配置和查詢

libGDX有一個精心設計的API,可讓您查詢監(jiān)視器和顯示模式,并切換垂直同步(vsync)。 這可以在配置應用程序或運行時完成。

注意:Android和iOS不支持顯示模式更改

查詢和設置顯示器和顯示模式(運行時)

在配置時查詢監(jiān)視器和顯示模式是平臺相關的.以下小節(jié)說明了在每個平臺上可以對顯示器和顯示模式做些什么鹏秋。

LWJGL平臺

使用默認的LWJGL 2后端,您可以獲得主監(jiān)視器的可用顯示模式亡笑,如下所示:

DisplayMode[] modes = LwjglApplicationConfiguration.getDisplayModes();

您可以獲得主監(jiān)視器(也稱為桌面模式)的當前顯示模式侣夷,如下所示:

DisplayMode desktopMode = LwjglApplicationConfiguration.getDesktopDisplayMode();

一旦你有一個DisplayMode,你可以在LwjglApplicationConfiguration上設置它:

DisplayMode displayMode = LwjglApplicationConfiguration.getDesktopDisplayMode();
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.setFromDisplayMode(displayMode);
new LwjglApplication(new MyAppListener(), config);

您的應用程序將以全屏模式啟動(使用DisplayMode對象中的分辨率)仑乌。
要在窗口模式下啟動應用程序百拓,只需指定窗口的寬度和高度:

LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.width = 800;
config.height = 600;
new LwjglApplication(new MyAppListener(), config);

您還可以通過指定相對于監(jiān)視器當前顯示模式的左上角坐標琴锭,將窗口放在主監(jiān)視器特定位置上:

config.x = 100;
config.y = 100;

要使窗口居中,請使用-1作為坐標(默認值)衙传。
最后决帖,您還可以指定應用程序是否應啟用vsync(垂直同步):

config.vSyncEnabled = true;

LWJGL 3平臺

當涉及顯示器和顯示模式時,LWJGL 3后端更加精細蓖捶。 與LWJGL 2后端不同地回,它支持多顯示器設置。
在配置時查詢所有可用的顯示器的代碼如下:

Monitor[] monitors = Lwjgl3ApplicationConfiguration.getMonitors();

要獲得主顯示器:

Monitor primary = Lwjgl3ApplicationConfiguration.getPrimaryMonitor();

要獲取顯示器的所有支持的顯示模式俊鱼,請調用:

DisplayMode[] displayModes = Lwjgl3ApplicationConfiguration.getDisplayModes(monitor);

要獲取顯示器的當前顯示模式刻像,請撥打:

DisplayMode desktopMode = Lwjgl3ApplicationConfiguration.getDisplayMode(monitor);

獲取主顯示器的顯示模式也有一些困難:

DisplayMode[] primaryDisplayModes = Lwjgl3ApplicationConfiguration.getDisplayModes();
DisplayMode primaryDesktopMode = Lwjgl3ApplicationConfiguration.getDisplayMode();

當你得到了DisplayMode ,您可以將其設置到Lwjgl3ApplicationConfiguration上:

DisplayMode primaryMode = LWjgl3ApplicationConfiguration.getDisplayMode();
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setFullscreenMode(primaryMode);
new Lwjgl3ApplicationConfiguration(new MyAppListener(), config);

如此并闲,將使得主顯示器以設置好的顯示模式以全屏的模式啟動细睡,如果你使用其他顯示器的顯示模式啟動當前顯示器,它也會以當前的顯示模式全屏啟動帝火,但是可能會失斄镝恪(因為可能不存在該顯示模式).

注意:建議始終使用顯示器的當前顯示模式,其他顯示模式可能會失敗。
要在窗口模式下啟動應用程序购公,請在配置中調用此方法:

Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setWindowedMode(800, 600);

這將在主顯示器上以窗口模式啟動您的應用程序萌京。 如果你要設置窗口的精確位置:

config.setWindowPosition(100, 100);

您還可以指定您的窗口是否應該調整大小,以及是否有裝飾(窗口標題欄宏浩,邊框):

config.setResizable(false);
config.setDecorated(false);

The LWJGL 3 backend also allows you to specify how to deal with HDPI monitors. The operating system may report logical sizes and coordinates instead of pixel-based coordinates to you for drawing surface sizes or mouse events. E.g. on a Macbook Pro with a retina display running Mac OS X, the OS reports only half the width/height of the underlying pixel surface. The LWJGL 3 backend can report drawing surface sizes as returned by Gdx.graphics.getWidth()/getHeight() and mouse coordinates either in those logical coordinates, or in pixel coordinates. To configure this behaviour, set a HDPI mode:

LWJGL 3后端還允許您指定如何處理HDPI監(jiān)視器,要配置此行為知残,請設置HDPI模式:

config.setHdpiMode(HdpiMode.Logical);

This will report mouse coordinates and drawing surface sizes in logical coordinates. It is also the default for this backend. If you want to work in raw pixels, use HdpiMode.Pixels. Note that when using logical coordinates, you will have to convert these to pixel coordinates for OpenGL functions like glScissor, glViewport or glReadPixels. All libGDX classes calling these functions will take into account the HdpiMode you set. If you call these functions yourself, use HdpiUtils.

運行時查詢和設置顯示器和顯示模式

LibGDX通過Graphics 接口提供API,可以在運行時查詢監(jiān)視器比庄,顯示模式和其他相關方面求妹。 一旦知道可能的配置,你可以設置它們佳窑,例如 切換到全屏模式制恍,或切換垂直同步。

檢查是否支持顯示模式更改

只有一部分平臺支持顯示模式更改神凑。 值得注意的是净神,Android和iOS不支持切換到任意全屏顯示模式。 更改顯示模式之前檢查您的應用程序當前正在運行的平臺是否支持顯示模式更改是一個不錯的習慣:

if(Gdx.graphics.supportsDisplayModeChange()) {
   // change display mode if necessary
}

請注意鹃唯,圖形中所有與顯示模式有關的功能將不會在不支持顯示模式更改的平臺上執(zhí)行任何操作瓣喊。

查詢監(jiān)視器

要查詢所有連接的顯示器藻三,請使用以下方法:

Monitor[] monitors = Gdx.graphics.getMonitors();

在Android熄求,iOS抡四,GWT和LWJGL 2后端指巡,只有主顯示器才會被返回藻雪, LWJGL 3后端返回所有連接的顯示器勉耀。

如果僅僅查詢主監(jiān)視器,請使用:

Monitor primary = Gdx.graphics.getPrimaryMonitor();

要查詢當前窗口所在的顯示器至壤,可以調用如下代碼:

Monitor currMonitor = Gdx.graphics.getMonitor();

It is good practice to toggle full-screen on the monitor the window is on, instead of say the primary monitor. This allows users to move the application window to another monitor, and then enable full-screen mode there.

查詢顯示模式

一旦你有了Monitor 實例后,您可以查詢其支持的顯示模式:

DisplayMode[] modes = Gdx.graphics.getDisplayModes(monitor);

要獲取當前顯示模式镰绎,請使用以下方法:

DisplayMode currMode = Gdx.graphics.getDisplayMode(monitor);

切換到全屏模式

使用來自特定顯示器的DisplayMode,您可以切換到全屏吗讶,如下所示:

Monitor currMonitor = Gdx.graphics.getMonitor();
DisplayMode displayMode = Gdx.graphics.getDisplayMode(monitor);
if(!Gdx.graphics.setFullscreenMode(displayMode)) {
   // switching to full-screen mode failed
}

如果切換到全屏模式失敗照皆,后端將恢復最后一個窗口模式配置论寨。

切換到窗口模式

要更改窗口的大小,或從全屏模式切換到窗口模式室奏,請使用以下方法:

Gdx.graphics.setWindowedMode(800, 600);

將窗口設置為窗口模式,并將其定位在調用此方法之前的顯示器上绒怨。

多窗口API(LWJGL 3后端)

一些應用程序(如編輯器或其他僅限桌面的工具)可從多窗口設置中受益。 LWJGL 3后端提供了一個額外的非跨平臺API來創(chuàng)建多個窗口。

每一個程序都是配置窗口屬性開始:

Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setWindowedMode(800, 600);
new Lwjgl3ApplicationConfiguration(new MyMainWindowListener(), config);

在這個例子中疗疟,窗口由MyMainWindowListener(一個標準的ApplicationListener)驅動。 libGDX不直接報告圖標化或焦點丟失等事件瞳氓。 為此策彤,LWJGL 3后端引入了一個名為Lwjgl3WindowListener的桌面專用接口。 您可以提供此接口的實現(xiàn)來接收和響應這些事件:

config.setWindowListener(new Lwjgl3WindowListener() {
   @Override
   public void iconified() {
      // the window is not visible anymore, potentially stop background
      // work, mute audio, etc.
   }

   @Override
   public void deiconified() {
      // the window is visible again, start-up background work, unmute
      // audio, etc.
   }
 
   @Override
   public void focusLost() {
      // the window lost focus, pause the game
   }

   @Override
   public void focusGained() {
      // the window received input focus, unpause the game
   }

   @Override
   public boolean windowIsClosing() {
      // if there's unsaved stuff, we may not want to close 
      // the window, but ask the user to save her work
      if(isStuffUnsaved) {
         // tell our app listener to show a save dialog
         return false;
      } else {
         // OK, the window may close
         return true;
      }
});

如果窗口失去焦點顿膨,LWJGL 3后端不會報告暫停和恢復事件锅锨。 只有在應用程序被 iconfified/deiconified 時才會報告暫停和恢復事件,或者應用程序關閉恋沃。

為了產生其他窗口必搞,您的代碼需要將Gdx.app轉換為Lwjgl3Application。 這只有在您的項目直接依賴于LWJGL 3后端時才可能囊咏。 您將無法與其他平臺共享此類代碼恕洲。 一旦你有一個Lwjgl3Application,你可以創(chuàng)建一個這樣的新窗口:

Lwjgl3Application lwjgl3App = (Lwjgl3Application)Gdx.app;
Lwjgl3WindowConfiguration windowConfig = new Lwjgl3WindowConfiguration();
windowConfig.setWindowListener(new MyWindowListener());
windowConfig.setTitle("My other window");
Lwjgl3Window window = Lwjgl3App.newWindow(new MyOtherWindowAppListener(), windowConfig);

建議讓每個窗口都有自己的ApplicationListener梅割。 一個應用程序的所有窗口在同一個線程上更新霜第,一個接一個。 LWJGL 3后端將確保為當前正在更新的窗口設置靜態(tài)Gdx.graphics和Gdx.input户辞。 這意味著您的ApplicationListener本質上可以忽略其他窗口泌类,并且假裝它是城里唯一的監(jiān)聽器。

這有一個例外底燎。 當使用Gdx.app.postRunnable()時刃榨,LWJGL 3后端無法決定Runnable已經發(fā)布了哪個窗口弹砚。 例如。 該方法可能已經從工作線程被調用枢希,并且在Runnable被發(fā)布的時候桌吃,當前可以更新不同的窗口。 要解決這個問題苞轿,建議將窗口特定的Runnable實例直接發(fā)送到窗口:
····java
// e.g. in a worker thread
window.postRunnable(new MyRunnable());
····
這樣可以確保在執(zhí)行Runnable時為特定窗口設置靜態(tài)Gdx.graphics和Gdx.input茅诱。

Lwjgl3Window類有其他方法可以修改Windows屬性。 您可以在ApplicationListener中獲取當前窗口搬卒,然后繼續(xù)修改它:

// in ApplicationListener#render()
Lwjgl3Window window = ((Lwjgl3Graphics)Gdx.graphics).getWindow();
window.setVisible(false); // hide the window
window.iconifyWindow(); // iconify the window
window.deiconifyWindow(); // deiconify window
window.closeWindow(); // close the window, also disposes the ApplicationListener

//TODO 待續(xù)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瑟俭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子契邀,更是在濱河造成了極大的恐慌尔当,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹂安,死亡現(xiàn)場離奇詭異椭迎,居然都是意外死亡,警方通過查閱死者的電腦和手機田盈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門畜号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人允瞧,你說我怎么就攤上這事简软。” “怎么了述暂?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵痹升,是天一觀的道長。 經常有香客問我畦韭,道長疼蛾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任艺配,我火速辦了婚禮察郁,結果婚禮上,老公的妹妹穿的比我還像新娘转唉。我一直安慰自己皮钠,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布赠法。 她就那樣靜靜地躺著麦轰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上款侵,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天驯嘱,我揣著相機與錄音,去河邊找鬼喳坠。 笑死,一個胖子當著我的面吹牛茂蚓,可吹牛的內容都是我干的壕鹉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聋涨,長吁一口氣:“原來是場噩夢啊……” “哼晾浴!你這毒婦竟也來了?” 一聲冷哼從身側響起牍白,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脊凰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茂腥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸涌,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年最岗,在試婚紗的時候發(fā)現(xiàn)自己被綠了帕胆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡般渡,死狀恐怖懒豹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情驯用,我是刑警寧澤脸秽,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蝴乔,受9級特大地震影響记餐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜薇正,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一剥扣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铝穷,春花似錦钠怯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春断国,著一層夾襖步出監(jiān)牢的瞬間贤姆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工稳衬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霞捡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓薄疚,卻偏偏與公主長得像碧信,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子街夭,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理砰碴,服務發(fā)現(xiàn),斷路器板丽,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識體系呈枉,同時積累實際應用經驗。因此有了從使用AVFounda...
    RichardJieChen閱讀 5,669評論 5 12
  • 再有聯(lián)系是七年以后埃碱,一直覺得七年是個很神奇的存在猖辫,科學說七年時間身體的細胞就會更新一次,所以砚殿,想要忘記一個...
    迷鹿橙子閱讀 181評論 0 0
  • 廣袤無垠的宇宙世界中,有許許多多的行星名党。有的無比耀眼叹阔,得到了無數(shù)人的關注;有的自由自在传睹,隨著自己隨心所欲耳幢;有...
    朝陽中的那抹燦爛閱讀 553評論 0 0