首页 > 代码库 > 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式

面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式

上一篇这里描述了一个关于差异数据在开发过程中的一个优点,这里来演示另外一个特点:单机开发之无缝切换到C/S模式

一般C/S模式都面临一个问题:

就是开发过程中的调试难题,因为涉及到客户端和服务端相关方法,如果由某个人来编写那么也是一个简单的事情.

如果由2个人编写,会带来一些平台上的区别以及编码的区别.

简单的说,如果我们在开发时完全的避开C/S,然后经由某个机制,可以直接让模块跑到服务器上,那么这将让你的开发速度上升好几个倍率.

没有协议,没有交互,没有网络,那么从头写到尾,也是一件比较简单的事情了,无需专门的服务端主程了(貌似哥们要失业了....><...).

首先来说一下,结合差异化网络数据交互方式的开发模式,比较绕口.

从模式上说,传统的MVC模式比较类似.

1.Model层,定义并描述了整个场景,细化到每一个数据对象,HP,MP之类

2.View(UI)层,

2.1把对应的数据绑定到UI上某个显示元素,当这个数据修改的时候,刷新UI上的数据. 

2.2当用户激活某个控件,发出一条命令,并且当命令响应后,执行对应的回调方法

3.Control层, 对应应用层的逻辑,比如修改了某个数值


这就是本地单机开发的模式,然后就是本文的重点了,如何把单机模式切换到C/S模式.

参考之前的文章,假设了2个Model之间的同步问题,

那么把M/C 2层拷贝到服务端,然后通过同步协议同步本地的Model和远程的Model,就切换成功了.

来看下远程流程:

UI->本地Model->发出命令,等待回调->发送到远程->远程执行命令->修改远程Model->获得返回值和差异数据->

->本地Model 通过返回值和差异数据 同步->激活UI修改事件,修改绑定UI元素->执行回调

单机开发流程:

UI->本地Model->发出命令,等待回调->执行命令->修改Model->激活UI修改事件,修改绑定UI元素->执行回调

仅仅在执行之前和回调进行一层简单的桥接,那么即可切换到C/S模式.

这边贴上一个示例,关于代理层和实际控制层的区别

    public class Model : System.ComponentModel.INotifyPropertyChanged
    {
        private string _name = null;

        private int _count = 0;

        public string Name
        {
            get { return _name; }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    OnPropertyChanged("Name");
                }
            }
        }

        public int Count
        {
            get { return _count; }
            set
            {
                if (_count != value)
                {
                    _count = value;
                    OnPropertyChanged("Count");
                }
            }
        }



        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
    }

    /// <summary>
    /// 实际控制类
    /// </summary>
    public class ModelControl : Model
    {

        public virtual void ChangeName(string name, Action callback)
        {
            this.Name = name;

            if (callback != null)
            {
                callback();
            }
        }


        public virtual void ChangeCount(int count, Action callback)
        {
            this.Count = count;

            if (callback != null)
            {
                callback();
            }
        }
    }

    /// <summary>
    /// 代理类
    /// </summary>
    public class RemoteModelControl : Model
    {
       
        public  void ChangeCount(int count, Action callback)
        {
            RemoteCall.BuildRequest(callback, "ChangeCount", count,null);
        }

        public  void ChangeName(string name, Action callback)
        {
            RemoteCall.BuildRequest(callback, "ChangeName", name, null);
        }
    }


面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式