交信情報を画面表示

キャラクタにゲーマータグを付けて動かしながら、交信した情報を画面表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. XNA には簡単に NET 接続できるソフトが組み込まれています。
    NET で交信した情報を画面表示すると共に、キャラクタにゲーマータグを付けて動かします。
    NET 接続の基本は NET Game 入門 を参照して下さい。
  2. host も client も同じプログラムを使用します。
    最初のプログラムを起動すると LAN 内が検索されて、Session が開設されていないと Create Session で Session が開設されます。
    次のプログラムを起動すると LAN 内が検索され Session が見つかると Join Session で host に接続されます。
    host が故障などで終了しても、client 側が新たな host になり、通信が確保されるようになっています。
  3. 今回はキャラクタのゲーマータグと交信情報を表示するために SpriteFont を使っています。
    詳細は フォントを設定して Score を表示 を参照して下さい。
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
    
            KeyboardState keyboardState;    // キーボード状態の宣言
            int     playerDir = 2;          // キャラクタの向き
            SpriteFont arial;               // フォントの宣言
    
            // ネットワークセッションの宣言
            NetworkSession networkSession = null;
            const int maxGamers = 16;       // プレイヤー全体の数(2 〜 31)
            const int maxLocalGamers = 4;   // 最大ローカルプレイヤーの数(1 〜 4)
    
            // パケットの宣言
            PacketWriter packetWriter = new PacketWriter();
            PacketReader packetReader = new PacketReader();
    
            // 出力メッセージ
            string message = "sign in...";
            string sendMessage = "--";
            string readMessage = "--";
    
  4. LoadContent() で SpriteFont をロードします。
            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                // TODO: use this.Content to load your game content here
                // フォントの呼出
                arial = Content.Load<SpriteFont>("Arial");
            }
    
  5. 描画処理を行う Draw() メソッドです。
    DrawString() で交信メッセージを表示します。
    foreach で接続している全てのキャラクタを描画します。
    自分のキャラクタが解るように、ゲーマータグの色を変えて描画しています。
            protected override void Draw(GameTime gameTime)
            {
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // TODO: Add your drawing code here
                spriteBatch.Begin();
    
                // メッセージの表示
                spriteBatch.DrawString(arial, message, new Vector2(100, 100), Color.White);
    
                if (networkSession != null)
                {
                    // パケット内容の表示
                    spriteBatch.DrawString(arial, "send: " + sendMessage, new Vector2(100, 520), Color.White);
                    spriteBatch.DrawString(arial, "read: " + readMessage, new Vector2(100, 540), Color.White);
    
                    // 接続しているキャラクタの描画
                    foreach (NetworkGamer gamer in networkSession.AllGamers)
                    {
                        // キャラクターの描画
                        Character player = gamer.Tag as Character;
                        player.Draw(spriteBatch, gameTime, Color.White);
    
                        // ゲーマータグの表示
                        if (gamer.IsLocal)
                        {
                            // 自分を赤で表示
                            spriteBatch.DrawString(arial, gamer.Gamertag, player.Pos + new Vector2(0, -20), Color.Red);
                        }
                        else
                        {
                            // 自分以外を青で表示
                            spriteBatch.DrawString(arial, gamer.Gamertag, player.Pos + new Vector2(0, -20), Color.Blue);
                        }
                    }
                }
                spriteBatch.End();
    
                base.Draw(gameTime);
            }
    
  6. セッション参加イベントで呼び出されるメソッドです。
            public void SessionJoin(object sender, GamerJoinedEventArgs e)
            {
                // セッション参加メッセージ
                message += "\nJoin: " + e.Gamer.Gamertag;
                // キャラクタの生成
                e.Gamer.Tag = new Character(Content);
            }
    
  7. セッション離脱イベントで呼び出されるメソッドです。
            public void SessionLeft(object sender, GamerLeftEventArgs e)
            {
                // セッション離脱メッセージ
                message += "\nLeft: " + e.Gamer.Gamertag;
            }
    
  8. セッション終了イベントで呼び出されるメソッドです。
            public void SessionEnd(object sender, NetworkSessionEndedEventArgs e)
            {
                // セッション終了メッセージ
                message = e.EndReason.ToString();
                // 切断処理
                networkSession.Dispose();
                networkSession = null;
            }
    
  9. これ以外は NET Game 入門 と同じです。

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(XNA(C#) game program)