トップページ > 記事閲覧
描画回数を減らすモードと仮想フルスクリーン
名前:にこよん 日時: 2017/08/02 04:31

こんにちは。連続投稿すみません。 ゲームでよく描画回数を2分の1にしてゲームを軽くするようなモードがありますが、 特に何も考えずにソースを大きくしてしまったので今更自分でこのモードを作ることが困難になってしまいました。 DXライブラリの描画モードの様なもので描画関係の関数が呼ばれても何もせずに帰るようなモードはありますか? もしくは似たようなことができる関数はありますか?(描画関係で軽くするモードを作れるような) いいアイデアがあればご教授ください。 DXライブラリにAlt+ENTERでフルスクリーンではなく仮想フルスクリーンになるような関数を追加していただけないでしょうか? 自分で作ろうとしたのですがどうしてもうまくいきませんでした。 またマウスの座標もずれてしまうのでこれの修正の仕方も分かりません。 .dxaファイルの容量が大きくなってしまった場合はファイルを複数に分けたほうがいいですか? data.dxaが100MBを超えてしまったのですが SE.dxaとBGM.dxaのように複数に分けたほうがいいでしょうか? 有料ゲームって結構ばらばらにおいてるイメージがあったので。
メンテ

Page: 1 |

Re: 描画回数を減らすモードと仮想フルスクリーン ( No.1 )
名前:管理人 日時:2017/08/04 00:57

> DXライブラリの描画モードの様なもので描画関係の関数が呼ばれても何もせずに帰るようなモードはありますか? > もしくは似たようなことができる関数はありますか?(描画関係で軽くするモードを作れるような) すみません、どちらもありません > いいアイデアがあればご教授ください。 描画には DrawGraph や DrawRotaGraph などを使用されていると思いますが、これらと全く同じ引数のラッパー関数を 作成して、ソフトのプログラムからはそちらの関数を呼ぶようにしてください そして、その自作のラッパー関数の中で、『描画を一切しない』グローバル変数のフラグが立っていたら 何もせずに関数を return で抜けて、フラグが立っていなければ普通に描画関数を呼ぶ、というようにすることで 『描画関係の関数が呼ばれても何もせずに帰る』処理を実現できます 例:DrawGraph のラッパー関数 int DrawSkipFlag ; // グローバル変数のフラグ、1だったら何も描画しない // ソフトのプログラムが DrawGraph の代わりに呼ぶ関数 extern int MyDrawGraph( int x, int y, int GrHandle, int TransFlag ) { // DrawSkipFlag が 1 だったら何もせずに関数を終了する if( DrawSkipFlag == 1 ) { return 0 ; } // DrawSkipFlag が 0 ではなかったら普通に DrawGraph を呼ぶ return DrawGraph( x, y, GrHandle, TransFlag ) ; } ↑このような関数を、DrawExtendGraph や DrawRotaGraph などの関数のものも用意する感じです よろしければお試しください > DXライブラリにAlt+ENTERでフルスクリーンではなく仮想フルスクリーンになるような関数を追加していただけないでしょうか? Windows10 では、それまでのバージョンと異なり仮想フルスクリーンの状態にしてもタスクバーが 消えなくなってしまったので、仮想フルスクリーンを使用されることはお勧めできません なので、Alt+ENTER の仮想フルスクリーン版の追加はできません… > .dxaファイルの容量が大きくなってしまった場合はファイルを複数に分けたほうがいいですか? はい、一つである必要や、一つの方が読み込みが高速だったりすることはありませんので 都合に応じて複数のファイルに分けてください
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.2 )
名前:にこよん 日時:2017/08/04 18:02

>描画には DrawGraph や DrawRotaGraph などを使用されていると思いますが、これらと全く同じ引数のラッパー関数を >作成して、ソフトのプログラムからはそちらの関数を呼ぶようにしてください 7,8種類の関数を使っているので全て作るのは大変そうですが、 この方法でやってみます。 >Windows10 では、それまでのバージョンと異なり仮想フルスクリーンの状態にしてもタスクバーが >消えなくなってしまったので、仮想フルスクリーンを使用されることはお勧めできません タスクバーというのはデスクトップの下にある黒いバーですよね? 私のパソコンもWindows10なのですが、昔の物も含めほとんどのの有料ゲームで 仮想フルスクリーの様に他のウインドウと共存できるフルスクリーンモードがあり、 すべてタスクバーは表示されません。 あれは仮想フルスクリーンモードではなかったり 私のパソコンの設定が特殊だったりするのかもしれませんが、 検索してもそのような記事は見つけられませんでした。 無知なのに否定するようで申し訳ないのですが、 別の仮想フルスクリーン?の様なものはないのでしょうか?
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.3 )
名前:管理人 日時:2017/08/06 04:20

> タスクバーというのはデスクトップの下にある黒いバーですよね? > 私のパソコンもWindows10なのですが、昔の物も含めほとんどのの有料ゲームで > 仮想フルスクリーの様に他のウインドウと共存できるフルスクリーンモードがあり、 > すべてタスクバーは表示されません。 ご情報ありがとうございます ウインドウの表示優先順位を最大にすることで Windows10 でもタスクバーより上にウインドウが表示されました 早速仮想フルスクリーンモードを実装してみようとしたのですが、Altキー + Enterキー でのフルスクリーンへの切り替えの 実装が仮想フルスクリーンで行おうとするとDXライブラリ内部のプログラムをかなり書き換えなければならないことが 分かったので、申し訳ありませんが Altキー + Enterキー での仮想フルスクリーンへの切り替えは見送らせてください m(_ _;m そして Altキー + Enterキー での仮想フルスクリーンへの切り替えの機能を実装しない場合、殆ど既存の機能で 仮想フルスクリーンを実装できることが分かりましたので、申し訳ありませんが今回は下記の仮想フルスクリーンの サンプルプログラムを参考にご作成中のソフトに仮想フルスクリーンモードを組み込んでみてください m(_ _;m サンプルプログラムの内容は『スペースキーを押すと仮想フルスクリーンに切り替わる( あと、動作確認のために四角形が 画面内を左右に動いている )』というものです こちらのサンプルでは新たに追加した『ウインドウの上下左右の縁の幅を取得する関数 GetWindowEdgeWidth』を使用していますので、 その関数を追加したこちらのバージョンをお使いください m(_ _)m http://dxlib.o.oo7.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 http://dxlib.o.oo7.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 http://dxlib.o.oo7.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 http://dxlib.o.oo7.jp/temp/DxLibDotNet.zip // Windows版 .NET用 http://dxlib.o.oo7.jp/temp/DxLibMakeTest.exe // ソース #include "DxLib.h" // ゲーム画面のサイズ #define GAME_SCREEN_SIZE_X 640 #define GAME_SCREEN_SIZE_Y 480 // 初期状態では仮想フルスクリーンモードはOFF int VirtualFullScreenMode = FALSE ; // ウインドウのアクティブ状態が変化したら呼ばれるコールバック関数 int ActiveStateChangeCallbackFunction( int ActiveState, void *UserData ) { // 仮想フルスクリーンモードが OFF の場合は特に何もしない if( VirtualFullScreenMode == FALSE ) { return 0 ; } // アクティブになったのかどうかで処理を分岐 if( ActiveState ) { // アクティブになったらウインドウの表示優先順位を最前面に表示する設定に変更 SetWindowZOrder( DX_WIN_ZTYPE_TOPMOST, TRUE ) ; } else { // 非アクティブになったらウインドウの表示優先順位を標準に戻す SetWindowZOrder( DX_WIN_ZTYPE_NORMAL, FALSE ) ; } return 0 ; } // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int DesktopSizeX ; int DesktopSizeY ; int GameScreen ; int x, add ; // デスクトップ画面のサイズを取得 GetDefaultState( &DesktopSizeX, &DesktopSizeY, NULL ) ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // ソフトの画面のサイズをデスクトップ画面と同じサイズに設定 SetGraphMode( DesktopSizeX, DesktopSizeY, 32 ) ; // ウインドウのクライアント領域のサイズだけソフトの画面を表示するように設定 SetWindowSizeChangeEnableFlag( FALSE, FALSE ) ; // ウインドウの初期サイズはゲーム画面と同じにする SetWindowSize( GAME_SCREEN_SIZE_X, GAME_SCREEN_SIZE_Y ) ; // ウインドウの初期位置はデスクトップ画面の中心にする SetWindowPosition( ( DesktopSizeX - GAME_SCREEN_SIZE_X ) / 2, ( DesktopSizeY - GAME_SCREEN_SIZE_Y ) / 2 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { return -1 ; } // アクティブ状態が変化したときに呼ばれるコールバック関数の登録 SetActiveStateChangeCallBackFunction( ActiveStateChangeCallbackFunction, NULL ) ; // ゲーム画面用の仮画面を作成 GameScreen = MakeScreen( GAME_SCREEN_SIZE_X, GAME_SCREEN_SIZE_Y, FALSE ) ; // メインループ x = 0 ; add = 8 ; while( ProcessMessage() == 0 ) { // スペースキーが押されたら仮想フルスクリーンモードの状態を変更する if( GetInputChar( TRUE ) == ' ' ) { // 仮想フルスクリーンモードが ON だった場合は OFF に、OFF だった場合は ON にする VirtualFullScreenMode = VirtualFullScreenMode == TRUE ? FALSE : TRUE ; // 変更後の仮想フルスクリーンモードが ON か OFF かで処理を分岐 if( VirtualFullScreenMode ) { // ON にする処理 int LeftWidth, TopWidth ; // ウインドウの左側の縁の幅と上側の縁の幅を取得 GetWindowEdgeWidth( &LeftWidth, NULL, &TopWidth, NULL ) ; // ウインドウの表示優先順位を最前面に表示する設定に変更 SetWindowZOrder( DX_WIN_ZTYPE_TOPMOST ) ; // ウインドウの位置を縁の幅分だけ画面外に移動して // デスクトップ画面にはクライアント領域のみが表示されるように設定 SetWindowPosition( -LeftWidth, -TopWidth ) ; // ウインドウのクライアント領域のサイズをデスクトップ画面と同じにする SetWindowSize( DesktopSizeX, DesktopSizeY ) ; } else { // OFF にする処理 // ウインドウの表示優先順位を標準に戻す SetWindowZOrder( DX_WIN_ZTYPE_NORMAL ) ; // ウインドウの位置はデスクトップ画面の中心 SetWindowPosition( ( DesktopSizeX - GAME_SCREEN_SIZE_X ) / 2, ( DesktopSizeY - GAME_SCREEN_SIZE_Y ) / 2 ) ; // ウインドウのクライアント領域のサイズをゲーム画面と同じにする SetWindowSize( GAME_SCREEN_SIZE_X, GAME_SCREEN_SIZE_Y ) ; } } // 左右に移動する四角形の処理 x += add ; if( x < 0 || x > 640 ) add = -add ; // 描画先を仮想画面に変更 SetDrawScreen( GameScreen ) ; // 画面のクリア ClearDrawScreen() ; // 四角形の描画 DrawBox( x, 0, x + 64, 0 + 64, GetColor( 255,255,255 ), TRUE ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 仮想フルスクリーンモードかどうかで処理を分岐 if( VirtualFullScreenMode ) { // 仮想フルスクリーンモードの場合 int ScalingSizeX, ScalingSizeY ; // ゲーム画面の拡大描画のサイズを算出 ScalingSizeX = DesktopSizeY * GAME_SCREEN_SIZE_X / GAME_SCREEN_SIZE_Y ; if( ScalingSizeX < DesktopSizeX ) { ScalingSizeY = DesktopSizeY ; } else { ScalingSizeX = DesktopSizeX ; ScalingSizeY = DesktopSizeX * GAME_SCREEN_SIZE_Y / GAME_SCREEN_SIZE_X ; } // 余りの部分を塗りつぶし if( ScalingSizeX != DesktopSizeX || ScalingSizeY != DesktopSizeY ) { if( ScalingSizeX < DesktopSizeX ) { DrawBox( 0, 0, ( DesktopSizeX - ScalingSizeX ) / 2, DesktopSizeY, GetColor( 0, 0, 0 ), TRUE ) ; DrawBox( DesktopSizeX - ( DesktopSizeX - ScalingSizeX ) / 2, 0, DesktopSizeX, DesktopSizeY, GetColor( 0, 0, 0 ), TRUE ) ; } else { DrawBox( 0, 0, DesktopSizeX, ( DesktopSizeY - ScalingSizeY ) / 2, GetColor( 0, 0, 0 ), TRUE ) ; DrawBox( 0, DesktopSizeY - ( DesktopSizeY - ScalingSizeY ) / 2, DesktopSizeX, DesktopSizeY, GetColor( 0, 0, 0 ), TRUE ) ; } } // ゲーム画面を拡大描画 SetDrawMode( DX_DRAWMODE_BILINEAR ) ; DrawExtendGraph( ( DesktopSizeX - ScalingSizeX ) / 2, ( DesktopSizeY - ScalingSizeY ) / 2, DesktopSizeX - ( DesktopSizeX - ScalingSizeX ) / 2, DesktopSizeY - ( DesktopSizeY - ScalingSizeY ) / 2, GameScreen, FALSE ) ; } else { // ゲーム画面を等倍で裏画面に描画 DrawGraph( 0, 0, GameScreen, FALSE ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.4 )
名前:にこよん 日時:2017/08/06 20:13

仮想フルスクリーンモードのサンプルプログラム、 新しい関数の実装ありがとうございました。 早速試してみたのですが、思っていた通りに動きました。 ありがとうございます。 >Altキー + Enterキー でのフルスクリーンへの切り替えの >実装が仮想フルスクリーンで行おうとするとDXライブラリ内部のプログラムをかなり書き換えなければならないことが >分かったので とのことですが、毎回上の様なコードを書くのは大変なので、 VirtualFullScreen.cppの様なものを作成し、DXライブラリに実装されたかのように使えるようにしようとしたのですが、 いただいたサンプルコードが何をやっているのかが一部分からないため、複数の関数に順番通り分割することしかできませんでした。 それと、仮想フルスクリーン状態の時にマウスの座標を入手する方法も考えたのですが、 少しずれてしまいます。 VirtualFullScreen.cppの様な別ファイルにある状態のように想定した(メイン関数と上の関数は変数を共有できないとして) 7つの関数を1つのファイルに書いたソースを下に貼りますので、 大変お手数ですが、何か問題や無駄なことがあればご教授いただけないでしょうか。 また、マウスポインタの位置を取得する方法もご教授下さい。 失敗作↓ void GetMousePoint_Virtual(int *XBuf, int *YBuf); #include <DxLib.h> //DXライブラリ static int virtual_fullscreen_permission = TRUE; // 初期状態では仮想フルスクリーンモードはOFF static int virtual_fullscreen_flag = FALSE; static int game_screen_size_x; //スクリーンのサイズ static int game_screen_size_y; //スクリーンのサイズ static int window_point_x; //ウインドウモードの座標 static int window_point_y; //ウインドウモードの座標 static int desktop_size_x; //デスクトップのサイズ static int desktop_size_y; //デスクトップのサイズ static int game_screen_handle; //仮想スクリーンのハンドル //ウインドウのアクティブ状態が変化したら呼ばれるコールバック関数 int ActiveStateChangeCallbackFunction(int ActiveState, void *UserData) { if (virtual_fullscreen_flag == FALSE) return 0; //仮想フルスクリーンモードが OFF の場合は特に何もしない //アクティブになったのかどうかで処理を分岐 if (ActiveState) SetWindowZOrder(DX_WIN_ZTYPE_TOPMOST, TRUE); //アクティブになったらウインドウの表示優先順位を最前面に表示する設定に変更 else SetWindowZOrder(DX_WIN_ZTYPE_NORMAL, FALSE); //非アクティブになったらウインドウの表示優先順位を標準に戻す return 0; } //仮想フルスクリーンの画面モードを設定する void SetGraphMode_Virtual(int ScreenSizeX, int ScreenSizeY, int ColorBitDepth, int RefreshRate = 60) { game_screen_size_x = ScreenSizeX; //スクリーンのサイズを保存するX game_screen_size_y = ScreenSizeY; //スクリーンのサイズを保存するY GetDefaultState(&desktop_size_x, &desktop_size_y, NULL); //デスクトップ画面のサイズを取得 ChangeWindowMode(TRUE); //ウインドウモードで起動 SetGraphMode(desktop_size_x, desktop_size_y, ColorBitDepth, RefreshRate); //ソフトの画面のサイズをデスクトップ画面と同じサイズに設定 SetWindowSizeChangeEnableFlag(FALSE, FALSE); //ウインドウのクライアント領域のサイズだけソフトの画面を表示するように設定 SetWindowSize(ScreenSizeX, ScreenSizeY); //ウインドウの初期サイズはゲーム画面と同じにする } //描画先を仮想フルスクリーン対応画面にする void SetDrawScreenToVirtualFullScreen() { SetActiveStateChangeCallBackFunction(ActiveStateChangeCallbackFunction, NULL); //アクティブ状態が変化したときに呼ばれるコールバック関数の登録 game_screen_handle = MakeScreen(game_screen_size_x, game_screen_size_y, FALSE); //ゲーム画面用の仮画面を作成 } //画面をクリアする void ClearDrawScreen_Virtual() { SetDrawScreen(game_screen_handle); //描画先を仮想画面に変更 ClearDrawScreen(); //画面のクリア } //裏画面と表画面の内容を交換する void ScreenFlip_Virtual() { //描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); //仮想フルスクリーンモードかどうかで処理を分岐 if (virtual_fullscreen_flag) { //仮想フルスクリーンモードの場合 int ScalingSizeX, ScalingSizeY; // ゲーム画面の拡大描画のサイズを算出 ScalingSizeX = desktop_size_y * game_screen_size_x / game_screen_size_y; if (ScalingSizeX < desktop_size_x) { ScalingSizeY = desktop_size_y; } else { ScalingSizeX = desktop_size_x; ScalingSizeY = desktop_size_x * game_screen_size_y / game_screen_size_x; } // 余りの部分を塗りつぶし if (ScalingSizeX != desktop_size_x || ScalingSizeY != desktop_size_y) { if (ScalingSizeX < desktop_size_x) { DrawBox(0, 0, (desktop_size_x - ScalingSizeX) / 2, desktop_size_y, GetColor(10, 10, 10), TRUE); DrawBox(desktop_size_x - (desktop_size_x - ScalingSizeX) / 2, 0, desktop_size_x, desktop_size_y, GetColor(10, 10, 10), TRUE); } else { DrawBox(0, 0, desktop_size_x, (desktop_size_y - ScalingSizeY) / 2, GetColor(10, 10, 10), TRUE); DrawBox(0, desktop_size_y - (desktop_size_y - ScalingSizeY) / 2, desktop_size_x, desktop_size_y, GetColor(10, 10, 10), TRUE); } } // ゲーム画面を拡大描画 SetDrawMode(DX_DRAWMODE_BILINEAR); DrawExtendGraph( (desktop_size_x - ScalingSizeX) / 2, (desktop_size_y - ScalingSizeY) / 2, desktop_size_x - (desktop_size_x - ScalingSizeX) / 2, desktop_size_y - (desktop_size_y - ScalingSizeY) / 2, game_screen_handle, FALSE); } else { DrawGraph(0, 0, game_screen_handle, FALSE); //ゲーム画面を等倍で裏画面に描画 } // 裏画面の内容を表画面に反映 ScreenFlip(); } //スクリーンモードを変更する int ChangeVirtualFullScreen(int mode) { if (mode == TRUE || mode == FALSE) //数値が正確で if (virtual_fullscreen_flag != mode) { //変更があるなら virtual_fullscreen_flag = mode; //バーチャルフルスクリーンフラグを変更する if (virtual_fullscreen_flag) { //変更後の仮想フルスクリーンモードが ON か OFF かで処理を分岐 //ON にする処理 int LeftWidth, TopWidth; GetWindowPosition(&window_point_x, &window_point_y); //ウインドウの位置を保存 GetWindowEdgeWidth(&LeftWidth, NULL, &TopWidth, NULL); //ウインドウの左側の縁の幅と上側の縁の幅を取得 SetWindowZOrder(DX_WIN_ZTYPE_TOPMOST); //ウインドウの表示優先順位を最前面に表示する設定に変更 SetWindowPosition(-LeftWidth, -TopWidth); //ウインドウの位置を縁の幅分だけ画面外に移動して、デスクトップ画面にはクライアント領域のみが表示されるように設定 SetWindowSize(desktop_size_x, desktop_size_y); //ウインドウのクライアント領域のサイズをデスクトップ画面と同じにする } else { //OFF にする処理 SetWindowZOrder(DX_WIN_ZTYPE_NORMAL); //ウインドウの表示優先順位を標準に戻す SetWindowPosition(0, 0); //ウインドウの位置はデスクトップ画面の中心 SetWindowSize(game_screen_size_x, game_screen_size_y); //ウインドウのクライアント領域のサイズをゲーム画面と同じにする SetWindowPosition(window_point_x, window_point_y); //ウインドウの位置をセットする } } return virtual_fullscreen_flag; //バーチャルフルスクリーンフラグを返す } //マウスポインタの位置を取得する void GetMousePoint_Virtual(int *XBuf, int *YBuf) { GetMousePoint(XBuf, YBuf); // マウスの座標を調整する if (virtual_fullscreen_flag == TRUE) { *XBuf *= float(game_screen_size_x) / float(desktop_size_x); *YBuf *= float(game_screen_size_y) / float(desktop_size_y); } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int x, add; int mouse_x = 0; int mouse_y = 0; //仮想フルスクリーンの画面モードを設定する SetGraphMode_Virtual(640, 480, 32); //DXライブラリの初期化 if (DxLib_Init() < 0) return -1; //描画先を仮想フルスクリーン対応画面にする SetDrawScreenToVirtualFullScreen(); x = 0; add = 8; while (ProcessMessage() == 0) { //画面のクリア ClearDrawScreen_Virtual(); //スペースキーが押されたら仮想フルスクリーンモードの状態を変更する if (GetInputChar(TRUE) == ' ') ChangeVirtualFullScreen(ChangeVirtualFullScreen(-1) == TRUE ? FALSE : TRUE); //左右に移動する四角形の処理 x += add; if (x < 0 || x > 640) add = -add; DrawBox(x, 0, x + 64, 0 + 64, GetColor(255, 255, 255), TRUE); //四角形の描画 //マウスの座標を取得 GetMousePoint_Virtual(&mouse_x, &mouse_y); DrawBox(mouse_x - 10, mouse_y - 10, mouse_x + 10, mouse_y + 10, GetColor(255, 255, 255), FALSE); //マウス座標の四角形の描画 //裏画面の内容を表画面に反映 ScreenFlip_Virtual(); } //DXライブラリの後始末,ソフトの終了 DxLib_End(); return 0; }
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.5 )
名前:管理人 日時:2017/08/07 00:40

> VirtualFullScreen.cppの様な別ファイルにある状態のように想定した(メイン関数と上の関数は変数を共有できないとして) > 7つの関数を1つのファイルに書いたソースを下に貼りますので、 > 大変お手数ですが、何か問題や無駄なことがあればご教授いただけないでしょうか。 簡単に拝見させていただいた限りでは特に問題や無駄なところなどは無いと思います > また、マウスポインタの位置を取得する方法もご教授下さい。 仮想フルスクリーンの際は拡大後のサイズや拡大表示時の余白の部分などを考慮する必要があります 以下のように変更して頂ければ正常にマウスポインタの位置を取得することができますので、 よろしければお試しください //マウスポインタの位置を取得する void GetMousePoint_Virtual(int *XBuf, int *YBuf) { GetMousePoint(XBuf, YBuf); // マウスの座標を調整する if (virtual_fullscreen_flag == TRUE) { int ScalingSizeX, ScalingSizeY; // ゲーム画面の拡大描画のサイズを算出 ScalingSizeX = desktop_size_y * game_screen_size_x / game_screen_size_y; if (ScalingSizeX < desktop_size_x) { ScalingSizeY = desktop_size_y; *XBuf = (*XBuf - (desktop_size_x - ScalingSizeX) / 2) * game_screen_size_x / ScalingSizeX; *YBuf = *YBuf * game_screen_size_y / ScalingSizeY; } else { ScalingSizeX = desktop_size_x; ScalingSizeY = desktop_size_x * game_screen_size_y / game_screen_size_x; *XBuf = *XBuf * game_screen_size_x / ScalingSizeX; *YBuf = (*YBuf - (desktop_size_y - ScalingSizeY) / 2) * game_screen_size_y / ScalingSizeY; } } }
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.6 )
名前:たろう 日時:2017/08/07 14:25

すみません、横から失礼致しますたろうです。 仮想フルスクリーンの状態にしてもタスクバーが消えないというのは、どういう場合に起こりますでしょうか? 私は以下のような簡単なシステムでウィンドウズ10でも問題無くタスクバーも残らず 「仮想フルスクリーン」→「ウィンドウサイズ」→「仮想フルスクリーン」・・・ とできているのですがPCによってはタスクバーが残ったりするのかちょっと心配になりました。 横からすみませんが、よろしければお知らせいただけると助かります よろしくお願いいたします。 #include "DxLib.h" int g_DeskSize_x,g_DeskSize_y; void fullon() { SetWindowStyleMode( 2 ) ; SetWindowPosition( 0, 0 ) ; SetWindowSize( g_DeskSize_x, g_DeskSize_y ) ; } void fulloff() { SetWindowStyleMode( 6 ) ; SetWindowSize( 800, 800 ) ; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); SetGraphMode( 800, 800, 32 ) ; g_DeskSize_x=GetSystemMetrics(SM_CXSCREEN); g_DeskSize_y=GetSystemMetrics(SM_CYSCREEN); fullon(); if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; DrawBox(50, 50, 100, 100, GetColor(255, 255, 255), TRUE); ScreenFlip() ; WaitKey() ; fulloff(); WaitKey() ; fullon(); WaitKey() ; DxLib_End(); return 0; }
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.7 )
名前:にこよん 日時:2017/08/07 16:31

今のゲームに上の関数を埋め込んだのですが、一度仮想フルスクリーンにした後だと、 ウインドウモードに戻しても仮想フルスクリーンにしても描画したものがボヤっとしてしまいました。 ↓関数の2ヶ所「 //←ココ」と書かれた描画モード変更関数を追加することで治りました。 //裏画面と表画面の内容を交換する int ScreenFlip_Virtual() { SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面にする if (fullscreen_flag) { //仮想フルスクリーンモードかどうかで処理を分岐 //仮想フルスクリーンモードの場合 int ScalingSizeX, ScalingSizeY; //ゲーム画面の拡大描画のサイズを算出 ScalingSizeX = desktop_size_y * game_screen_size_x / game_screen_size_y; if (ScalingSizeX < desktop_size_x) { ScalingSizeY = desktop_size_y; } else { ScalingSizeX = desktop_size_x; ScalingSizeY = desktop_size_x * game_screen_size_y / game_screen_size_x; } //余りの部分を塗りつぶし if (ScalingSizeX != desktop_size_x || ScalingSizeY != desktop_size_y) { if (ScalingSizeX < desktop_size_x) { DrawBox(0, 0, (desktop_size_x - ScalingSizeX) / 2, desktop_size_y, GetColor(10, 10, 10), TRUE); DrawBox(desktop_size_x - (desktop_size_x - ScalingSizeX) / 2, 0, desktop_size_x, desktop_size_y, GetColor(10, 10, 10), TRUE); } else { DrawBox(0, 0, desktop_size_x, (desktop_size_y - ScalingSizeY) / 2, GetColor(10, 10, 10), TRUE); DrawBox(0, desktop_size_y - (desktop_size_y - ScalingSizeY) / 2, desktop_size_x, desktop_size_y, GetColor(10, 10, 10), TRUE); } } //ゲーム画面を拡大描画 SetDrawMode(DX_DRAWMODE_BILINEAR); DrawExtendGraph( (desktop_size_x - ScalingSizeX) / 2, (desktop_size_y - ScalingSizeY) / 2, desktop_size_x - (desktop_size_x - ScalingSizeX) / 2, desktop_size_y - (desktop_size_y - ScalingSizeY) / 2, game_screen_handle, FALSE); SetDrawMode(DX_DRAWMODE_NEAREST); //←ココ } else { SetDrawMode(DX_DRAWMODE_NEAREST); //←ココ DrawGraph(0, 0, game_screen_handle, FALSE); //ゲーム画面を等倍で裏画面に描画 } return ScreenFlip(); //裏画面の内容を表画面に反映 } それ以外特に問題なく、無事仮想フルスクリーンを実装できました。 ありがとうございました。 たろうさんの問題が解決次第、スレッドを解決にします。
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.8 )
名前:管理人 日時:2017/08/10 21:57

> たろうさん 載せて頂いたコードで私の Windows10環境でもタスクバーが隠れましたが、ウインドウの 表示優先順位的にはタスクバーの方が上の筈なので、何かの拍子にタスクバーが隠れなく なってしまうかもしれません なので、確実にタスクバーを隠す為に 仮想フルスクリーンモードがONで、且つウインドウがアクティブになった際に SetWindowZOrder( DX_WIN_ZTYPE_TOPMOST ); を、仮想フルスクリーンモードがOFFか、 又はウインドウが非アクティブになった際に SetWindowZOrder( DX_WIN_ZTYPE_NORMAL ); を 実行する処理を追加した方が良いかもしれません > にこよんさん 無事仮想フルスクリーンが実現できたようで何よりです
メンテ
Re: 描画回数を減らすモードと仮想フルスクリーン ( No.9 )
名前:たろう(解決) 日時:2017/08/11 00:44

いつもありがとうございます。たろうです。 管理人さん、ご返信ありがとうございます。 SetWindowZOrder( DX_WIN_ZTYPE_TOPMOST );と SetWindowZOrder( DX_WIN_ZTYPE_NORMAL ); を追加して使うようにします。 にこよんさん、横から失礼いたしました。 >たろうさんの問題が解決次第、スレッドを解決にします。 代わりに解決を付けさせていただきましたm(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存