設定で画面サイズをx2、×3とか

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

設定で画面サイズをx2、×3とか

#1

投稿記事 by 玉井 » 12年前

質問させて下さい。
nesなどのエミュレータにある様な
ウィンドウサイズの切り替えとともに、
実際のゲーム画面(グラフィック)まで切り替わる(拡大される)機能を
盛り込みたいのですが、DXライブラリにおいてはその辺を備えた関数?ありますか?
もしくは、どうにかすればうまく再現出来ますか?

というのも、現在8ビット風のグラフィックでゲームを
制作しているのですが、キャラ画像が16×16など、
サイズが小さすぎるので、制作のたびに2倍(16×16なら32×32に拡大)させた画像を使用しています。

しかし、それは本意では無く、本来は小さいサイズで作っているものを、
playするときに任意で画面サイズを変えて遊べる、みたいなのを実装したいのです。
NESのエミュレータとかそんな仕様なものが多いですよね。
ああいうのは、DXライブラリで出来ますか?
出来るなら自分は最高です。どうか、教えて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 設定で画面サイズをx2、×3とか

#2

投稿記事 by softya(ソフト屋) » 12年前

描画専用バッファから拡大描画するのが一般的ではないでしょうか。もちろんDXライブラリでも可能です。
MakeScreen()で描画専用バッファを作成。SetDrawScreen()で描画専用バッファに切り替えてゲームを描画、SetDrawScreen()で画面を切り替えて描画専用バッファから裏画面に拡大描画って感じです。

「MakeScreen」 こちらのサンプルではDX_SCREEN_FRONTに描画してますがDX_SCREEN_BACKに描画できますよ。
http://homepage2.nifty.com/natupaji/DxL ... html#R3N25
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

玉井

Re: 設定で画面サイズをx2、×3とか

#3

投稿記事 by 玉井 » 12年前

回答ありがとうございます。

MakeScreen()のリファレンスを読みましたが、
「描画対象にできるグラフィックを作成する」とあり、
ちょっと自分の知識ではどういった関数なのか、理解出来ませんでした。
ただ、”描画結果に画像補正処理や効果を施したり”とありましたので
もしかしてこれで画面サイズに合わせた画像の変更を、実現するには
表示させる各画像ひとつひとつに自分がこのMakeScreenを使って設定させてやるという感じなのでしょうか?
だとすれば、そうとうの手間な気がしますが、実現するにはそういうものなのでしょうか?

また、DXライブラリのリファレンスにて、
SetGraphMode()という関数を見つけまして
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1
これの概略が「画面モードの変更」となっておりました。
ご確認して頂きたいのですが、これはまったく違う用途につかう関数なのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 設定で画面サイズをx2、×3とか

#4

投稿記事 by softya(ソフト屋) » 12年前

MakeScreen()は320x240などの小さな描画対象の仮想画面を作ることができます。
描画対象の仮想画面とは、SetDrawScreen()で設定するとDrawGraph()など描画することが出来るものです。
サンプルを見てもらうと20x20と言う小さな仮想画面を作っておいてそれにDrawString()で文字を描画しています。これをDrawExtendGraph()で640x480に拡大描画しているんですが分かりますか?

それとSetGraphMode()は、本来の描画するDX_SCREEN_FRONTやDX_SCREEN_BACKの画面サイズを決めるものです。ウィンドウモードだとウィンドウのサイズも変わります。
フルスクリーンだとサイズに制限がありますが、ウィンドウモードだと自由にサイズを変えても構いません。

で総合するとMakeScreen()でファミコンサイズの画面を作ります。SetGraphMode()で拡大した後のサイズを決めます。
MakeScreen()した画面を拡大してSetGraphMode()のサイズにして描画するのはDrawExtendGraph()を使います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 設定で画面サイズをx2、×3とか

#5

投稿記事 by ISLe » 12年前

描画処理はSetDrawScreenでオフスクリーンを対象にするだけでいつもどおりです。

コード:

#include "DxLib.h"

static void Render() {
	DrawBox(0,0,320,240,GetColor(255,255,255),FALSE);
	DrawLine(0,0,320,240,GetColor(255,255,255));
	DrawLine(0,240,320,0,GetColor(255,255,255));
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return 0;
	SetDrawScreen(DX_SCREEN_BACK);

	int offscreen_handle = MakeScreen(320,240,FALSE);

	bool bExtend = false;
	bool bKeyDown = false;
	while (ProcessMessage() == 0 && ScreenFlip() == 0) {
		if (CheckHitKey(KEY_INPUT_SPACE) == 1) {
			// スペースキーで切り替え
			if (!bKeyDown) bExtend = !bExtend;
			bKeyDown = true;
		}
		else {
			bKeyDown = false;
		}
		if (!bExtend) {
			// ふつうに描画
			ClearDrawScreen();
			Render();
		}
		else {
			// オフスクリーンを描画対象に
			SetDrawScreen(offscreen_handle);
			// いつもどおり描画
			ClearDrawScreen();
			Render();
			// バックバッファを描画対象に
			SetDrawScreen(DX_SCREEN_BACK);
			// オフスクリーンを拡大描画
			DrawExtendGraph(0,0,640,480,offscreen_handle,FALSE);
		}
	}
	
	DxLib_End();
	return 0;
}

玉井

Re: 設定で画面サイズをx2、×3とか

#6

投稿記事 by 玉井 » 12年前

ありがとうございます。
お二人の解説(ISLeさんのプログラムも実行してみました)で
理解したつもりになれたのですが、、、
もしかして、自分のやりたいことって
ものすごく簡単に出来るんですか?

要は、 MakeScreen()で仮想画面を作り、
それをSetGraphMode()にて任意のサイズにして
DrawExtendGraph()にて描画する。

たったこれだけのことで、出来てしまうということでしょうか?
しかも、これってmain.cppの最初に書くだけで済みますよね?
自分が制作したゲームのプロジェクトのmain.cppにそれらを加えれば
一瞬で拡大させたゲーム画面で遊べるということですよね?

いや、実は、先ほど知人に相談したところ(まだこちらでの回答を確認していない時)、
ゲーム内の画像描画はもちろん、移動や当たり判定に使う、
すべての位置を指す値に、「×A(変数)」を書いてやり、
そのAの中に画面を2倍にしたいなら2を代入したらいいじゃない、
といった意見をもらったので、非常に参っていたのですが、、

要は、そういった面倒なことを一切やる必要がなく、
普通に小さなサイズのまま制作したゲームを、
上記の関数を使えば、
まとめてすべてを拡大させて、
つまりは虫眼鏡を通してゲーム画面を見ているように
play出来るということですよね。。。?
この認識でよろしいですか?

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

Re: 設定で画面サイズをx2、×3とか

#7

投稿記事 by ISLe » 12年前

玉井 さんが書きました:普通に小さなサイズのまま制作したゲームを、
上記の関数を使えば、
まとめてすべてを拡大させて、
つまりは虫眼鏡を通してゲーム画面を見ているように
play出来るということですよね。。。?
この認識でよろしいですか?
その認識でよろしいです。

拡大率が大きいとアンチエイリアスでボケボケになってしまったり、逆にアンチエイリアスをかけないと等倍でないときドットの大きさがバラバラになります。
どんな画面サイズでもドットが綺麗に出るようにしたいとなると、いったんアンチエイリアスなしで大きめの等倍に転送したものを、アンチエイリアスありで転送するというオフスクリーン二段構えにする必要がありますが、それでも既存のコードを変える必要はないです。


例え自前で拡大する場合でも影響を受けるのは描画処理だけです。

玉井

Re: 設定で画面サイズをx2、×3とか

#8

投稿記事 by 玉井 » 12年前

なんと、、最高ですね、DXライブラリは。
大きな悩みのひとつが解消され、
ますます楽しんでプログラムできそうです。
ありがとうございました。

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

Re: 設定で画面サイズをx2、×3とか

#9

投稿記事 by ISLe » 12年前

ちなみにDirect3DやOpenGLでは、テクスチャをオフスクリーンとしてレンダリングターゲットに指定していつもどおり描画、オフスクリーンをテクスチャとして描画、というふうにします。
どの処理系でもこのあたりは同じようにできます。

てらす

Re: 設定で画面サイズをx2、×3とか

#10

投稿記事 by てらす » 12年前

解決済みですが少し気になったので書き込みさせてください。
私は玉井さんの目指すものをDXライブラリで実装するとき、SetGraphModeで解像度を設定した後、
SetWindowSizeExtendRateで目的のクライアントサイズまで拡大するという手法をとっています。
アンチエイリアスが必要なく、ゲーム中にウインドウサイズまで変更するのであれば、こちらも有用だと思うのです。

他の方がSetWindowSizeExtendRateをおすすめしないのが何かの理由あってだと怖いので、
何か問題があればご指摘いただけると嬉しいです。

※ ISLeさんのコードを元に触らせていただきました。

コード:

#include "DxLib.h"

static void Render() {
    DrawBox(0,0,320,240,GetColor(255,255,255),FALSE);
    DrawLine(0,0,320,240,GetColor(255,255,255));
    DrawLine(0,240,320,0,GetColor(255,255,255));
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	double wExRate = 1.0; //最初の画面の倍率を指定
	SetGraphMode(320, 240, 32);	//320×240 32bitに設定
	SetWindowSizeExtendRate( wExRate ); //画面サイズをwExtend倍にする

	ChangeWindowMode( TRUE );
	if (DxLib_Init() != 0) return 0;
	SetDrawScreen(DX_SCREEN_BACK);

	bool bKeyDown = false;
	while (ProcessMessage() == 0 && ScreenFlip() == 0) {
		//上下で画面倍率を変更
		if (CheckHitKey(KEY_INPUT_UP) == 1) {
			if (!bKeyDown && wExRate < 4) SetWindowSizeExtendRate( ++wExRate );
			bKeyDown = true;
		}else if(CheckHitKey(KEY_INPUT_DOWN) == 1){
			if (!bKeyDown && wExRate > 0) SetWindowSizeExtendRate( --wExRate );
			bKeyDown = true;
		}else{
			bKeyDown = false;
		}

		ClearDrawScreen();
		Render();
	}
	DxLib_End( ); 
	return 0;
}

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

Re: 設定で画面サイズをx2、×3とか

#11

投稿記事 by ISLe » 12年前

てらす さんが書きました:他の方がSetWindowSizeExtendRateをおすすめしないのが何かの理由あってだと怖いので、
何か問題があればご指摘いただけると嬉しいです。
SetWindowSizeExtendRateをお勧めしないのはわたしがドットのカクカクが好きだからですね。

SetWindowSizeExtendRateの拡縮では、ピクセル補完はグラフィックドライバ任せで、アプリから制御できないそうです。
「アンチエイリアスが必要なく」と書かれていますが、環境によってアンチエイリアスがかかったりかからなかったりしますし、かかる場合バイリニアとかでボケボケになったりします。

あとはフルスクリーンモードでオリジナルのアスペクト比で表示したい場合も使えないですかね。

てらす

Re: 設定で画面サイズをx2、×3とか

#12

投稿記事 by てらす » 12年前

ISLe さんが書きました: SetWindowSizeExtendRateの拡縮では、ピクセル補完はグラフィックドライバ任せで、アプリから制御できないそうです。
「アンチエイリアスが必要なく」と書かれていますが、環境によってアンチエイリアスがかかったりかからなかったりしますし、かかる場合バイリニアとかでボケボケになったりします。
あとはフルスクリーンモードでオリジナルのアスペクト比で表示したい場合も使えないですかね。
なるほど。そんな問題があったのですね。
私もドット絵が好きなので、確かにアンチエイリアスの制御をアプリからできないのは問題になりそうです。
フルスクリーンモード時のアスペクト比については盲点でした。と言うか私自身DXライブラリでアスペクト比を制御するのを諦めてました。
私もまだまだ勉強不足なようです。失礼しました。

閉鎖

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