トップページ > 過去ログ > 記事閲覧
ワイド画面モニタへの対応
名前:だみあん 日時: 2009/06/11 23:33

DXライブラリを活用させていただいております。 以前から、もう一つの掲示板の方でDirectX7ベースの現在のものから DirectX9版への移行を示唆されていますが DirectX9版のほうでは、ライブラリレベルで ワイド画面モニタでのフルスクリーンのアスペクト比問題 (4:3のゲーム画面を他のアスペクト比のワイドモニタでフルスクリーン表示すると、画像が横にのびたりしてしまう問題) はサポートされているのでしょうか? 8/9系では、Directx側でサポート可能らしいので。 現状、ワイド画面が一般化してきている昨今、 ハードやドライバでのアスペクト比固定の機能も今後は安価なモニタでも搭載されたりとか 一般化していくのでしょうが…… 現状ではその辺はまったく不十分なので… 将来的な事はともかく、 現状のライブラリでの事なのですが、 うちの液晶は16:10のワイド画面なのに、16:10のフルスクリーンモードが存在しない? 安物ポンコツモニタなので、もともとのゲーム画面をワイド用にすると言うことすら出来ない (画面モード一覧では16:10のモードが1680*1050しか無い…) ので、1280×800のサイズなどでつくっても、うちではフルスクリーンでは プレイできないことに。 (実際やってみると、該当のモードがないため、強制的に640*480のフルスクリーンにw ためしに1680*1050サイズのゲーム画面にしてみると、こんどは画面真っ黒で応答無しに…) フルスクリーンを切り捨てて、ウィンドウサイズ自体を大きくして拡大表示する方法を 救済処置としてコンフィグで選択出来るようにしたのですが (拡大処理のピクセルぼけを嫌って、拡大無しで余白部分を増やすモードとかも考えてます) 1680*1050(16:10)で800*600のゲーム画面のばあい 1050/600=1.75ということで SetWindowSizeExtendRate( 1.75 ) ; としたらとりあえずこのケースの場合、高さの分は画面一杯になるのですが 当然、横が空いてしまいます。 がSetWindowSizeExtendRateはウィンドウのサイズごと変更するだけで SetWindowSizeChangeEnableFlagをTRUEにした場合のウィンドウサイズの指定を ユーザーでなく、PG側で倍率指定&固定出来るだけの関数といった感じなんですよね。 なので、空白部分を黒で埋めるような形にしたいので 倍率にあわせたウィンドサイズで作成して、 かつ、描画の開始位置を余白分ずらさなければならなくなるのですが そうなると、画像、文字、すべての座標系の部分に修正が必要になり かなり煩雑になってしまいます。 (回転関係だと、回転の中心座標を指定するようなものだと、これまたややこしいことになりそうです 他にも、クライアント領域のサイズから、センタリングの座標を割り出してるような処理も問題に……) そう考えると、裏画面から表画面に移すときに 多少の負荷覚悟でScreenCopy時に処理できるとよいのですが。 位置指定と拡大縮小処理つきのScreenCopyというのは不可能でしょうか。 SetWindowSizeExtendRate自体、おそらく拡大縮小コピーを行っている(OS側でのサポート?) ので、SetWindowSizeExtendRateを使う選択をするならScreenCopyの負荷も かわらないですよね。 他になにかよい方法がありましたら、お願いします。 ついでなのですが、ウィンドウの枠を消す方法が解りません。 SetWindowStyleMode( int Mode ) ; // ウインドウのスタイルを変更する というのがあるみたいですが、 ttp://lukewarm.s101.xrea.com/misc/Styles.htm ここにあるような値をいれるのかとおもったのですが、 入れてみても変化ありませんでした。(普通にタイトルとかxボタンとか表示される) DxLib_Init()の前後でもためしてみたのですが、 呼び出す場所の問題なのでしょうか?

Page: 1 |

Re: ワイド画面モニタへの対応 ( No.1 )
名前:管理人 日時:2009/06/14 04:44

> ワイド画面モニタでのフルスクリーンのアスペクト比問題 > (4:3のゲーム画面を他のアスペクト比のワイドモニタでフルスクリーン表示すると、画像が横にのびたりしてしまう問題) > はサポートされているのでしょうか? 今のところサポートする予定はありません。 基本的にソフトウエア側から出力先のモニターでどのようなドットアスペクト比で表示されているかを 知る方法がありませんので、対応するとしてもソフトウエア側でアスペクト比を指定する形態になると思います。 現在フルスクリーン、ウインドウモードどちらでも採用することができる方法としては 描画可能な画像を作成してその画像を裏画面の代わりとして表示したい内容を書き込み、 その画像を裏画面に希望のアスペクト比で DrawExtendGraph で描画して、その後 ScreenFlip するというものがあります。 手順 準備 SetDrawValidGraphCreateFlag に TRUE を渡して描画可能な画像を作成する指定をする MakeGraph でゲーム画面として使用したいサイズの画像を作成する SetDrawValidGraphCreateFlag に FALSE を渡して描画可能な画像を作成する指定を解除する ゲームループ中 SetDrawScreen に作成した描画可能画像のハンドルを渡して描画可能画像を描画先にする ゲーム画面を描画する SetDrawScreen で描画先を裏画面にする SetDrawMode に DX_DRAWMODE_BILINEAR を渡してバイリニア補間描画の指定をする( これはお好みで ) DrawExtendGraph で裏画面に希望のアスペクト比で描画可能画像を描画する ScreenFlip で表画面に反映 サンプルプログラム #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, x, add, drawscreen ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画可能画像の作成を指定 SetDrawValidGraphCreateFlag( TRUE ) ; // 320x480 の描画可能画像を作成 drawscreen = MakeGraph( 320, 480 ) ; // 描画可能画像の作成の指定を解除 SetDrawValidGraphCreateFlag( FALSE ) ; // 画像の読み込み handle = LoadGraph( "Test1.bmp" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // メインループ(何かキーが押されたらループを抜ける) x = 0; add = 8; while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 描画先を描画可能画像にする SetDrawScreen( drawscreen ) ; // 画面のクリア ClearDrawScreen(); // 移動 x += add; if( x < 0 || x > 320 ) add = -add; // 画像の描画 DrawGraph( x, 0, handle, TRUE ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 描画モードをバイリニアフィルタリングモードにする SetDrawMode( DX_DRAWMODE_BILINEAR ) ; // 画面いっぱいに描画可能画像を描画する DrawExtendGraph( 0, 0, 640, 480, drawscreen, FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } 因みに SetWindowSizeExtendRate 系の機能は Vista や Windows 7 ではフルスクリーン時に 正常に動作しないので、フルスクリーンでのアスペクト比問題を解決したい場合には使う ことができません。 SetWindowStyleMode ですが、こちらの引数で有効なものは以下のようになっています 0 :デフォルト 1 :タスクバーなし 2 :タスクバーなし枠なし 3 :枠なし 4 :何もなし 5 :最小化無し 6 :ツールバーに適したウインドウ DxLib_Init の前に呼んでおくことで起動時のスタイルを変更することが出来ます ただ、かなり昔に適当に実装した機能なので正常に機能しない可能性もあります・・・
Re: ワイド画面モニタへの対応 ( No.2 )
名前:だみあん 日時:2009/06/14 21:58

早速の回答ありがとうございます。 上記の例を参考にしまして、ワイド画面対応を組み込むことが出来ました。 フルスクリーンモードのほうは、なんだか面倒そうなので (というか、16:10にひきのばされた800:600の画面に4:3にストレッチした800*600の元画像を 縮小表示なんてのは、ピクセルサイズ的にも見た目うつくしそうじゃないので・・・) ハードやドライバで対応していないモニタへの救済措置として ウィンドウモードのみで対応という方向で行くことにしました。 ただ、MakeGraphを使用しているので InitGraphしたときなどにまた作り直さなければならなかったりして それを見逃すと // 描画先を描画可能画像にする SetDrawScreen( drawscreen ) ; // 画面のクリア ClearDrawScreen(); の際にdrawscreenが無効だとそこで例外で強制終了で落ちた? ことがあったので、ちょっと面倒な部分もありますがw あとは、ゲーム画面を拡大すると、 マウスのポインタの位置もずれてしまうので (選択ボタンとかの座標位置とか) システムのでなく、自前のマウスカーソルしか使えなくなるということに・・・。 ワイド画面対応ってめんどくさいですね。 でも、昨今はシェア的にもワイド画面が大きくなってきているので 仕方のないことなのでしょうけども。 SetWindowStyleModeのほうは SetWindowStyleMode(4); で、枠もタイトルも無しのが無事出ました。 というわけで、二つとも解決いたしました。 回答ありがとうございました。

Page: 1 |