解像度とウィンドウサイズについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
WhiteSea

解像度とウィンドウサイズについて

#1

投稿記事 by WhiteSea » 11年前

解像度は800x600,16bitで固定とし、ゲーム内でウィンドウサイズ・ウィンドウモード・色ビットを変更できるようにしたいと思い
テストとして以下のプログラムを組んだのですがフルスクリーン表示が出来ず困っています

コード:

#include "DxLib.h"

#define	SCREEN_W	(800)		// 解像度の横幅
#define	SCREEN_H	(600)		// 解像度の縦幅
#define	SCREEN_CB	(16)		// 色ビット数
#define WIND_W		(800)		// ウィンドウの横幅
#define WIND_H		(600)		// ウィンドウの縦幅
#define	WIND_SCREEN	(2)			// 0:フルスクリーン, 1:ウィンドウモード, 2:任意

struct{
	int		w, h;		// 縦横
	int		cb;			// 色ビット数
	int		scr_flag;	// ウィンドウモードにするか
}window={ WIND_W, WIND_H, SCREEN_CB, WIND_SCREEN };

int Window_Create(){

	// 任意の場合メッセージボックスからウィンドウ設定
	if( window.scr_flag == 2 ){
		int flag = MessageBox( NULL,
							   TEXT( "ウィンドウモードで表示しますか?" ),
							   TEXT( "画面設定" ),
							   MB_YESNO | MB_ICONQUESTION );
		if( flag == IDNO )	window.scr_flag = 0;
		else				window.scr_flag = 1;
	}
	
	// 解像度を設定
	if( SetGraphMode( WIND_W, WIND_H, window.cb ) != 0 )
		return -1;

	// yesだったらウィンドウモードに設定
	if( window.scr_flag == 1 ){
		// ウィンドウサイズを設定
		if( SetWindowSize( window.w, window.h ) != 0 ) return -1;
		// ウィンドウモードへ変更
		if( ChangeWindowMode( TRUE ) != 0 )	return -1;
	}
	
	// DXライブラリの初期化
	if ( DxLib_Init() != 0 )
		return -1;

	// 描画先を裏画面に設定
	if( SetDrawScreen( DX_SCREEN_BACK ) != 0 )
		return -1;
	
	return 0;
}

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
	Window_Create();

	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && CheckHitKey( KEY_INPUT_ESCAPE )==0 ){

		// FPS値を描画
		DrawFPS( SCREEN_W/2, SCREEN_H/2, TRUE );

	}

	DxLib_End();
	return 0;
}
自分のイメージとしては「ウィンドウモードで表示しますか?」というメッセージに対し「はい」を選択すると
window.scr_flagに1が入り、SetWindowSize()とChangeWindowMode()でウィンドウモードとサイズを変更
「いいえ」を選択するとwindow.scr_flagには0が入り、そのままif文をスルーして
800x600,16bit設定のフルスクリーン画面が表示されるだろうと考えていたのですが…

SetGraphMode() ←これが怪しいかなぁ…と薄々感じているのですが
この関数の用途は間違っているのでしょうか?

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 解像度とウィンドウサイズについて

#2

投稿記事 by dic » 11年前

コード:

// DXライブラリの初期化
    if ( DxLib_Init() != 0 )
        return -1;
これを WinMain の一番最初で実行したらどうなりますか?
Window_Create();
よりも先に実行してみてください。

WhiteSea

Re: 解像度とウィンドウサイズについて

#3

投稿記事 by WhiteSea » 11年前

dicさん返信ありがとうございます
dic さんが書きました:

コード:

// DXライブラリの初期化
    if ( DxLib_Init() != 0 )
        return -1;
これを WinMain の一番最初で実行したらどうなりますか?
Window_Create();
よりも先に実行してみてください。
実行してみたところエラーで落ちてしまいました・・・

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 解像度とウィンドウサイズについて

#4

投稿記事 by dic » 11年前

これは、知らない人は知らないかな?
DirectX のフルスクリーンモードで、メッセージボックスを出すときは、
特殊な方法が必要です。
なので、WhiteSeaさんの最初のコードでは、
フルスクリーンモードで起動 -> メッセージボックスを出すためにWindowsが
無理矢理ウィンドウモードに切り替えていてて、あまりよろしくない方法だそうです。
なので、詳しい原因はわかりませんが、質問に いいえ で答えると
次の解像度設定で失敗しているようです。
戻り値 DX_CHANGESCREEN_RETURN を検出しました。
エラーの意味は 画面の変更は失敗し元の画面モードに戻された だそうです。
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1

ウィンドウモードに無理矢理切り替えた状態から、解像度設定をしようとして、失敗
そのまま return -1; で Create_Window() 関数は終わっているようです。


あと、訂正です。
最初の回答で DxLib_Init() は最初に呼び出してとお願いしましたが、
上のリンクを読んでみると、

なおこの関数を DxLib_Init 関数を使用する前に呼び出すことにより初期状態の画面モードを設定することが出来ます。

とありますので、ここは訂正しておきます。すいません。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 解像度とウィンドウサイズについて

#5

投稿記事 by ISLe » 11年前

当初のコードはDxLib_Initを呼ぶ前にダイアログボックスを表示しているので、いったんフルスクリーンに切り替わることはありませんね。

Win7 64bit + GeForce GTS 250 (ドライババージョン334.89)の環境ではフルスクリーンに切り替わります。

最近は16ビットカラーをサポートしないグラフィックボードがけっこうあるそうなのでそのせいなのでは。
SetGraphModeに32ビットカラーを指定したらフルスクリーンに切り替わりませんか?

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 解像度とウィンドウサイズについて

#6

投稿記事 by dic » 11年前

>>ISLeさん
ご指摘ありがとうございます。
なにか私が勘違いをしていたようです。

たしかに No1 のコードでは、メッセージボックスが最初にでます。
そして、私の環境では、最初の質問に「はい」「いいえ」どちらを選んでも
期待した通りの動作をしました。

私の環境では、WhiteSeaさんのおっしゃる SetGraphMode関数は失敗していませんでした。

以下、すこし私が手直したコードを用意しました。
F1でウィンドウモード、F2でフルスクリーンに変更するようにしました。
もし、これでうまくいかないときは、グラフィックカードが、800x600x16の解像度をサポートしているか
確認してみてください。

デスクトップの解像度の確認は以下のリンク先を参考にしてください。
私がだらだら書くより、丁寧に説明されています。
http://www.sakyou.com/ManualShop/Window ... index.html



以下、ちょっとだけいじったコード
SetGraphMode で失敗したら -1 を返して終了するようにしています。

コード:

// [2012 12 10] DxLib骨組み.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "DxLib.h"
 
#define SCREEN_W    (800)       // 解像度の横幅
#define SCREEN_H    (600)       // 解像度の縦幅
#define SCREEN_CB   (16)        // 色ビット数
#define WIND_W      (800)       // ウィンドウの横幅
#define WIND_H      (600)       // ウィンドウの縦幅
#define WIND_SCREEN (2)         // 0:フルスクリーン, 1:ウィンドウモード, 2:任意
 
struct{
    int     w, h;       // 縦横
    int     cb;         // 色ビット数
    int     scr_flag;   // ウィンドウモードにするか
}window={ WIND_W, WIND_H, SCREEN_CB, WIND_SCREEN };
 
int Window_Create(){
 
    // 任意の場合メッセージボックスからウィンドウ設定
    if( window.scr_flag == 2 ){
        int flag = MessageBox( NULL,
                               TEXT( "ウィンドウモードで表示しますか?" ),
                               TEXT( "画面設定" ),
                               MB_YESNO | MB_ICONQUESTION );
        if( flag == IDNO )  window.scr_flag = 0;
        else                window.scr_flag = 1;
    }
    
    // 解像度を設定
    if( SetGraphMode( WIND_W, WIND_H, window.cb ) != 0 )
        return -1;
 
    // yesだったらウィンドウモードに設定
    if( window.scr_flag == 1 ){
        // ウィンドウサイズを設定
        if( SetWindowSize( window.w, window.h ) != 0 ) return -1;
        // ウィンドウモードへ変更
        if( ChangeWindowMode( TRUE ) != 0 ) return -1;
    }
    
    // DXライブラリの初期化
    if ( DxLib_Init() != 0 )
        return -1;
 
    // 描画先を裏画面に設定
    if( SetDrawScreen( DX_SCREEN_BACK ) != 0 )
        return -1;
    
    return 0;
}
 
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){

	
	//	仮に SetGraphMode で失敗したら終了する
	if( -1 == Window_Create() )
		return 0;
 
    while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && CheckHitKey( KEY_INPUT_ESCAPE )==0 ){
 
        // FPS値を描画
//        DrawFPS( SCREEN_W/2, SCREEN_H/2, TRUE );
		DrawString( 200, 200, L"画面描画", GetColor(255,255,255) );

		DrawString( 200, 220, L"F1:Window MODE", GetColor(255,255,255) );
		DrawString( 200, 240, L"F2:FullScreen MODE", GetColor(255,255,255) );

		ScreenFlip();

		if( CheckHitKey(KEY_INPUT_F1) )
			ChangeWindowMode( TRUE );
		if( CheckHitKey(KEY_INPUT_F2) )
			ChangeWindowMode( FALSE );
 
    }
 
    DxLib_End();
    return 0;
}


lemy

Re: 解像度とウィンドウサイズについて

#7

投稿記事 by lemy » 10年前

あてにならないレスしかせず、更にISLeさんのレスで大方解決している(かもしれない)のにも関わらず、何を思ったのか、質問者の全く求めてない機能を取り付けただけのコードを貼るdic氏

正直、Dxlib_Initの仕様さえも理解していない時点でDXライブラリを理解してる事さえも疑わしいのですが... 何故回答しようと思ったのでしょうか?自分にこの問題は解決出来ないと分かれば、大人しく退いてもらった方が、質問者としてもありがたいと思いますよ。


ちなみに私も、Windows 7 64bit 、GeForce GT 750Mと言う環境ですが、フルスクリーンになりました。
解決方法としては、運が良ければグラボのドライバを更新すると表示されると思いますが、結局のところ32bitカラーを使った方が良いと思います。理由としては、グラボによってはフルスクリーンに出来ない、処理が重くなる等のネックがあるからです。(しかし、解像度が高いと32bitカラーの方が重いと言う事もあります。)
ただ、質問者の使用している様なグラボであると色々な場面で不便かと思いますので、私個人としては思いっきり買い換える事をオススメしたいですね。

閉鎖

“C言語何でも質問掲示板” へ戻る