多人数ゲーム

解説


今回は多人数ゲームの実装法を解説します。 多人数ゲームというのは昔からありました。 最近ではテイルズシリーズのようにRPGでさえ多人数ゲームになりました。 どんなゲームであろうと一人でゲームをするより皆でゲームをする方が楽しいです。

キャラクタの管理


多人数ゲームを実装するに当たってキャラクタの管理をする必要があります。 ただ、管理をするのは非常に簡単です。 プレイヤー1と2の違いがあるのはデータの中身とキー入力だけです。 ほとんど情報が同じのため同じクラスや構造体からオブジェクトを発生した方がいいでしょう。

multi_player.png


キー入力についてはフラグかなんかで分岐してプレイヤーごとのキー入力に分け方法もあります。 また、ポインタなどを使ってキー情報にアクセスするにもいいでしょう。

同じ画面内で描画


描画をいろいろと見てみますと多人数ゲームの画面の視点の場合は二種類あることがわかります。 まず一つ目がボンバーマンのように一画面内に全てのプレイヤーが表示されます。 そしてもう一つがマリオカートのように画面を分割してプレイヤーを表示させます。
同じ画面内で実装するのは特に問題は無いですね。 描画するプレイヤーが増えただけです。

same_disp.png

画面を分割して2D描画


2Dゲームの画面分割は簡単に出来ます。 マリオカートのように上下に分割するときに、上の分割はY座標の値を通常の半分にします。 また、下の座標は通常の値の半分にして画面の値の半分を足します。

2d_bunkatu.png

画面を分割して3D描画


一番問題なのがこの3D描画の分割です。 分割して描画しようとしても描画は画面を占領して描画しているのでまず無理です。 サーフェスを使って描画することも考えましたが、めんどくさすぎますし重過ぎます。 そこでビューポートを使って画面分割して表示させます。

ビューポートとは指定した転送先の矩形の表示領域のことを言います。 このビューポートはスクリーン座標で操ります。 言葉で説明するより図で見たほうが早いでしょう。

3d_vie.png


転送元の射影座標系を転送先のビューポートに転送させます。 普通はウィンドウを全て使って表示されますが、ビューポートを指定した場合は指定した範囲内で描されます。

それとこのビューポートは3Dしか使えません。 これは2Dのオブジェクトが直接スクリーンを指して描画しているためです。

それではビューポートを使ったプログラムの説明をします。 これはDirectX9のプログラムです。 DirectXのライブラリ以外にもビューポートは必ずあるはずです。

   //=================================
   //ビューポートのデータを定義
   //=================================
   const D3DVIEWPORT9 viewData1 = { 0, 0, clientwidth / 2, clientheight / 2, 0.0f, 1.0f 
   const D3DVIEWPORT9 viewData2 = { clientwidth / 2, 0, clientwidth / 2, lientheight / 2, 0.0f, 1.0f 
   const D3DVIEWPORT9 viewData3 = { 0, clientheight / 2,  clientwidth / 2,clientheight / 2, 0.0f, 1.0f 
   const D3DVIEWPORT9 viewData4 = { clientwidth / 2, clientheight / 2, clientwidth / 2, clientheight 
                                                                / 2, 0.0f, 1.0f 

   //左上
   pDevice->SetViewport(&viewData1);
   pDevice->Clear(0,NULL,D3DCLEAR_TARGET | 3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(55,0,100,255),1.0f,0);
   描画    
    
   //右上
   pDevice->SetViewport(&viewData2);
   pDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(55,0,100,255),1.0f,0);
   描画

   //左下
   pDevice->SetViewport(&viewData3);
   pDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(55,0,100,255),1.0f,0);
   描画

   //右下
   pDevice->SetViewport(&viewData4);
   pDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_ARGB(55,0,100,255),1.0f,0);
   描画


ビューポートのデータは以下のD3DVIEWPORT9で定義されています。

 typedef struct _D3DVIEWPORT9 
 {
    DWORD X;     //矩形の左上のX座標
    DWORD Y;     //矩形の左上のY座標
    DWORD Width; //矩形の幅
    DWORD Height;//矩形の高さ
    float MinZ;  //Z座標の最小値(通常は0.0f)
    float MaxZ;  //Z座標の最大値 (通常は1.0f)
 } D3DVIEWPORT9;


この構造体を使ってデータを定義した後にSetViewPort?メソッドでビューポートを指定します。 そして忘れてはいけないのがClearメソッドです。 このメソッドを呼ばないとビューポートにごみがはいったっままになります。 最後にサンプルを載せます。サンプルは#ref(MultiPlayer.zip);こちらから。

協力プレイと非協力プレイ


多人数ゲームを作るときに気をつけなければならない要素がこの協力プレイと非協力プレイです。 これはあるときは協力をして、あるときは敵対することを意味します。

この要素を用いたゲームではドカポンがその最たるものでしょう。 一位に君臨したものをおとしめるために、2,3,4位の人たちが同盟を組んで一位の人を倒します。 そして一位の人を倒したら同盟を破棄して敵対します。

反対にこの要素が最も低いのが桃鉄でしょうか。 カードを使って一位を攻撃しようにも、ターゲットがランダムのために攻撃できません。 そのため、一位の人はなかなかおとしめることが出来ずに、2,3,4位の人はかなりつまらないです。

協力プレイを用いたものは何もドカポンだけではありません。 ボンバーマンでも一位の人を死んだ人がミソボンで狙えます。 メイドインワリオでは一位の人の画面を歩き回って邪魔ができます。 また、スマッシュブラザーズでも一位の人を協力して狙います。 こういった協力し合えるゲームってどれも面白いですよね。

注意


画面を分割する方法をここで紹介しましたが、プレイヤーが増えると一人一人の画面が狭くなってしまうなどといった問題があるので、プレイヤーは多くて四人ぐらいが妥当だと思います。

なお、ネットワーク対戦をする場合は、同じ画面でやるわけではないので、分割しないほうがよろしいと思います。


添付ファイル: fileMultiPlayer.zip 997件 [詳細] file2d_bunkatu.png 1447件 [詳細] file3d_vie.png 1363件 [詳細] filesame_disp.png 1173件 [詳細] filemulti_player.png 1267件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-20 (水) 22:13:35 (2287d)