Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)

在线演示地址:Silverlight+WCF 新手实例 象棋
在线演示

及早就上一样节省:Silverlight+WCF 新手实例 象棋
主界面-实时聊天区(二十五) 

 

立马节咱们贯彻上节从未有过兑现之交融的进出房间的信提示

要么那么张图: 

我们理解的解,我们每个区还是一个用户控件,我们的在线用户进出时,得到聊天区域显示信息,这便涉嫌到用户控件之间的消息传递了。

葡京在线开户 1

在线用户区说:反正我是没权直接去实时聊天区写东西,没道,找中介委托设置一下了。

本节实现返回大厅及剥离系统:

那么谁是中介也?委托谁吧?当然是衣食父母Index.xaml了,是她撑在一切家之。

同样:返回大厅,其实很粗略的游说,就是转发房间列表了。

好了,知道中介了,那我就算签只委托书了:

不过,转向前也生过多工作如果拍卖的:

返OnlineUser.xaml.cs里,签写全局的委托书[HelpSetSystemMsg]:

1:退出前要通服务器,说自要是剥离了,不然其它人观你在屋子里占着毛坑又非关。

葡京在线开户 2葡京在线开户 3

2:如果既以玩耍受,你还得先“认负”

 public partial class OnlineUser : UserControl
    {
        public delegate void HelpSetSystemMsg(string msg);
        public event HelpSetSystemMsg HelpSetSystemMsgEvent;
        public OnlineUser()
        {
           //..省略。。。
        }

3:没其他事了,直接就回去大厅了。

        void client_NotifyUserUpdateReceived(object sender, GameService.NotifyUserUpdateReceivedEventArgs e)
        {
           //..省略。。。
        }

仲:退出系统,和归大厅同样,只是最后结果的转发不一致,只是转化登陆界面。

        void client_GetPlayerListCompleted(object sender, GameService.GetPlayerListCompletedEventArgs e)
        {
           //..省略。。。
        }
    }

 

 

此地虽发出第一个问题了,怎么懂得好是在戏耍状态???不可知经过说自家是坐在红黑的岗位上虽是娱状态了吧?

OK,委托书有矣,我只有管调整了,其它业务为Index.xaml中介帮我搞定。

咱俩发出打闹“同意”和接“同意”事件,在那可领略是否上游玩。

当起用户进出的时候,此时见面接收信,然后托人家帮忙自己设置一下信息:

俺们也发生娱乐“结束”通知,在那可吗知晓打是否结束。

葡京在线开户 4葡京在线开户 5

因此,我们用加一个标识,来标识当前是否在玩耍被,在啊增加为?其实也,原来我是当全局里加之,不过此当在Chess象棋类里搭好点。

void client_NotifyUserUpdateReceived(object sender, GameService.NotifyUserUpdateReceivedEventArgs e)
        {
            //…省小一积原有代码…
            HelpSetSystemMsgEvent(“系统信息:”+e.player.NickName + (e.isEnter?” 进入”:”退出”)+”房间”);
        }

增加一个性质,没什么难度了:

 

葡京在线开户 6葡京在线开户 7

吓了,我立边不管了,反正自己以委托书上之惩处,其它你们搞定了。

 /// <summary>
    /// 象棋 by 路过秋天
    /// http://cyq1162.cnblogs.com
    /// </summary>
    public class Chess
    {
        /// <summary>
        /// 是否打开始了
        /// </summary>
        public bool IsGaming
        {
            get;
            set;
        }
        //…下面省略N行代码…
    }

继之衣食父母这边也[Index.xmal.cs]

 

完了每户的委托,自然而干活了,以前从未人寻找我工作,孩子还无了,现在有人索了,孩子中而报道,得提升一个高度管理才行:

继而我们只要于“同意”和吸纳“同意”标识一下者特性了:

乃,构造函数里之实例化,全先调到全局定义了:

葡京在线开户 8葡京在线开户 9

葡京在线开户 10葡京在线开户 11

void client_NotifyStartGameReceived(object sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
            //收到信息了相应咋办
            switch (e.player.AttachInfo)
            {
                case “0”://通知可以初步玩
                   //…省略N行…
                case “1”://请求开始玩
                 //…省略N行…
                  if (result == MessageBoxResult.OK)//同意开始玩
                  {
                      btnGameDeuce.IsEnabled = true;
                      btnGameLose.IsEnabled = true;
                      App.chess.IsGaming = true;//新加的
                  }
                    break;
                case “10”:
                    MessageBox.Show(“对方不肯开打”, “游戏通知”, MessageBoxButton.OK);
                    break;
                case “11”:
                    MessageBox.Show(“对方同意开始玩,请开始下棋”, “游戏通知”, MessageBoxButton.OK);
                    //…省略N行…
                    App.chess.IsGaming = true;//新加的
                    break;
            }
        }

 public partial class Index : UserControl
    {
        Chess chessControl;
        OnlineUser onlineUserControl;
        Chat chatControl;
        public Index()
        {
            InitializeComponent();
            chessControl=new Chess();//实例化控件
            chessBoard.Child = chessControl;//加载控件
            onlineUserControl = new OnlineUser();//今天新加之在线用户
            onlineUserBoard.Child = onlineUserControl;
            chatControl = new Chat();//也是今天新加之—看这里关押这里两行
            chatBoard.Child = chatControl;
        }
    }

 

 

还有游戏“结束”通知那里也?我们事先不标识回来了,下节我们处理打结束,重置所有状态时,再同台并拍卖。

 

OK,现在,我们得了解好是未是方打状态中了,双击“返回大厅”按钮,和“退出系统”,代码如下:

好了,得帮助孩子做点事件了:

葡京在线开户 12葡京在线开户 13

葡京在线开户 14葡京在线开户 15

//返回大厅
        private void btnBackRoom_Click(object sender, RoutedEventArgs e)
        {
            if (App.chess.IsGaming)
            {
                btnGameLose_Click(null, null);//发送认输
                App.chess.IsGaming = false;
            }
            App.client.OutRoomAsync(App.player, App.player.RoomID, App.player.AttachInfo);
            ((App)Application.Current).RedirectTo(new Room());
        }
        //退出系统
        private void btnLogout_Click(object sender, RoutedEventArgs e)
        {
            if (App.chess.IsGaming)
            {
                btnGameLose_Click(null, null);//发送认输
                App.chess.IsGaming = false;
            }
            App.client.OutRoomAsync(App.player, App.player.RoomID, App.player.AttachInfo);
            ((App)Application.Current).RedirectTo(new Login());
        }

public partial class Index : UserControl
    {
        //..省小三行…       
        public Index()
        {
           //..省略N行…

 

            //下面为委托事件
            onlineUserControl.HelpSetSystemMsgEvent += new OnlineUser.HelpSetSystemMsg(onlineUserControl_HelpSetSystemMsgEvent);
        }

代码都一模一样,只有最终一推行并未转,既然发生如此多一道的代码(4行)咋不抽出来做到一个函数里去,这个,我们留下到优化的时重新处理吧。

        void onlineUserControl_HelpSetSystemMsgEvent(string msg)
        {
            chatControl.AddMsg(msg);
        }
    }

以耍状态下我们这边匆匆认负,快速修改游戏标志IsGaming,然后就退了。

 

 

看,两实施代码来写,在onlineUser的委托中,调用了chat的AddMsg[本身起先见之明,所以手痒定义了是主意]

到这时候,我们虽完了了风波里的几乎单按钮事件了,只是还有少数“游戏结束,状态的重置,还从未处理呢”,这个要看下节。

吓了,到此,Index.xaml的从也做得了了

好了,该F5了,每次写了,我还使自己先调试通过,才放上来的,大伙对代码的完整性可以放心的。

至于ChatControl,上节不知觉的实现了AddMsg方法,刚好对口可以为调用,省事去另外写方法。

调试:

OK,少不了F5周转看效果:

跻身房间-》返回大厅-》再入:异常了:

葡京在线开户 16

服务器不提供有意义之过来;这恐怕是由协定不兼容、会话过早关闭或者内部服务器错误引起的。

在押,消息提示了,OK,本小节就是顶之矣,关于控件消息传递,以后章节会经常下,大伙看仔细点。

 遇到这题目怎么调试呢?

 把后台WCF开启服务,看前台的命传到后台从未:

断点,进去了,WCF端,在如下产生错误:截图如下:

葡京在线开户 17

那个Player.RoomID值为0

咱俩连没以roomList记录房间为0的笔录,所以就算报是摩擦了,这里我们当好加上判断了,添加if判断一下每当未以,再重改房间人数。

可是此,我们直接注释掉好了,这属性暂时为并未什么用,[大伙儿要一直加if判断了]。

葡京在线开户 18葡京在线开户 19

public static void ChangeRoom(Player player, int roomID)
        {
            RemovePlayer(player);
            AddPlayer(player, roomID);
            //roomList[player.RoomID].Count = playerList[player.RoomID].Count;
            //roomList[roomID].Count = playerList[roomID].Count;
        }

 

OK,找到问题了,继续F5周转,重复入房间,再另行登陆退出房间,终于正常了!

对了,还有对战中退出房间没有测试,经测试,正常,所以,上图一律张:

葡京在线开户 20

我们以回到大厅及离系统时常,按理如果对方是于游玩状态,应该提拔一下底,我们这里没提醒,

因此一点按钮,就自动认输退出,这个有些细节,大伙自觉加上了。

哼了,本节点交了了。