メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.636) マップチップデータの作成  2006/01/27


/*========================================================*/
    <<<あゆしゃの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

ブラウザの閉じるボタンで閉じてください。