博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webgame设计之功能模块的代理模式
阅读量:6322 次
发布时间:2019-06-22

本文共 2973 字,大约阅读时间需要 9 分钟。

   原文地址:

    在游戏设计中,通常会将一些实现了具体功能的模块进行封装,达到重用的目的。这些功能模块包括:1、网络通信模块(实现连接,断开,消息发送、接收,错误等处理);2、资源加载管理模块(实现资源加载,缓存,进度通知,分类型加载、管理等)。

    设计实现这些功能模块的方法很多,设计过程中最好做到使这些模块在外部启动简单、使用方便、重用容易。

    我在设计中使用了代理模式的思想,就是将封装的功能留出一个代理类供外部继承实现。使用时候的具体步骤是:1、重写该代理类;2、实例化重写的代理类,并将该对象设置到管理器中;3、创建消息的逻辑处理类对象,并使用方法setDelegate设置映射;4、访问该代理类对象实现操作。

    注意地方有:重写的代理类最好是单例的,方便调用。步骤2是在游戏启动的时候完成。步骤3里消息的逻辑处理类可能是很多个,最好也是单例的,方便调用,该步骤最好在步骤2中代理类的构造函数里调用完成。

    现在来模拟设计一个网络通信模块,整个功能比较简单,定义了两个类(NetManager、NetProxy)和一个接口(INetDelegate),其中NetManager和NetProxy存在对象共享,必须在一个包内。

    INetDelegate接口的伪代码:

/** 定义网络数据处理逻辑接 */interface INetDelegatepublic function receive(data:ByteArray):void;

    NetManager类的伪代码:

/** 单例的,外部只能设置一次该类的只写属性netProxy */class NetManager/** 将socket封装,外部不可直接访问 */private var socket:Socket;/** 通过只设置一次实现系统初始化管理 */private var _netProxy:NetProxy;public function set netProxy(proxy:NetProxy):void{	if(_netProxy){		//报错处理,只能设置一次该代理	}else{		_netProxy = proxy;		//与同包的NetProxy共享该属性		_netProxy.socket = socket;	}}/** 在构造函数中创建好socket对象后调用 */private function configureListeners():void {	socket.addEventListener(Event.CLOSE, closeHandler);	socket.addEventListener(Event.CONNECT, connectHandler);	socket.addEventListener(IOErrorEvent.IO_ERROR,					ioErrorHandler);	socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,					securityErrorHandler);	socket.addEventListener(ProgressEvent.SOCKET_DATA,					socketDataHandler);}private function closeHandler(event:Event):void {	_netProxy.onClose();//移交处理权}private function connectHandler(event:Event):void {	_netProxy.onConnect();//移交处理权}private function ioErrorHandler(event:IOErrorEvent):void {	_netProxy.onError(IOErrorEvent.IO_ERROR);//移交处理权}private function securityErrorHandler(event:SecurityErrorEvent):void {	//移交处理权	_netProxy.onError(SecurityErrorEvent.SECURITY_ERROR);}private function socketDataHandler(event:ProgressEvent):void {	//TODO:处理断包、连包,读取消息长度,如果剩余长度够数据包,	//读取一个数据包到data里,继续执行,否则返回。	_netProxy.receive(data);//移交处理权}

    NetProxy类的伪代码:

/*** 不是单例的,外部通过继承该类实现功能,外部继承类最好是单例的* 并将他设置给NetManager的netProxy属性。*/class NetProxy/*** 不会直接创建,在设置给NetManager时让NetManager共享出来* 且包内封装,外部不能直接访问网络实体对象*/internal var socket:Socket;/*** 消息处理逻辑类的字典* 将消息头与逻辑类对应* 逻辑类必须实现接口INetDelegate*/private var dictDelegate = new Dictionary();final public function open(host:String, port:int){	socket.connect(host, port):}final public function close():void{	socket.close();}public function onError(errorType:String):void{	//外部继承类重写该方法实现}public function onOpen():void{	//外部继承类重写该方法实现}public function onClose():void{	//外部继承类重写该方法实现}internal function receive(data:ByteArray):void{	//TODO:读取消息头	//分发到dictDelegate中对应的	//逻辑类(INetDelegate)的receive方法处理}final public function send(head:uint, body:ByteArray):void{	//TODO:构建消息,发送	//虽然可以在能获得实例的任何地方调用	//但最好在INetDelegate的实现类中调用,达到逻辑封装}final protected function setDelegate(head:uint,					delegate:INetDelegate):void{	//TODO:在dictDelegate中添加映射	//相同head只能一个处理逻辑类,重复设置报错	//最好在外部继承类的构造函数中调用,做到网络功能模块启动时	//就设置好了处理映射}
附件下载:
 8.39KB

转载于:https://www.cnblogs.com/dabiaoge/p/4130724.html

你可能感兴趣的文章
任务调度开源框架Quartz动态加入、改动和删除定时任务
查看>>
C#、.NET网络请求总结(WebClient和WebRequest)
查看>>
[再寄小读者之数学篇](2014-11-20 计算二重积分)
查看>>
Material Designer的低版本兼容实现(八)—— Flat Button
查看>>
haha
查看>>
ContentProvider简单介绍
查看>>
基于jQuery的美食时间轴焦点图插件
查看>>
iOS开发-音乐播放
查看>>
用函数SendARP()获取局域网计算机的MAC地址
查看>>
locate 命令(转)
查看>>
JUnit入门
查看>>
Linux内存管理大图
查看>>
sql中exists,not exists的用法
查看>>
WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现
查看>>
实现android activity之间的跳转
查看>>
XMPP协议实现原理介绍
查看>>
HttpWebRequest类
查看>>
Eureka 的 Application Client client的执行演示样例
查看>>
从决策树学习谈到贝叶斯分类算法、EM、HMM
查看>>
Ubuntu 14.04 字体设置
查看>>