Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
在線演示地址:Silverlight+WCF 新手實例 象棋 在線演示
?
還是那張圖:?
本節實現返回大廳和退出系統:
一:返回大廳,其實很簡單的說,就是轉向房間列表了。
可是,轉向前也有很多事情要處理的:
1:退出前要通知服務器,說我要退出了,不然其它人看到你在房間里占著毛坑又不拉。
2:如果已經在游戲中,你還得先“認輸”
3:沒其它事了,直接就返回大廳了。
二:退出系統,和返回大廳一樣,只是最后結果的轉向不一樣,只是轉向登陸界面。
?
這里就產生第一個問題了,怎么知道自己是在游戲狀態???不能通過說我是坐在紅黑的位置上就是游戲狀態了吧?
我們有游戲“同意”和接收“同意”事件,在那可以知道是否進入游戲。
我們也有游戲“結束”通知,在那可以也知道游戲是否結束。
所以,我們需要增加一個標識,來標識當前是否在游戲中,在哪增加呢?其實呢,原來我是在全局里加的,不過這里認為在Chess象棋類里增加好點。
增加一個屬性,沒什么難度了:
?///?<summary>????///?象棋?by?路過秋天
????///?http://cyq1162.cnblogs.com
????///?</summary>
????public?class?Chess
????{
????????///?<summary>
????????///?是否游戲開始了
????????///?</summary>
????????public?bool?IsGaming
????????{
????????????get;
????????????set;
????????}
????????//...下面省略N行代碼...
????}
?
接著我們要在“同意”和接收“同意”標識一下這個屬性了:
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;
????????????}
????????}
?
還有游戲“結束”通知那里呢?我們先不標識回來了,下節我們處理游戲結束,重置所有狀態時,再一起并處理。
OK,現在,我們可以知道自己是不是正在游戲狀態中了,雙擊“返回大廳”按鈕,和“退出系統”,代碼如下:
//返回大廳????????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());
????????}
?
代碼都一樣,只有最后一行沒變化,既然有這么多共同的代碼(4行)咋不抽出來弄到一個函數里去,這個,我們留到優化的時候再處理吧。
在游戲狀態下我們這里匆匆認輸,快速修改游戲標志IsGaming,然后就退出了。
?
到此時,我們就完成了事件里的幾個按鈕事件了,只是還有一點“游戲結束,狀態的重置,還沒處理呢”,這個請看下節。
好了,該F5了,每次寫完,我都要自己先調試通過,才放上來的,大伙對代碼的完整性可以放心的。
調試:
進入房間-》返回大廳-》再進入:異常了:
服務器未提供有意義的回復;這可能是由協定不匹配、會話過早關閉或內部服務器錯誤引起的。
?遇到這問題怎么調試呢?
?把后臺WCF開啟服務,看前臺的命令傳到后臺沒有:
斷點,進去了,WCF端,在如下產生錯誤:截圖如下:
那個Player.RoomID值為0
我們并沒有在roomList記錄房間為0的記錄,所以就報這個錯了,這里我們當然可以添加判斷了,添加if判斷一下在不在,再更改房間人數。
不過這里,我們直接注釋掉好了,這屬性暫時也沒什么用,[大伙還是直接加if判斷了]。
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運行,重復進入房間,再重復登陸退出房間,終于正常了!
對了,還有對戰中退出房間沒測試,經測試,正常,所以,上圖一張:
我們在返回大廳和退出系統時,按理如果對手是在游戲狀態,應該提示一下的,我們這里沒提示,
所以一點按鈕,就自動認輸退出,這個小細節,大伙自覺加上了。
好了,本節點到為止了。
?
版權聲明:本文原創發表于博客園,作者為路過秋天,原文鏈接:
http://www.cnblogs.com/cyq1162/archive/2010/08/04/1791843.html
總結
以上是生活随笔為你收集整理的Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lucene创建索引
- 下一篇: Linux基本命令之文件查找、检索