Windows Phone XNA創建簡單局域網游戲

人文精神  >>>  技術的天空 溫和的思緒

     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

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

 


dgwutao 2014-07-10 10:57:42

[新一篇] Windows Phone中In-App Purchase應用內購買

[舊一篇] IOS應用 開發 推廣 心得之:開發發布應用可避免的彎路
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表