トップページ > 過去ログ > 記事閲覧
SetUseASyncChangeWi...で画面サイズ変更
名前:HO 日時: 2010/11/28 06:14

SetUseASyncChangeWindowModeFunctionが題名に入りきらなかったので...で省略しました。 ウィンドウとフルスクリーンの切り替えで、 ウィンドウモード時にフルスクリーンできないサイズが指定されていると、 下記のように書いてみたですがフルスクリーンになってくれませんでした。 何かこれを実現するための工夫があれば教えていただきたいです。 #include "DxLib.h" #define SCREEN_SIZE_X 512 // このままではフルスクリーンに出来ないサイズ #define SCREEN_SIZE_Y 448 void ChangeCallback(void *) { if (GetWindowModeFlag() == 0) SetGraphMode(640, 480, 32); // fullscreen可能なサイズに変える else SetGraphMode(SCREEN_SIZE_X, SCREEN_SIZE_Y, 32); // Window時のサイズ } int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { ChangeWindowMode(1); SetGraphMode(SCREEN_SIZE_X, SCREEN_SIZE_Y, 32); SetUseASyncChangeWindowModeFunction(1, ChangeCallback, nullptr); // Alt+Enter切り替え有効化 DxLib_Init(); while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0); DxLib_End(); return 0; }

Page: 1 |

Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.1 )
名前:Will 日時:2010/11/28 09:58

そのソースで実行してみましたけどフルスクリーン化出来ましたよ。 WinXP SP3 VC++6 DXLiv Ver.3.03 HOさんの環境でそのプログラムを実行した場合、具体的にどういう結果になるのでしょうか?
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.2 )
名前:Will 日時:2010/11/28 10:15

追記 HOさんの環境は普通にすれば640*480のフルスクリーン表示は出来る環境なんですよね? 多分関係ないと思いますが念のため書いておきます。 XP以降は640*480サイズは非サポートで必ずしも全てのハード環境でフルスクリーン化出来る保証はありません。 デスクトップPCでも液晶モニタが主流となりましたが、モニタ自体が640*480に非対応のものも増えています。 フルスクリーンを使用するなら800*600以上がよいのかもしれません。
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.3 )
名前:HO 日時:2010/11/28 14:21

ご回答いただきありがとうございます。 Win7 x64 VS2010 DxLib ver3.04b 640x480ではフルスクリーンにできることは確認してしている環境です。 800x600でもダメでした。 フルスクリーンにしようとすると、画面左上を基点に(見た感じでは)512x448だけ黒く、他の部分はデスクトップが見えてる状態になります。 ウィンドウサイズが640x480(800x600でも)に変更される前にフルスクリーン化が始まったという感じでしょうか。
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.4 )
名前:Will 日時:2010/11/28 15:58

Win7で動くPCが無いためお役に立てそうにないです。 他の方の回答をお待ちください。 XPとの違いで気になるところといえばエアロが有効かどうかぐらいですね。
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.5 )
名前:いっち 日時:2010/11/28 23:38

私の環境でも切り替えは出来るのですが、あまりスマートな感じではないですね。 おそらく ChangeCallback が画面モード変更後に呼び出されているためだと思います。 対策として考え付くのは・・・ ・画面モードの切り替えを非同期ではなく同期的に自前で実装する ・ウィンドウモード時の画面サイズを640x480で妥協する(フルスクリーン時と処理を統一できるし) 管理人さんのお考え次第ではありますが機能追加して頂けるのであれば・・・ ・画面モードが切り替わる前に呼び出されるコールバック ・フルスクリーン時とウィンドウモード時の画面サイズを別々に設定できる関数 と言ったところでしょうか
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.6 )
名前:HO 日時:2010/11/30 19:48

そもそも私が勘違いしたやり方してたみたいですね。 SetGraphModeとコールバック関数の呼び出されるタイミングの 関係などを把握しておりませんでした。。 画面に合わせて拡大したりする部分は出来たのでConfig.exeを 用意して事前に選択するタイプにしましょうかね。
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.7 )
名前:管理人 日時:2010/12/01 08:30

SetUseASyncChangeWindowModeFunction で登録するコールバック関数の中で SetGraphMode が呼ばれることは想定していませんでした、 ちょっと泥臭い実装になりますが、コールバック関数が呼ばれたときは コールバック関数に来たことをフラグに保存するだけにしておいて、 目的の画面解像度への変更はメインループの中で行うことでご希望の 処理を実現することができます ただ、既存のバージョンではフルスクリーンモードにできない画面解像度で ウインドウモードで動作中に SetUseASyncChangeWindowModeFunction の機能で フルスクリーンモードに変更しようとすると動作が停止するというバグがありましたので、 お手数ですがそのバグを修正したこちらのバージョンをお使いになってください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) 「コールバック関数ではフラグだけ立てる」という方法でウインドウモードと フルスクリーンモードで解像度を変えるという処理を行うサンプルプログラムを 作りましたので、よろしければご覧になってみてください #include "DxLib.h" int ChangeCallbackFlag ; int FullScreenFlag ; // コールバック関数に来たらフラグを立てるだけ void ChangeCallback(void *) { ChangeCallbackFlag = TRUE ; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int handle, x, add; // ウインドウモードで起動 ChangeWindowMode( TRUE ); SetGraphMode( 512, 448, 32 ) ; SetUseASyncChangeWindowModeFunction(1, ChangeCallback, NULL ); // Alt+Enter切り替え有効化 // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み handle = LoadGraph( "Test1.bmp" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // メインループ(何かキーが押されたらループを抜ける) x = 0; add = 8; while( ProcessMessage() == 0 ) { // コールバック関数に来たら画面モードを切り替える if( ChangeCallbackFlag ) { // コールバック関数に来たというフラグを倒す ChangeCallbackFlag = FALSE ; // 今までフルスクリーンだった場合はウインドウモードに、 // ウインドウモードだった場合はフルスクリーンにする if( FullScreenFlag == TRUE ) { FullScreenFlag = FALSE ; // フルスクリーンにする場合は先に画面解像度を変更する SetGraphMode(640, 480, 32); ChangeWindowMode( FALSE ) ; } else { FullScreenFlag = TRUE ; // ウインドウモードにする場合は後から画面解像度を変更する ChangeWindowMode( TRUE ) ; SetGraphMode(512, 448, 32); } // 画像の読み込み handle = LoadGraph( "Test1.bmp" ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); } // 移動 x += add; if( x < 0 || x > 640 ) add = -add; // 画面のクリア ClearDrawScreen(); // 画像の描画 DrawGraph( x, 0, handle, TRUE ); // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.8 )
名前:HO 日時:2010/12/03 20:32

おかげさまでやりたかったことがうまく実装できました! どうもありがとうございます。 初めにウインドウモードで起動するときはあらかじめ FullScreenFlag = TRUE にしておくみたいですね。 そして、これを試しているときに気づいたのですが、 ウィンドウモードのときにAltキーだけ押してしまったときに描画が止められるのを 出来ないようにすることはできないでしょうか? Altキーをゲーム内で押すことはなかなか無いと思いますが、 気づかずに押してしまった場合、何故停止したのか?ということになりそうです。
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.9 )
名前:いっち 日時:2010/12/03 22:20

> ウィンドウモードのときにAltキーだけ押してしまったときに描画が止められるのを > 出来ないようにすることはできないでしょうか? 出来ないようです。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=988
Re: SetUseASyncChangeWi...で画面サイズ変更 ( No.10 )
名前:HO 日時:2010/12/05 13:18

わかりました。 システム関連の動作ということですね。 それについては気にしないことにします。 みなさまありがとうございました。

Page: 1 |