「MonoGameで解像度を取得する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
 
(6人の利用者による、間の14版が非表示)
1行目: 1行目:
[[MonoGame]]では設定を「要望した解像度」と「実際の解像度」が異なり、環境に合わせて近似するベストな解像度が選ばれるようになっている。
+
[[MonoGame]]の解像度設定は「要望した解像度」と「実際の解像度」が異なり、環境に合わせて近似するベストな解像度が選ばれるようになっている。これは[[Android]]端末などでは[[液晶]]の解像度が事前に決まっており、こちらの要望は基本的に無視されるためである。
  
 
たとえばGameクラス(MonoGameにおける[[エントリポイント]]に相当するクラス)で以下のように解像度の設定を行ったとする。
 
たとえばGameクラス(MonoGameにおける[[エントリポイント]]に相当するクラス)で以下のように解像度の設定を行ったとする。
<source lang="csharp">
+
<syntaxhighlight lang="csharp">
            this.GraphicsDeviceManager.IsFullScreen = false;
+
GraphicsDeviceManager.IsFullScreen = false;
            this.GraphicsDeviceManager.PreferredBackBufferWidth = 720 ;
+
GraphicsDeviceManager.PreferredBackBufferWidth = 720 ;
            this.GraphicsDeviceManager.PreferredBackBufferHeight = 1232 ;
+
GraphicsDeviceManager.PreferredBackBufferHeight = 1232 ;
            this.GraphicsDeviceManager.ApplyChanges();
+
GraphicsDeviceManager.ApplyChanges();
</source>
+
</syntaxhighlight >
  
しかし実際には異なる解像度が設定されることになる。
+
これが[[Windows]]や[[Mac]]で実行した場合はよほどのことが無い限り要望した解像度になるだろう。しかし[[Android]]では[[カタログスペック]]の解像度ではなく、上部のステータスバーや下部のナビゲーションバーを除いた領域が実効解像度となるため、それらを考慮した「もっとも近似する解像度」が設定される(詳細は「[[MonoGameで解像度を設定する]]」を参照)。ホームボタンが物理ボタンの機種がほとんどなくなったので注意しよう。
実際の解像度は以下のプロパティで取得できる。
 
<source lang="csharp">
 
            this.GraphicsDevice.PresentationParameters.BackBufferWidth;
 
            this.GraphicsDevice.PresentationParameters.BackBufferHeight;
 
</source>
 
  
 +
実効解像度は以下のプロパティで取得できる。
 +
<syntaxhighlight lang="csharp">
 +
GraphicsDevice.PresentationParameters.BackBufferWidth;
 +
GraphicsDevice.PresentationParameters.BackBufferHeight;
 +
</syntaxhighlight >
 +
 +
ちなみにカタログスペックの解像度は以下のプロパティで取得できる。
 +
<syntaxhighlight>
 +
//
 +
GraphicsDevice.DisplayMode.Width;
 +
GraphicsDevice.DisplayMode.Height;
 +
//または
 +
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
 +
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
 +
</syntaxhighlight>
 +
 +
== 注意点 ==
 
なお、解像度を要望する(反映させる)GraphicsDeviceManager.ApplyChangesメソッドは以下の点に注意すること。
 
なお、解像度を要望する(反映させる)GraphicsDeviceManager.ApplyChangesメソッドは以下の点に注意すること。
* Gameクラスのコンストラクタ内で呼び出しても無反応
+
* [[MonoGame/クラスライブラリ/Gameクラス|Gameクラス]]のコンストラクタ内で呼び出しても無反応。
* 明示的に呼び出す場合はGameクラスのInitializeメソッドが呼ばれたタイミングで利用可能となる
+
* 明示的に呼び出す場合は[[MonoGame/クラスライブラリ/Gameクラス|Gameクラス]]のInitializeメソッドが呼ばれたタイミングで利用可能となる。
* 暗黙的にGameクラスのbase.Initialize()の中でも実行されている模様
+
* 暗黙的に[[MonoGame/クラスライブラリ/Gameクラス|Gameクラス]]のbase.Initialize()の中でも実行されている模様
 
*: base.Initializeメソッドを呼び出した時点で[[ゲームループ]]が走り出すので注意。
 
*: base.Initializeメソッドを呼び出した時点で[[ゲームループ]]が走り出すので注意。
  
==関連項目==
+
== 関連項目 ==
*[[MonoGame]]
+
* [[MonoGameで解像度を設定する]]
 
+
* [[MonoGame (Xamarin.Android)で初期解像度がおかしい機種の対策]]
==参考文献==
 
{{reflist}}
 
 
 
{{stub}}
 
  
[[category:Xamarin]]
+
[[category: MonoGame]]
[[category:MonoMac]]
+
[[category: MonoMac]]
[[category:MonoGame]]
+
[[category: Xamarin.Mac]]
 +
[[category: Xamarin.iOS]]
 +
[[category: Xamarin.Android]]

2020年9月15日 (火) 07:01時点における最新版

MonoGameの解像度設定は「要望した解像度」と「実際の解像度」が異なり、環境に合わせて近似するベストな解像度が選ばれるようになっている。これはAndroid端末などでは液晶の解像度が事前に決まっており、こちらの要望は基本的に無視されるためである。

たとえばGameクラス(MonoGameにおけるエントリポイントに相当するクラス)で以下のように解像度の設定を行ったとする。

GraphicsDeviceManager.IsFullScreen = false;
GraphicsDeviceManager.PreferredBackBufferWidth  =  720 ;
GraphicsDeviceManager.PreferredBackBufferHeight = 1232 ;
GraphicsDeviceManager.ApplyChanges();

これがWindowsMacで実行した場合はよほどのことが無い限り要望した解像度になるだろう。しかしAndroidではカタログスペックの解像度ではなく、上部のステータスバーや下部のナビゲーションバーを除いた領域が実効解像度となるため、それらを考慮した「もっとも近似する解像度」が設定される(詳細は「MonoGameで解像度を設定する」を参照)。ホームボタンが物理ボタンの機種がほとんどなくなったので注意しよう。

実効解像度は以下のプロパティで取得できる。

GraphicsDevice.PresentationParameters.BackBufferWidth;
GraphicsDevice.PresentationParameters.BackBufferHeight;

ちなみにカタログスペックの解像度は以下のプロパティで取得できる。

//
GraphicsDevice.DisplayMode.Width;
GraphicsDevice.DisplayMode.Height;
//または
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;

注意点[編集 | ソースを編集]

なお、解像度を要望する(反映させる)GraphicsDeviceManager.ApplyChangesメソッドは以下の点に注意すること。

  • Gameクラスのコンストラクタ内で呼び出しても無反応。
  • 明示的に呼び出す場合はGameクラスのInitializeメソッドが呼ばれたタイミングで利用可能となる。
  • 暗黙的にGameクラスのbase.Initialize()の中でも実行されている模様
    base.Initializeメソッドを呼び出した時点でゲームループが走り出すので注意。

関連項目[編集 | ソースを編集]