ページ 1 / 1
画面解像度の変更
Posted: 2010年5月06日(木) 05:08
by ゆう
初めてお邪魔します。
DXライブラリ講座、利用させていただいてます。
SetGraphMode()を使用して画面解像度を変更する処理なのですが、
800×600のフルスクリーンモードを指定した場合、なぜか挙動がおかしくなってしまいます。
例として、以下のようなコードを実行した場合、真っ暗な画面がフルスクリーンで表示されるのみで、
描画したはずの円は表示されません。
解像度が640×480や1024×768の場合は問題なく表示されますし、800×600でもウィンドウモードの時には表示されています。
モニタも、もちろん800×600の解像度に対応しています。
なぜこのようなことになるのか、もしお心当たりがありましたらお願いします。
[追加補足]
何度か試してるうちに、フルスクリーンの場合他の解像度でも表示されなくなってしまいました。
何か根本的なことを勘違いしてるのでしょうか・・・。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
if( DxLib_Init() == -1 ){return -1;} // DXライブラリ初期化処理
if (SetGraphMode(800, 600, 32)==-1) {return -1;} // 画面解像度変更
DrawCircle(100, 100, 30, GetColor(255, 255, 255), 1); //円を描画
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

Re:画面解像度の変更
Posted: 2010年5月06日(木) 06:43
by Ma
表描画、かつフルスクリーンだとそんな弊害があったようななかったような・・・。
裏面描画に指定して、更新をしてみてください。
もしかしたら直るかも。
Re:画面解像度の変更
Posted: 2010年5月06日(木) 07:19
by ゆう
レスありがとうございます。
以下のようなコードに変更してみましたが、
結果は変らず、円は表示されませんでした。
SetGraphMode()の行を抜けば表示されるのですが、
それだと解像度が640×480で固定になってしまいます。
出来れば800×600を使いたいのですが・・・。
コードの問題ではなく、他の部分で何か問題があるのでしょうか。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
if( DxLib_Init() == -1 ){return -1;} // DXライブラリ初期化処理
if (SetGraphMode(800, 600, 32)==-1) {return -1;} // 画面解像度変更
SetDrawScreen( DX_SCREEN_BACK ) ; //※ この行を追加 ※
DrawCircle(100, 100, 30, GetColor(255, 255, 255), 1); //円を描画
ScreenFlip() ; //※ この行を追加 ※
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Re:画面解像度の変更
Posted: 2010年5月06日(木) 07:47
by Dixq (管理人)
おそらくこのままのコードで制作を進めていくことはないと思います。
ゲームプログラミングの館の13章で試してみてください。
http://dixq.net/g/13.html
Re:画面解像度の変更
Posted: 2010年5月06日(木) 09:08
by ゆう
レスありがとうございます。
教えていただいたゲームプログラミングの館の13章も試してみました。
ウィンドウモードであれば問題ないのですが、フルスクリーンかつSetGraphMode()を使用した場合には
やはり処理がおかしいことになってしまいます。
具体的には、まったく画像が表示されない場合がほとんどですが、チラッと表示されることもありました。
いずれにしても、正しい表示にはなりませんでした。
Re:画面解像度の変更
Posted: 2010年5月06日(木) 09:49
by Ma
グラフィックデバイスとか環境を疑ったほうが良いかもしれません。
お使いのPC情報と、DXライブラリのバージョン等を公開してみては?
Re:画面解像度の変更
Posted: 2010年5月06日(木) 10:21
by ゆう
お言葉に従ってPCのスペックを書き出していたところだったのですが、原因が判明しました。
ExtResという画面解像度変更用の常駐ツールを使用しているのですが、これが悪さをしていました。
このツールには「リフレッシュレート自動調整」という機能があって
画面解像度が変更されたときに自動的にリフレッシュレートを調整するのですが、
この機能をオフにしたらうまく表示されるようになりました。
SetGraphMode()で、自動調整されるリフレッシュレートと同じ値を指定しても同様に表示されるようです。
詳しくは分かりませんが、ExtResの自動調整とSetGraphMode()による指定で
リフレッシュレートが食い違うと不具合が起こる・・・ということなのでしょうか。
お騒がせしました!
Re:画面解像度の変更
Posted: 2010年5月06日(木) 10:49
by ゆう
ところで少し気になったのですが、
SetGraphMode()でリフレッシュレートを指定しないと、自動的に60に設定されてしまうのでしょうか?
私はいまだにCRTモニタを使っているので、リフレッシュレート60だと画面がちらついてしまうので
普段85に設定しています。
しかしSetGraphMode()でリフレッシュレートを指定しないと、その画面ちらつき状態になってしまいます。
(恐らくリフレッシュレートが変更されてしまっている)
リフレッシュレートを変更せずに画面解像度だけ変更する際は、
事前にリフレッシュレートを取得して再設定する必要があるんでしょうか。
Re:画面解像度の変更
Posted: 2010年5月06日(木) 13:57
by Justy
>SetGraphMode()でリフレッシュレートを指定しないと、自動的に60に設定されてしまうのでしょうか?
dxlib.hを見れば判りますが、指定しない場合は自動的に 60が指定されたと見なされますので、
そうなります。
> 事前にリフレッシュレートを取得して再設定する必要があるんでしょうか
SetGraphModeのリフレッシュレート指定で 0を入れたらどうなりますか?
Re:画面解像度の変更
Posted: 2010年5月06日(木) 19:24
by ゆう
dxlib.hを確認すればよかったのですね。
0を入れたらリフレッシュレートは変更されませんでした!
伺わなかったら、事前に取得して再設定という無意味な処理を書いてしまうところでした。
リファレンスを見てるだけでは分からないことも多いですね、勉強になりました。
みなさんありがとうございました。