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