Silverlight+WCF 新手实例 象棋 回归WCF通讯应用-进入房间(十九)

前四节,我们讲了通讯基础,从这节起,我们回归到项目中来,要将前面的WCF通讯知识应用进来。

上一节我们讲到登陆时通过WCF,把用户信息传递到远程服务器,并用一个全局泛型字典变量来保存用户列表。

之前的项目大伙没丢把,重新发下载地址:之前第3阶段代码:点此下载

登陆后我们转向了房间页面。这节,我们要通过点击房间上的座位进入主页面(Index.xaml)。

 

既然要点击房间座位才能进入,我们就得为那房间的座位添加鼠标点击事件了。

我们为Chess项目的解决方案里,再添加WCF应用服务程序

我们回到GameRoom.cs找到创建房间的代码,找到Draw函数里,创建红蓝黑三个房间座位的代码,其实就是那三个矩形框Rectangle。

由于Silverlight+WCF 新手实例 象棋
WCF通讯跨域(十五)已截图,所以这里不截图了。

我们在它们被添加到房间之前,添加几个事件:

步骤:

 

1。对着解决方案-》右键-》添加新建项目-》选择WCF应用服务程序-》输入:GameService

betway体育官网 1betway体育官网 2

2。删除默认的IService1.cs和IService1.svc

 //添加三个房间点击事件
            redChair.MouseLeftButtonDown += new MouseButtonEventHandler(redChair_MouseLeftButtonDown);
            spectatorChair.MouseLeftButtonDown += new MouseButtonEventHandler(spectatorChair_MouseLeftButtonDown);
            blackChair.MouseLeftButtonDown += new MouseButtonEventHandler(blackChair_MouseLeftButtonDown);
            //下面就是添加房间了,之前就有的代码
            room.Children.Add(redChair);
            room.Children.Add(blackChair);
            room.Children.Add(spectatorChair);
            room.Children.Add(text);
            container.Children.Add(room);

3。新建WCF服务,起名为IService

 

4。把跨域文件clientaccesspolicy.xml复制到项目中去.

三个房间座位产生的事件函数:

5。设置GameService项目属性的特定启动端口为:8686

betway体育官网 3betway体育官网 4

6。添加引用PollingDuplex.dll

void blackChair_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //待实现
        }
        void spectatorChair_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //待实现
        }
        void redChair_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //待实现
        }

7。修改配置文件,参考十五小节

 

上面步骤完成了后

OK,在点击的时候,我们都要产生同一个动作,就是“进入”房间了。简单逻辑思维告诉我们要添加一个公共的”Enter”方法

我们接下来要添加几个新文件:

void Enter(int colorValue)
{
 //待实现
}

1.新添加一个回调接口:ICallBack

 

对着GameService项目右键-》添加-》新建项->选择接口->输入:ICallBack.cs

有了Enter方法,我们可以写鼠标点击事件了:

2.添加文件夹,用于存放通讯实体[契约数据]

黑色位置点击:判断黑色房间是否有人,没人的话就设置一下有人,并改变一下房间背景色,然后调用Enter进入。

对着GameService项目右键-》添加-》新建文件夹-》输入:DataContract

重提一下颜色值是:[1红2黑3蓝]

3.在通讯实体文件夹下,我们添加一个玩家Player实体用于通讯传递。

betway体育官网 5betway体育官网 6

对着DataContract文件夹右键-》添加-》类-》输入:Player.cs

void blackChair_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (!BlackPlayerInChair)
            {
                BlackPlayerInChair = true;
                blackChair.Fill = new RadialGradientBrush(Colors.Blue , Colors.White);
                    //new SolidColorBrush(Colors.Blue);
                Enter(2);
            }
            else
            {
                MessageBox.Show(“黑色玩家已有人!”);
            }
        }

目前的项目结构图如下:

 

betway体育官网 7

旁观者位置:一点进去了,当然了,如果以后要增加房间人数上限,还是要加判断的

我们去掉Player的名称空间[.DataContract],其实就是去掉文件夹的名称:

void spectatorChair_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Enter(3);
        }

using System.Runtime.Serialization;
namespace GameService
{
    /// <summary>
    /// 游戏玩家 by 路过秋天
    /// </summary>
    [DataContract]
    public class Player
    {
       
    }
}

 

 

红色位置:和黑色位置一样的判断方法

接着,我们为Player增加基本属性[以后随着应用会增加]:
ID:用户标识
NickName:昵称
CallBack:玩家的回调,我们把回调放到玩家里。

betway体育官网 8betway体育官网 9

RoomID:玩家所在房间,没有的话默认为0;
下面我们实现属性代码:

void redChair_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (!RedPlayerInChair)
            {
                RedPlayerInChair = true;
                redChair.Fill = new RadialGradientBrush(Colors.Blue, Colors.White);
                    //new SolidColorBrush(Colors.Blue);
                Enter(1);
            }
            else
            {
                MessageBox.Show(“红色玩家已有人!”);
            }
        }

 

 

betway体育官网 10betway体育官网 11

三个座位的点击事件都完成了,接下来要完成Enter方法了:

namespace GameService
{
    /// <summary>
    /// 游戏玩家 by 路过秋天
    /// </summary>
    [DataContract]
    public class Player
    {
        /// <summary>
        /// 玩家ID
        /// </summary>
        [DataMember]
        public Guid ID
        {
            get;
            set;
        }
betway体育官网,        /// <summary>
        /// 玩家昵称
        /// </summary>
        [DataMember]
        public string NickName
        {
            get;
            set;
        }
        /// <summary>
        /// 玩家的回调
        /// </summary>
        [DataMember]
        internal ICallBack CallBack
        {
            get;
            set;
        }

于由进入房间时,需要用WCF通讯告知服务端,所以要先转入WCF,添加服务端EnterRoom事件

       /// <summary>
       /// 玩家所在房间号
       /// </summary>
       [DataMember]
       public int RoomID
       {
           get;
           set;
       }
    }

回到GameService项目的IService.cs里,添加两个接口,进入房间和退出房间:

 

接口的参数都是一样的,一个玩家,和一个玩家要进入/退出的房间号。

用于传递的player完成了,现在我们写一下WCF通讯方法,我们为IService接口添加登陆和退出事件:

[OperationContract]
bool EnterRoom(Player player,int roomID);

betway体育官网 12betway体育官网 13

[OperationContract(IsOneWay = true)]
void OutRoom(Player player, int roomID);

namespace GameService
{
    [ServiceContract(CallbackContract = typeof(ICallBack))]//头顶上这里写明了回调是ICallBack
    public interface IService
    {
        [OperationContract(IsOneWay = true)]
        void Login(Player player);//登陆

 

        [OperationContract(IsOneWay = true)]
        void Logout(Player player);//退出
        
    }
}

接下来就是到到IService.svc.cs里实现接口了:

 

betway体育官网 14

就是说,客户端直接传递一个Player实体过来了,我们接着实现这个接口:

 

betway体育官网 15betway体育官网 16

接着,我们要定义一个全局变量,有来保存所有发生变化的房间列表:

namespace GameService
{
    public class Service : IService
    {
        /// <summary>
        /// 玩家集合
        /// </summary>
        static Dictionary<int, Dictionary<Guid, Player>> playerList = new Dictionary<int, Dictionary<Guid, Player>>();
        #region IService 成员
        public void Login(Player player)
        {
            //待实现
        }

什么叫发生变化?就是房间默认是没人坐上去,如果有人进入房间,房间状态就发生变化了,这时我们就要记录下来,同时,要更新到

        public void Logout(Player player)
        {
            //待实现
        }

所有在线玩家的房间里去。

        #endregion
    }
}

/// <summary>
/// 所有变化的房间列表
/// </summary>
private static Dictionary<int, Room> roomList = new Dictionary<int, Room>();

 

 

我这在里用了一个静态的全局变量,来保存所有的用户,简单解释一下这个双重的泛型字典集合

看到一个Room没有,既然要保存房间列表,所以我们得创建一个和Player一样的[契约数据]实体用于传递Room

Dictionary<int, Dictionary<Guid, Player>>
翻译一下就变成—-》Dictionary<房间号, 玩家列表>

我们对着文件夹DataContract右键->添加类->输入:Room.cs

看到翻译明白了吧,所有的玩家都被分到房间里去了。然后所有的房间的玩家才构成一个大集合。

为房间实体类添加几个属性:

 

ID:房间号

看明白了,现在来实现Login登陆了。

Count:房间人数

根据以前我们注册一样,先判断用户在不在,在就删除,然后再添加用户。

RedInChair:红色座位是否有人

betway体育官网 17betway体育官网 18

BlackInChair:黑色座位是否有人

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图