上節留下的問題:
不過由此優化產生的另一個問題:全局只有一個實例,在來回的切換房間或進出時,需要重置狀態,我們這節來解決這個問題。
在上節的,我留下了幾行這樣的註釋代碼:
// roomObj.Reset();
// indexObj.Reset();
本節就順路把這三個註冊的方法給實現了:
1:loginObje.Reset()方法的實現,進入Login.xaml.cs中:
{
btnLogin.IsEnabled = true ;
}
就一行,把不可用的按鈕重置爲可用。
2:roomObj.Reset()方法的實現,進入Room.xaml.cs中:
{
game.Reset();
App.client.GetRoomListAsync();
}
代碼很簡潔,第一行,把遊戲房間的狀態重置爲初始狀態,然後重新獲取房間的狀態。
代碼分解:game.Reset()方法,我們進入到Game.cs中添加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();
{
chess.Reset();//這個已經實現了的。
}
因此內部就調用象棋類的重置,分解爲:
B:房間在線用戶的重置:onlineUserControl.Reset();
{
App.client.GetPlayerListAsync(App.player.RoomID);
}
重新獲取一次用戶即可。
C:棋譜的重置:chessManualControl.Reset();
{
timer.Stop();
moveStepIndex = 0;
tempIsCanMove = false;
App.chessManualPlaying = false;
App.stepList.Clear();
lbChessManual.Items.Clear();
}
D:在線聊天的重置: chatControl.Reset();
{
lbMsg.Items.Clear();
}
4:回去把那三行註釋掉的代碼給開啓了。
OK,一切就緒,最後運行看下效果,隨便點點,運行情況良好,截幾張圖:
a:登陸
b:進到房間中
c:接着退出系統
d:換個名稱重新登陸
e:重新登陸後進房間的界面
OK,本節就介紹到這裏了。