トップページ > 過去ログ > 記事閲覧
フルスクリーン時の解像度の変更
名前:コーラ 日時: 2009/07/08 22:18

すみません、もうひとつ質問をお願いします SetGraphModeで解像度の変更を行うと、ウインドゥモードの解像度は問題なく変わるのですが フルスクリーンの場合に変更が効かないことがあります。 フルスクリーンでも、640*480、800*600では問題なく出来ています。 しかし、1024*576などに設定すると変更が効きません。640*480になっているようです。 いずれの場合もウインドゥモードでは問題なくできます。 おそらく私のやり方が悪いのだと思うのですが、何か推測できる原因などがありましたら、ご教授お願いします。

Page: 1 |

Re: フルスクリーン時の解像度の変更 ( No.1 )
名前:レタス 日時:2009/07/09 00:23

ライブラリの中身までは知らないのですが、 単にグラフィックカードがその解像度に対応して無いのではないでしょうか。 1024*768ならいけると思いますが。 WSVGAって珍しいですね…16:9ってワイドテレビ用か何かですか? 頒布される場合、対応して無いケースが(640*480,800*600,1024*768に比べ)多いと思うので避けた方がいいのではと思うのですが。
Re: フルスクリーン時の解像度の変更 ( No.2 )
名前:コーラ 日時:2009/07/09 02:22

あぁそうでした フルスクリーンはそのときの解像度にモニタが対応してないとダメですよね。 深く考えたことがないのでうっかりしていました。 では、モニタに対応していない解像度で描画されたゲームを、フルスクリーンにするにはどうすればいいのでしょうか? 私が現段階で考えられるのは 下のスレッドで見た、描画可能な画像にゲーム画面を書き込んでいき、最後にそれをDrawExtendGraphで拡大する方法しかありません。 デスクトップ解像度を取得し、それをSetGraphModeに入れて、アスペクト比も固定します。 こんなんでいいのでしょうか・・・
Re: フルスクリーン時の解像度の変更 ( No.3 )
名前:管理人 日時:2009/07/13 00:18

コーラさんがお考えの方法で良いと思います ただ、デスクトップ画面は大抵ゲームで使用する画面より高解像度なので、デスクトップ画面と 同じサイズを DrawExtendGraph で描画すると少し描画負荷が高すぎるかもしれません なので、モニタが対応しているゲーム画面より高解像度な最低解像度のフルスクリーンモードに したあと、コーラさんの考えられた方法を実践するのが良いと思います と書いたところで、DXライブラリに変更可能な画面モードを取得するための機能がないことに 気付きました 変更可能な画面モードを取得する機能を追加したバージョンをアップしましたので、よろしければ こちらをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) 追加した関数は以下の二つです // 変更可能なディスプレイモードの数を取得する int GetDisplayModeNum( void ) ; // 変更可能なディスプレイモードの情報を取得する( ModeIndex は 0 〜 GetDisplayModeNum の戻り値-1 ) DISPLAYMODEDATA GetDisplayMode( int ModeIndex ) ; GetDisplayMode 関数の戻り値である DISPLAYMODEDATA 構造体は以下のようになっています // 画面モード情報データ型 struct DISPLAYMODEDATA { int Width ; // 横解像度 int Height ; // 縦解像度 int ColorBitDepth ; // 色ビット数 int RefreshRate ; // リフレッシュレート( -1 の場合は規定値 ) } ; 最初に GetDisplayModeNum で変更可能なディスプレイモードの数を取得した後、 その数だけ GetDisplayMode を呼んで、希望する画面モードがあるかどうかを調べる、 といった使い方をします 例えば、変更可能なディスプレイモードの情報を一覧表示するプログラムは以下のようになります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { DISPLAYMODEDATA ModeData ; int i, ModeNum ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // フォントサイズを小さくする SetFontSize( 10 ) ; // フォントの線を細くする SetFontThickness( 0 ) ; // ディスプレイモードの数を取得する ModeNum = GetDisplayModeNum() ; // ディスプレイモードの数だけループする for( i = 0 ; i < ModeNum ; i ++ ) { // ディスプレイモードの情報を取得する ModeData = GetDisplayMode( i ) ; // 画面にディスプレイモードの情報を描画する DrawFormatString( 0, i * 11, GetColor( 255,255,255 ), "%dx%d %dbit %dHz", ModeData.Width, ModeData.Height, ModeData.ColorBitDepth, ModeData.RefreshRate ) ; } // キーが押されるまで待つ WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } こちらの機能を使用して ゲーム画面と同じサイズの画面が使用できるか調べる→使用できる場合は特別な処理なし ↓ 使用できない場合はゲーム画面より大きい画面モードを捜す ↓ 見つけたらその画面モードで SetGraphMode する ↓ DxLib_Init ↓ ゲーム画面の大きさの描画可能な画像を作成して、裏画面の代わりに使用する ( SetDrawValidGraphCreateFlag( TRUE ) ; と MakeGraph と SetDrawScreen を使用 ) ↓ ScreenFlip をする前に描画可能画像を画面いっぱいに DrawExtendGraph で描画 ↓ ScreenFlip という感じにすると描画速度的には良いです ただ、ゲーム画面と実際の画面の解像度が異なる場合は、実際の画面の解像度が ゲーム画面の解像度に対して整数倍であるか、そうでない場合は解像度が高ければ 高いほど解像度の違いによるドットの歪みが少なくなるので、描画速度を優先しない場合は ゲーム画面が収まる最低解像度よりも高解像度にした方が見た目は良くなります
Re: フルスクリーン時の解像度の変更 ( No.4 )
名前:コーラ 日時:2009/07/19 00:42

おぉ、わざわざ別バージョンまで・・・ 管理人さん本当にありがとうございます 実は試行錯誤中に、ゲーム画面を圧縮してその画面の汚さにびっくりしたり、 デスクトップ解像度まで拡大する方法を取った後も、 普通のゲームは解像度選択をするはず、などと唸っていました。 今回、なんとなく使っていたフルスクリーンモードについて色々考えさせられ、とても勉強になりました。

Page: 1 |