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

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

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

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

    假设由2个人编写,会带来一些平台上的差别以及编码的差别.

    简单的说,假设我们在开发时全然的避开C/S,然后经由某个机制,能够直接让模块跑到server上,那么这将让你的开发速度上升好几个倍率.

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

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

    从模式上说,传统的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);
            }
        }
    


  • 相关阅读:
    IT痴汉的工作现状24-Just for fun
    &quot;duplicate symbol for architecture i386&quot; 解决的方法
    如何将visual studio 2010编辑模式改为插入???
    教学平台服务器安装环境说明
    Microsoft SQL Server 2008 基本安装说明
    WEB安全测试的类型
    IBM Rational Appscan使用之扫描结果分析
    IBM Rational AppScan使用详细说明
    Security Testing Basics
    ZAP介绍
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6724598.html
Copyright © 2011-2022 走看看