ページ 11

初心者です。***.datの作成について

Posted: 2013年2月06日(水) 17:42
by 図書館
C++でプログラミングを始めたのですが、
設定画面で背景色を切り替えた時に何色に切り替えたのかを
ここ( http://dixq.net/g/03_11.html )を参照に
***.datに記録したいのですが、
どのようにすればいいか良い案が思いつきません。
どうすればいいでしょうか?

Re: 初心者です。***.datの作成について

Posted: 2013年2月06日(水) 18:07
by softya(ソフト屋)
もう少し具体的に質問をお願いします。
「3.11章 セーブデータの作り方」
の何処の部分がわからないのでしょうか?
理解できていれば応用は可能です。

Re: 初心者です。***.datの作成について

Posted: 2013年2月06日(水) 18:26
by 図書館

コード:

  fwrite( &money, sizeof(int), 1, fp ); // ファイルにmoneyの値を出力する 
の部分です。
これにどうやって背景色の値を入れてやればいいのか思いつきません。

Re: 初心者です。***.datの作成について

Posted: 2013年2月06日(水) 18:32
by softya(ソフト屋)
GetColor()での色もint型ですので、同じようにセーブ出来ます。
ただし、ビデオカードの動作が変わると互換のない色情報に変わる恐れが有るのでR,G,Bのそれぞれのint値を保存したほうが良いでしょう。

【補足】
まず、バイナリファイルって何?から理解したほうが良いのでサイトを紹介しておきます。
「バイナリファイルの読み書き」
http://homepage3.nifty.com/mmgames/c_guide/17-02.html

Re: 初心者です。***.datの作成について

Posted: 2013年2月06日(水) 23:28
by ISLe
DXライブラリを使っているのならWindows SDKのRGBマクロを流用したら良いのでは。

Re: 初心者です。***.datの作成について

Posted: 2013年2月07日(木) 10:22
by 図書館
softya(ソフト屋) さんが書きました:GetColor()での色もint型ですので、同じようにセーブ出来ます。
ただし、ビデオカードの動作が変わると互換のない色情報に変わる恐れが有るのでR,G,Bのそれぞれのint値を保存したほうが良いでしょう。

【補足】
まず、バイナリファイルって何?から理解したほうが良いのでサイトを紹介しておきます。
「バイナリファイルの読み書き」
http://homepage3.nifty.com/mmgames/c_guide/17-02.html
ありがとうございます。
できるようになりました!
ついでに

プログラム起動時にConfig.datを読み込んで設定を適用するようにしたのですが
初回起動時にConfig.datがないとプログラムが強制終了してしまいます。
「Config.datない時(または、読み込めなかった時)」と条件をつけてやりたいのですが、どうすればいいでしょうか?

Re: 初心者です。***.datの作成について

Posted: 2013年2月07日(木) 10:35
by softya(ソフト屋)
fopenで戻り値がNULLだったらファイルがないと言うことです。
それで分岐できませんか?

Re: 初心者です。***.datの作成について

Posted: 2013年2月07日(木) 10:50
by 図書館

コード:

void Config_Load(){
	ConfigData Data;
	FILE *fp = fopen("Config.dat", "rb");
	if(fp == NULL){                         // Config.datを読み込めない時
		R = 100, G = 180, B =0;     // RGBに値を代入
	} else {                // Config.datを読み込んだら
		fread(&Data, sizeof(int), 3, fp);   // データを取り出し
		R = Data.Bg_R, G = Data.Bg_G, B = Data.Bg_B;   // RGBに代入
	}
	fclose(fp);
	SetBackgroundColor(R, G, B);
}
一応、やっては見たのですが起動するとすぐに終了してしまいます。

Re: 初心者です。***.datの作成について

Posted: 2013年2月07日(木) 10:52
by 図書館
すみません
fclose(fp);を内側に入れるとうまくいきました。