|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第636回 マップチップデータの作成 発行 2006年1月27日(金曜日) 発行数 約2500 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは、あゆしゃです。 木曜ロードショーのゾロ、かっこよかったですね。 ワンピースのゾロのかっこよさが、良くわかります。 あの、「間抜けかっこいい」ゾロのよさが、良くわかります。 {magclick} /*========================================================*/ 今回のお題 << マップチップデータの作成 >> /*========================================================*/ ドラクエのマップは、このページで公開されています。 http://xb_lim.at.infoseek.co.jp/dq/ 前回、ここから取得したドラクエ3のマップ画像を、256* 256の画像に変換する処理を作成しました。 http://ayusya.hp.infoseek.co.jp/Image/dq3maptip.png /*========================================================*/ 今回は、その変換済みの画像から、ソースコードを生成します。 とりあえず、色番号をTreeMasterで集計します。 木構造についてはテンプレートも考えたのですが、どうも使い 勝手はマクロの方がいいです。 struct color_table_t { COLORREF color; int gx, gy; int no; DEF_INTTREE_ALLITEM( color_table_t ); }; color_table_t* color_table = NULL; DEF_INTTREE_ALLFUNCS( color_table_t, color_table ); 読み込み処理にて、addを追加しておきます。 そして、ソースコードの生成処理を作成します。 /*========================================================*/ CWaitCursor wc; sort_color_table(); int cnt = count_color_table(); int i = 0; color_table_t* pd; for( pd = find_color_table_left(); pd; pd = pd->next ) { pd->no = i++; } int w = imgTip.GetWidth(); int h = imgTip.GetHeight(); CDC& dc = *CDC::FromHandle( imgTip.GetDC() ); CString st; CString st_all; CString st_line; まずはデファイン定義で数を出力します。 st.Format( "#define DEF_MAP_TIP_NUM (%d)\r\n", cnt ); st_all += st; st.Format( "#define DEF_MAP_DATA_WIDTH (%d)\r\n", w ); st_all += st; st.Format( "#define DEF_MAP_DATA_HEIGHT (%d)\r\n", h ); st_all += st; チップデータの構造体を出力します。 後でDX用カラー値に変換するため、RGBに分解して出力します。 st_all += "struct map_tip_t {\r\n"; st_all += "\tint r, g, b;\r\n"; st_all += "} map_tip[ DEF_MAP_TIP_NUM ] = {\r\n"; for( pd = find_color_table_left(); pd; pd = pd->next ) { int r = GetRValue( pd->color ); int g = GetGValue( pd->color ); int b = GetBValue( pd->color ); st.Format( "{%3d,%3d,%3d},\t// TipNo:%2d \r\n", r, g, b, pd->no ); st_line += st; } st_all += st_line; st_all += "};\r\n"; マップデータを出力します。 st_all += "int map_data[ DEF_MAP_DATA_HEIGHT ][ DEF_MAP_DATA_WIDTH ] = {\r\n"; for( i = 0; i < h; i++ ) { st_line = ""; for( int j = 0; j < w; j++ ) { COLORREF c = dc.GetPixel( j, i ); pd = find_color_table( c ); if( pd ) st.Format( "%2d,", pd->no ); else st = " 0,"; st_line += st; } st_all += st_line + "\r\n"; } st_all += "};\r\n"; CClipboard::SetString( st_all ); 以上のプログラムの、出力結果です。 http://ayusya.hp.infoseek.co.jp/Source/dq3mapdata.h 番号だけでドラクエ3のマップが再現されてしまっています。 一見の価値ぐらいはありそうな迫力です。 /*========================================================*/ 番号だけでは判りにくいので、番号対応表を作ってみました。 http://ayusya.hp.infoseek.co.jp/Image/dq3maptipitems.png 前回44個のパーツと書きましたが数えてみると42個ですね。 森が2つありますが、アッサラームの街の北北西の森に誤植が あり、それが反映されてしまっています。 {magclick} /*========================================================*/ さいごに /*========================================================*/ 今後の予定です。 1月16日月曜日 第631回 DX14 回転演算 済 1月18日水曜日 第632回 DX15 マップを移動する 済 1月20日金曜日 第633回 DX16 太陽を回す 済 1月23日月曜日 第634回 乱数生成アルゴリズム 済 1月25日水曜日 第635回 ドラクエ3のマップを得る 済 1月27日金曜日 第636回 マップチップデータの作成 済 1月30日月曜日 第637回 高さ演算を作成する {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は1月30日(月曜日)に、第637回をお送りします。 お題は「高さ演算を作成する」 高さを算出する処理を考えてみます。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 ゾロはどこにいると思う?それは君の心の中 なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★最近のものならこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |