メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.646) DX23 BGの階層化  2006/02/20


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第646回 DX23 BGの階層化
 発行    2006年2月20日(月曜日)
 発行数   約2500

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは、あゆしゃです。

 あゆしゃ、ちょっと酔い気味です。

 ワインのせいでは、それもありますが、

 前回、当たり判定によってマップに沿ってカメラの高さが
滑らかに設定されるように修正しました。

 ネクロゴンドやイシスを走り回り、

 バラモス城やオアシスを見て回りました。

 偶然、ピラミッドを先に発見してしまうという伝説も経験し、

 面白くはあったのですが、

 淡色の風景もあいまって、少し酔い気味というわけです。

 もっと繊細な表示が必要だと実感しました。

 作成初期段階のゲームのBGは、こんな感じなのでしょうか?

{magclick}
/*========================================================*/
 今回のお題  << DX23 BGの階層化 >>
/*========================================================*/

ドラクエマップ
http://xb_lim.at.infoseek.co.jp/dq/

マップチップ
http://ayusya.hp.infoseek.co.jp/Image/dq3maptipitems.png

マップデータソース
http://ayusya.hp.infoseek.co.jp/Source/dq3mapdata.h

現在のソース
http://ayusya.hp.infoseek.co.jp/Source/DX9Sample_060217.cpp
注:キー操作は643回のものを未反映、以下の操作で。
  A=スピード8倍 S=スピード8倍 AS同時=64倍
  D=左回転 F=右回転 矢印キー=平行移動
  光源の回転はデバッグ用に止めています。夜にはなりません。

/*========================================================*/

 前回までで、地面との当たり判定を組み込み、滑らかにマップを
移動できるようになりました。

 今回は、BGの階層化を考えます。

 現在のマップパーツは256メートル*256メートルで設定
しています。

 これは、非常に大雑把な表示です。

 プレイヤーの近くにあるパーツについては、より小さい範囲で
繊細なポリゴンを設定しましょう。

 階層は最終的に4つまで増やしたいですが、まずは2段階。

 プレイヤーの周囲32*32*256メートルを第1階層で
表示していますので、

 その4倍の精度、32*32*64メートルを第2階層で
表示しましょう。

 まず、ポリゴンの数と頂点の数を2倍します。

// メッシュを作成
if( FAILED( D3DXCreateMeshFVF( 1922*2, 1024*2, // ポリゴン数、頂点数
    D3DXMESH_MANAGED, D3DVERTEX::FVF, pDev, &pMesh ) ) ) break;

 次に、DX_SetMap に第1階層の処理に第2階層の処理を追加
します。

 いきなり混ぜてしまうと面倒なので、第1階層と第2階層を
ループごと別にします。

int tmx2 = DLM_MADD( mx, -4, DEF_MAP_DATA_WIDTH );
int tmy2 = DLM_MADD( my, -4, DEF_MAP_DATA_HEIGHT ); 
float bx2 = vbx - cellsize * 4; // 表示を開始する座標
float by2 = vby - cellsize * 4;
for( i = 0; i < 32; i++ ) {
    for( j = 0; j < 32; j++, pVert2++ ) {
        int dx = ( tmx2 + j/4 ) % DEF_MAP_DATA_WIDTH;
        int dy = ( tmy2 + i/4 ) % DEF_MAP_DATA_HEIGHT;
        float x = ( float )j * cellsize/4 + bx2;
        float y = ( float )i * cellsize/4 + by2;
        float r = DLM_FRAND( x, y );
        float z = height[ dy ][ dx ];
        DLM_SET_NXYZ( *pVert2, 0, 0, r*0.5f+0.5f );
        DLM_SET_XYZ( *pVert2, x, y, z );
        if( i < 31 && j < 31 ) {
            pData2[ 0 ] = map_data[ dy ][ dx ];
            pData2[ 1 ] = map_data[ dy ][ dx ];
            pData2 += 2;
            int k = i * 32 + j + 32 * 32;
            DLM_SET_012( pPoli2 + 0, k, k + 1, k + 32 + 1 );
            DLM_SET_012( pPoli2 + 3, k, k + 32 + 1, k + 32 );
            pPoli2 += 6;
        }
    }
}

 こんな感じでしょうか、第1階層のものを抜粋し、第2階層用に
座標を4分の1にあわせました。

 高さを第1階層と同じにしてありますので、見た目はあまり
変わりません。

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 今後の予定です。

 2月 6日月曜日 第640回 DX17 ドラクエ3 3D 済
 2月 8日水曜日 第641回 DX18 マテリアルの設定 済
 2月10日金曜日 第642回 DX19 高さ演算の再検証 済
 2月13日月曜日 第643回 DX20 キーボード操作 済
 2月15日水曜日 第644回 DX21 座標変更 済
 2月17日金曜日 第645回 DX22 当たり判定 済
 2月20日月曜日 第646回 DX23 BGの階層化 済
 2月22日水曜日 第647回 DX24 BGの階層化2
 2月24日金曜日 第648回 加重平均と時定数
 2月27日月曜日 第649回 微分と積分
 2月29日水曜日 第650回 第13回テスト

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は2月22日(水曜日)に、第647回をお送りします。
 お題は「DX24 BGの階層化2」

 高さを滑らかにする処理を考えます。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
もっとましでしょ なんて大歓迎です。

{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

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