相關閱讀 |
>>> 技術話題—商業文明的嶄新時代 >>> | 簡體 傳統 |
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
稱謂:
内容: