上节留下的问题:

在上一节:Silverlight+WCF 网络象棋 终极篇 解决重复的消息提示(八) 中,我们解决了重复登陆时产生的多次消息的重复提示。

不过由此优化产生的另一个问题:全局只有一个实例,在来回的切换房间或进出时,需要重置状态,我们这节来解决这个问题。

 

在上节的,我留下了几行这样的注释代码:

//loginObj.Reset();
//roomObj.Reset();
//indexObj.Reset();

 

本节就顺路把这三个注册的方法给实现了:

1:loginObje.Reset()方法的实现,进入Login.xaml.cs中:

        public void Reset()
        {
            btnLogin.IsEnabled 
= true;
        }

就一行,把不可用的按钮重置为可用。

2:roomObj.Reset()方法的实现,进入Room.xaml.cs中:

        public void Reset()
        {
            game.Reset();
            App.client.GetRoomListAsync();
        }

代码很简洁,第一行,把游戏房间的状态重置为初始状态,然后重新获取房间的状态。

代码分解:game.Reset()方法,我们进入到Game.cs中添加Reset方法实现如下:

        public void Reset()
        {
            
if (GameRoomList == null)
            {
                CreateGameRoom(
20);
            }
            
foreach (GameRoom item in GameRoomList)
            {
                
if (item.BlackPlayer != null || item.RedPlayer != null)
                {
                    item.BlackPlayer 
= null;
                    item.RedPlayer 
= null;
                    item.IsGaming 
= false;
                    item.ReDraw();
                }
            }
        }

把每一个房间重新重置为初始状态了。

3:indexObj.Reset()方法的实现,进入Index.xaml.cs中:

        public void Reset()
        {
            chessControl.Reset();
            onlineUserControl.Reset();
            chessManualControl.Reset();
            eventButtonControl.Reset();
            chatControl.Reset();
        }

这里代码是比较简单,不过接下来要做的事就多了,每个控件都要去实现一下,当体力活了。

下面为每一个控件实现状态重置方法:

A:棋盘及棋子的重置:chessControl.Reset();

        public void Reset()
        {
            chess.Reset();//这个已经实现了的。
        }

因此内部就调用象棋类的重置,分解为:

B:房间在线用户的重置:onlineUserControl.Reset();

        public void Reset()
        {
            App.client.GetPlayerListAsync(App.player.RoomID);
        }

重新获取一次用户即可。

C:棋谱的重置:chessManualControl.Reset();

        public void Reset()
        {
            timer.Stop();
            moveStepIndex = 0;
            tempIsCanMove = false;
            App.chessManualPlaying = false;
            App.stepList.Clear();
            lbChessManual.Items.Clear();
        }

D:在线聊天的重置: chatControl.Reset();

       public void Reset()
        {
            lbMsg.Items.Clear();
        }

4:回去把那三行注释掉的代码给开启了。

OK,一切就绪,最后运行看下效果,随便点点,运行情况良好,截几张图:

a:登陆

b:进到房间中

c:接着退出系统

d:换个名称重新登陆

e:重新登陆后进房间的界面

OK,本节就介绍到这里了。

 

Silverlight+WCF 实战-网络象棋文章系列教程由路过秋天创作,并发布的一系列原创文章,目前仅发表于博客园及秋色园,其它网站若有相同文章,纯属转载,欢迎大伙认准商标牌子。
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"