• Silverlight+WCF 实战网络象棋最终篇之房间装修WCF端(二)


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

    上一系列四十篇索引:Silverlight+WCF 新手实例 象棋 专题索引

    佛靠金装,人要衣裳,房间也要加金砖。本篇我们来把房间装修下,让它看起来专业一点!

    一:效果预览,先上图

     

    这是之前的房间图片:

    今天我们要装修成的房间图片:

    再上一张游戏中的效果图:

    二:实现说明

     

    1:新增加图片

    为了实现装修,我这里新增加了3张图片:
    1:房间图片
    2:房间游戏中状态的图片
    3:QQ用户头像
    图片是从QQ象棋游戏的安装程序中Copy过来的,由于Silverlight只支持png等个别种类图片,所以用ps把图片另存为png格式了。

    这是图片的存放文件夹格式:

    2:装修房间需要增加的元素

    增加的元素有:

    1:用户头像[字段][显示QQ头像在房间坐位上]
    2:房间游戏状态[字段][显示切换房间背景图]
    3:房间坐位的用户[字段][QQ头像上下位置要显示用户名]
    为了这些增加的元素,需要改动的代码,那还真不少,大伙要积极点了。

    三:代码实现[WCF端]

    1:WCF端代码:实体修改

    WCF端:Player玩家实体

        /// <summary>
        
    /// 游戏玩家 by 路过秋天
        
    /// </summary>
        [DataContract]
        
    public class Player
        {

            
    //...省略以前N个实体...
            [DataMember]
            
    public string Head
            {
                
    get;
                
    set;
            }     
        }

    WCF端:Room房间实体

        [DataContract]
        
    public class Room
        {
            
    /// ...省略了N行代码...
            ///// <summary>
            
    ///// 红色座位是否有人
            
    ///// </summary>
            //[DataMember]
            
    //public bool RedInChair
            
    //{
            
    //    get;
            
    //    set;
            
    //}
            ///// <summary>
            
    ///// 黑色座位是否有人
            
    ///// </summary>
            //[DataMember]
            
    //public bool BlackInChair
            
    //{
            
    //    get;
            
    //    set;
            
    //}
            #region 装饰房间增加的字段
            [DataMember]
            
    public Player RedPlayer
            {
                
    get;
                
    set;
            }
            [DataMember]
            
    public Player BlackPlayer
            {
                
    get;
                
    set;
            }
            [DataMember]
            
    public bool IsGaming
            {
                
    get;
                
    set;
            }
            
    #endregion
        }

    说明:

    房间增加了两个玩家,和一个游戏状态,以前的坐位是否有人字段[RedInChair/BlackInChair],删了[于是引发了N行要修改的代码]。

    OK,字段是简单改完了,编绎一下,发现近N个的报错了吧,只能一个一个修改了。

    2:WCF端:Service.cs代码修改[被注释的是原来的代码,未注释的是修改的代码]

    方法:EnterRoom

               //if (!room.RedInChair)//房间的红色座位有没有人
                
    //{
                
    //    room.RedInChair = player.ColorValue == 1;
                
    //}
                
    //if (!room.BlackInChair)//房间的黑色座位有没有人
                
    //{
                
    //    room.BlackInChair = player.ColorValue == 2;
                
    //}
                if (room.RedPlayer == null && player.ColorValue == 1)
                {
                    room.RedPlayer 
    = player;
                }
                
    else if (room.BlackPlayer == null && player.ColorValue == 2)
                {
                    room.BlackPlayer 
    = player;
                }

    方法:OutRoom

                   if (player.ColorValue == 1)//如果退出玩家是红色座位
                    {
                        
    //room.RedInChair = false;
                        room.RedPlayer = null;
                    }
                    
    if (player.ColorValue == 2)//如果退出玩家是红色黑色座位
                    {
                        
    //room.BlackInChair = false;
                        room.BlackPlayer = null;
                    }

    方法:StartGame [只增加了代码]

            public void StartGame(Player player)
            {
                Notify.Game(player, GameType.Start);
                
    //以下几行为新增代码
                if (player.AttachInfo == "11")//同意开始游戏,开始线程扫描
                {
                    roomList[player.RoomID].IsGaming 
    = true;//房间设置正在游戏中
                    Notify.Room(roomList[player.RoomID]);//通知大伙更新房间状态
                }
            }

    方法:EndGame [只增加了代码]

            public void EndGame(Player player)
            {
                Notify.Game(player, GameType.End);
                
    //以下几行为新增加的代码
                if (player.AttachInfo == "0" || player.AttachInfo == "1" || player.AttachInfo == "2")
                {
                    
    //游戏结束,清除历史数据
                    roomList[player.RoomID].StepList.Clear();
                    roomList[player.RoomID].IsGaming 
    = false;
                    Notify.Room(roomList[player.RoomID]);
    //通知房间改变成游戏状态;
                }
            }

    说明:

    OK,WCF端就修改到这就完成了,接下来是Silverlight客户端,要调整的代码N多。
    服务端编绎过去后,客户端注意更新服务引用,接着由于服务端实体的两字段被删除,必然会引发个别小错误了。

    结言:

    对于Silverlight客户端,要调整的代码那是相当的多,所以等下节实现,不然一篇下来太长了。

    欢迎有兴趣者对本系列持续关注!
    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    进程间多线程同步三种方法
    C++ 生成随机数 srand()和rand()
    事件对象用于多线程之间的同步
    $.ajax()方法参数详解
    面向对象的属性
    对多选框进行操作,输出选中的多选框的个数
    jQuery如何检查某个元素在网页上是否存在
    关于$.fn
    c#基础班笔记
    Sublime Text 3的快捷键
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1849840.html
Copyright © 2020-2023  润新知