民初思韻網

加入收藏   設為首頁
選擇語言   簡體中文
你好,請 登陸 或 注冊
首頁 人文思韻 傳奇人物 歷史思潮 時代作品 話題討論 國民思韻 民初捐助 賬戶管理
  搜索  
    人文精神 >>> 技術的天空 溫和的思緒
字體    

Windows Phone XNA創建簡單局域網游戲
Windows Phone XNA創建簡單局域網游戲
dgwutao     阅读简体中文版

     XNA是微軟推出的一個基于DirectX的.net平臺游戲開發框架,用來開發XBOX和Windows桌面的游戲,后被移植到了silverlight和windows phone上。內部是一個game loop,不同于事件驅動模式,但也不難掌握,性能方面還是不錯的。下面就用XNA創建一個簡單的局域網游戲。

網絡連接無外乎就是那么幾個階段,連接-發送、接收數據-斷開。

用到的幾個主要的類是:

復制代碼
        using Microsoft.Xna.Framework.Net;
        //網絡連接會話類
        NetworkSession networkSession;
        //發送packet的類
        PacketWriter packetWriter = new PacketWriter();
        //讀取packet的類
        PacketReader packetReader = new PacketReader();
復制代碼

游戲開始需要有一個人來創建一個session,然后有人來加入到你創建的游戲當中來。

創建游戲session:

復制代碼
            // 創建一個session,最大人數2
            networkSession = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 2);
            networkSession.AllowHostMigration = true;
            networkSession.AllowJoinInProgress = false;
            //綁定join和left時間
            networkSession.GamerJoined += GamerJoined;
            networkSession.GamerLeft += GamerLeft;

        void GamerJoined(object sender, GamerJoinedEventArgs e)
        {
                //tag是一個object類型的容器,用來保存用戶自定義的信息。
                e.Gamer.Tag = new entity;
        }

        void GamerLeft(object sender, GamerLeftEventArgs e)
        {
            networkSession.Dispose();
            networkSession = null;
        }
復制代碼

加入游戲:

復制代碼
            // 查找是否存在游戲session
            AvailableNetworkSessionCollection sessions =
                NetworkSession.Find(NetworkSessionType.SystemLink, 1, null);
            if (sessions.Count > 0)
            {
                //如果session存在,就加入到這個session中
                networkSession = NetworkSession.Join(sessions[0]);
                //綁定join和left事件,同上
                networkSession.GamerJoined += GamerJoined;
                networkSession.GamerLeft += GamerLeft;
            }
復制代碼

加入到游戲session之后就開是玩家之間進行數據的傳輸和接收了。

復制代碼
        protected void UpdateLocalPlayer(GameTime gameTime)
        {
            // 獲取本地玩家
            LocalNetworkGamer localGamer = networkSession.LocalGamers[0];

            // 獲取上面綁定到tag中的entity
            entity sprite = (entity )localGamer.Tag;

            // 寫入數據到packetWriter中
            packetWriter.Write((int)1);
            packetWriter.Write(Vector.Zero);

            // 發送數據
            localGamer.SendData(packetWriter, SendDataOptions.InOrder);

        }
復制代碼
復制代碼
        protected void ProcessIncomingData(GameTime gameTime)
        {
            // 獲取玩家
            LocalNetworkGamer localGamer = networkSession.LocalGamers[0];

            //是否有數據可讀取
            while (localGamer.IsDataAvailable)
            {
                //接收數據
                NetworkGamer sender;
                localGamer.ReceiveData(packetReader, out sender);

                //忽略到自己發送的數據
                if (!sender.IsLocal)
                {
                    //讀取數據到packetReader中
                    MessageType messageType = (int)packetReader.ReadInt32();
                }
            foreach (NetworkGamer gamer in networkSession.AllGamers)
            {
                if (!gamer.IsLocal)
                {
             //獲取綁定到tag中的實體
            entity _e= ((entity)gamer.Tag);

            //讀取packetReader中的數據
            Vector2 Pos = packetReader.ReadVector2();
                }

            //add some game logic here
            }
            }
        }
復制代碼

在接收到數據之后就可以在Update方法中寫游戲邏輯,最后Draw方法也很簡單。

復制代碼
            // 循環所有游戲玩家
            foreach (NetworkGamer gamer in networkSession.AllGamers)
            {
                //調用entity中的draw方法
                entity sprite = ((entity)gamer.Tag);
                sprite.Draw(gameTime, spriteBatch);
            }
復制代碼

代碼都很簡單,一看就懂,感興趣的朋友可以自己去找些資料來看。





 


作者: dgwutao
出處: http://www.cnblogs.com/ghostwutao/

關于作者:
從事微軟平臺解決方案的設計與實現。主要專注于Windows Phone應用開發。
新浪微博: @A-xel
E-mail:dgwutao#gmail.com

本文版權歸作者所有,歡迎轉載,且在文章頁面明顯位置給出原文連接。

 

2014-07-10 10:57

歡迎訂閱我們的微信公眾賬號!
春秋茶館訂閱號
微信號 season-tea(春秋茶館)
每天分享一篇科技/遊戲/人文類的資訊,點綴生活,啟迪思想,探討古典韻味。
  清末民初歷史人物  民初人物
傳統官僚翰林總統
徐世昌(1855年10月24日-1939年6月5日),字卜五,號菊人,又號水竹邨人、弢齋。祖籍浙江寧波鄞縣。清末民初,曾為北洋政府官僚。1918年,徐世昌獲段祺瑞控制的安....
學貫中西品讀東西文化
林語堂(1895年10月10日-1976年3月26日),中國文學家、發明家。福建省龍溪(現為漳州市平和縣)坂仔鎮人,乳名和樂,名玉堂,後改為語堂。美國哈佛大學比較文學碩士....
資助民初精神網
        回頂部     寫評論

 
評論集
暫無評論!
發表評論歡迎你的評論
昵稱:     登陸  註冊
主頁:  
郵箱:  (僅管理員可見)

驗證:   验证码(不區分大小寫)  
© 2011   民初思韻網-清末民初傳奇時代的發現與復興   版權所有   加入收藏    設為首頁    聯繫我們    1616導航