葡京在线开户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)
        {
            //…省略一堆原有代码…
            HelpSetSystemMsg伊芙nt(“系统新闻:”+e.player.尼克Name + (e.isEnter?” 进入”:”退出”)+”房间”);
        }

日增2本性能,没什么难度了:

 

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

好了,作者那边不管了,反正自己按委托书上的办,其余你们化解了。

 /// <summary>
    /// 象棋 by 路过夏天
    /// http://cyq1162.cnblogs.com
    /// </summary>
    public class Chess
    {
        /// <summary>
        /// 是或不是游戏开始了
        /// </summary>
        public bool IsGaming
        {
            get;
            set;
        }
        //…上边省略N行代码…
    }

接着衣食父母那边呢[Index.xmal.cs]

 

收了人家的信托,自然要工作了,在此之前没人找我工作,孩子都不管了,以后有人找了,孩子间要报导,得提高2个冲天管理才行:

随后我们要在“同意”和选取“同意”标识一下以此天性了:

于是乎,构造函数里的实例化,全先调到全局定义了:

葡京在线开户 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

笔者们在回到大厅和剥离系统时,按理要是敌手是在游戏景况,应该提示一下的,我们那边没提示,

于是一点按钮,就自动认输退出,那么些小细节,大伙自觉加上了。

好了,本节点到甘休了。