利用WCF的callback机制开发一个简单的多人游戏模型
生活随笔
收集整理的這篇文章主要介紹了
利用WCF的callback机制开发一个简单的多人游戏模型
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文介紹了如何利用WCF和callback機(jī)制開(kāi)發(fā)一個(gè)簡(jiǎn)單的多人在線游戲模型。
運(yùn)行過(guò)程如下:
當(dāng)game service 啟動(dòng)之后,若干個(gè)客戶端便會(huì)自動(dòng)連接到服務(wù)器。當(dāng)某個(gè)客戶端點(diǎn)擊join game時(shí),所有客戶端同時(shí)更新。
運(yùn)行screenshot如下圖所示:
WCF service screenshot
client1 screenshot:
client2 screenshot:
WCF service主要代碼如下:
using?System;using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.ServiceModel;
namespace?GameService
{
????public?class?PlayerEventAgrs?:?EventArgs
????{
???????public?Player?player;
???????public?GameDesk?desk;
????}
????[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
????class?GameService:IGameService
????{
????????static?List<Player>?Players=new?List<Player>();
????????public?delegate?void?PlayerEventHandler(object?sender,?PlayerEventAgrs?e);
????????public?static?event?PlayerEventHandler?OnJoinGame;
????????public?static?event?PlayerEventHandler?OnStartGame;
????????public?IPlayerCallBack?callback;
???????
????????public?GameService()
????????{
????????????callback?=?System.ServiceModel.OperationContext.Current.GetCallbackChannel<IPlayerCallBack>();
????????????OnJoinGame?+=?new?PlayerEventHandler(GameService_OnJoinGame);
????????????OnStartGame?+=?new?PlayerEventHandler(GameService_OnStartGame);
??????????????
????????}
????????public?List<Player>?GetPlayerList()
????????{
????????????System.Threading.Thread.Sleep(4000);
????????????return?Players;
????????}
????????void?GameService_OnJoinGame(object?sender,?PlayerEventAgrs?e)
????????{
????????????Console.WriteLine("{0}?is?joining?the?game?on?desk?NO?{1}",?e.player.PlayerName,?e.desk.DeskNo);
????????????callback.OnJoin(e.player,e.desk);
????????}
????????void?GameService_OnStartGame(object?sender,?PlayerEventAgrs?e)
????????{
????????????callback.OnStart(e.player);
????????}
??????
????????public?void?BroadGameEvent(PlayerEventAgrs?e,?PlayerEventHandler?temp)
????????{
????????????if?(OnJoinGame?!=?null)
????????????{
????????????????foreach?(PlayerEventHandler?handler?in?temp.GetInvocationList())
????????????????{
????????????????????handler.BeginInvoke(this,?e,?null,?null);
????????????????}
????????????}
????????}
??????????????
????????public?void?JoinToGame(Player?player,GameDesk?desk)
????????{
????????????Players.Add(player);????
????????????PlayerEventAgrs?e?=?new?PlayerEventAgrs();
????????????e.player?=?player;
????????????e.player.PositionNO?=?desk;
????????????e.desk?=?desk;
????????????BroadGameEvent(e,?OnJoinGame);
????????}
????????public?void?StartGame(Player?player)
????????{
????????????PlayerEventAgrs?e?=?new?PlayerEventAgrs();
????????????e.player?=?player;
????????????BroadGameEvent(e,?OnStartGame);
????????}
??????
????}
}
callback interface如下:
using?System;using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.ServiceModel;
using?System.Runtime.Serialization;
namespace?GameService
{
????[ServiceContract]
????public?interface?IPlayerCallBack
????{
????????[OperationContract(IsOneWay?=?true)]
????????void?OnJoin(Player?player,GameDesk?gamedesk);
????
????????[OperationContract(IsOneWay?=?true)]
????????void?OnStart(Player?player);
????}
}
客戶端callback implementation如下:
?#region?CallBack?Implementation????????public?void?OnJoin(GameService.Player?player,?GameService.GameDesk?desk)
????????{???????????
????????????int?deskNo?=?desk.DeskNo;
????????????StringBuilder?show?=?new?StringBuilder();;
????????????show.AppendFormat("Player?Information\n");
????????????show.AppendFormat("Player?Name:{0}\n",?player.PlayerName);
????????????show.AppendFormat("Player?Status:?{0}\n",player.Action);
????????????show.AppendFormat("Player?Role:?{0}\n",?player.Role);
????????????img_Desktop.Image?=?new?System.Drawing.Bitmap(System.Drawing.Image.FromFile(@"image\active-desktop.bmp"));???????????????????
????????????switch?(deskNo)
????????????{
????????????????case?1:???????????????????
????????????????????lb_PlayerInfo1.Text?=?show.ToString();
????????????????????lb_PlayerInfo1.Refresh();
????????????????????pic_Player1.Image=new?System.Drawing.Bitmap(System.Drawing.Image.FromFile(@"image\acvite-icon.bmp"));???????????????????
????????????????????break;
????????????????case?2:
????????????????????lb_PlayerInfo2.Text?=?show.ToString();??????????????????
????????????????????pic_Player2.Image?=?new?System.Drawing.Bitmap(System.Drawing.Image.FromFile(@"image\acvite-icon.bmp"));
????????????????????break;
????????????????case?3:
????????????????????lb_PlayerInfo3.Text?=?show.ToString();???????????????????
????????????????????pic_Player3.Image?=?new?System.Drawing.Bitmap(System.Drawing.Image.FromFile(@"image\acvite-icon.bmp"));
????????????????????break;
????????????????
????????????}?????
????
????????}
????????public?void?OnStart(GameService.Player?player)
????????{
????????}
????????#endregion
有關(guān)本文完整源代碼,請(qǐng)點(diǎn)擊此處下載
?
轉(zhuǎn)載于:https://www.cnblogs.com/Winston/archive/2008/11/02/1324885.html
總結(jié)
以上是生活随笔為你收集整理的利用WCF的callback机制开发一个简单的多人游戏模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

- 上一篇: 关于 Visual Studio 201
- 下一篇: 无法打开CHM文件