スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

『4人対戦画面』 を作ってみた

今日は、4人対戦画面を作ってみました。


【参考画像】
4人対戦とか

左上:1P   右上:2P
左下:3P   右下:4P
  みたいな。


で、コレはどうやるのか?というと物凄く簡単!

何度か述べたように、描画する際には
-------------------------------------
1、ワールド変換行列
2、ビュー行列
3、射影行列
4、ビューポート行列

-------------------------------------
この4つの行列変換を経て描画しているわけですが、

最後にかけるビューポート行列が、
クライアント座標のどの領域に描画するか?を決めてます。

で、まず このビューポート行列についてですが、

普通に初期化すると、DirectX側が
こっそりウィンドウのクライアント領域と同じサイズに設定してくれてます。
自分から明示的に設定しなかったりするので、 なんとなくプログラミングしてると、
ビューポート行列の存在に気付かない可能性有り。)


では、ビューポート行列を明示的に設定するにはどうすれば良いか?というと
--------------------------------------------------------------
D3DVIEWPORT9型の変数に任意の値を入れ、
SetViewport関数を呼びます。
--------------------------------------------------------------
これでOKです。

ワールド変換行列や、ビュー行列射影行列なんかは
------------------------------------------------------------------
g_pD3DDevice->SetTransform(D3DTS_WORLD, &mat);
g_pD3DDevice->SetTransform( D3DTS_VIEW, &g_view );
g_pD3DDevice->SetTransform( D3DTS_PROJECTION, &g_proj );

------------------------------------------------------------------
こんな風にD3DXMATRIX型の変数を定義し、SetTransform関数を呼ぶのに、

ビューポート行列だけ設定の仕方が違う のです。
意味分かんないですよね。

↓どうして、こんな感じの形式にならなかったのだろう。
g_pD3DDevice->SetTransform( D3DTS_VIEWPORT, &g_viewport );


ともかく、D3DVIEWPORT9型について。
D3DVIEWPORT9のメンバは下記の様になってます。
typedef struct D3DVIEWPORT9 {
DWORD X;   //左上隅のx座標
DWORD Y;   //左上隅のy座標
DWORD Width;   //横幅
DWORD Height;   //縦幅
float MinZ;   //深度値の最小値 通常は0.0f
float MaxZ;   //深度値の最大値 通常は1.0f
}

【参考URL】D3DVIEWPORT9

このメンバを設定すればOKという訳です。

例えば、 4分割した内の左上の画面の設定はこんな感じになります。
-----------------------------------
g_vp[0].X = 0;
g_vp[0].Y = 0;
g_vp[0].Width = WINDOW_WIDTH/2;
g_vp[0].Height = WINDOW_HEIGHT/2;
g_vp[0].MinZ = 0.0f;
g_vp[0].MaxZ = 1.0f;
-----------------------------------
※WINDOW_WIDTH と WINDOW_HEIGHT はオブジェクト形式マクロです。


最後に、描画する際はこんな手順になります。
-----------------------------------------------
【1】任意のビューポートを設定する。
【2】Clear関数で、描画対象にした領域をクリア。
【3】何かを描画する。

-----------------------------------------------
※プレイヤーによって、カメラの位置なども変わると思いますので、
おそらく、【1】の後にカメラの再設定処理も挟まってくると思います。

【ソースコード】Sample_SplitWindow.txt
※このサンプルでは、カメラの位置も別々に設定してます。
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。