C++解耦合的一种方法

简介:

以数据为中心,多模块之间使用全局变量来做消息通知,或者状态改变,这样模块之间没有直接的联系。各个模块都是直接使用全局变量而已。全局变量的问题这里不探讨。

 

以我的实例讲解,游戏中的英雄(主角)在地图上自动奔跑到 鼠标点击的地方,或者网络信令传过来的坐标位置上。主角的自动移动方法setAutoMovePos这里不细说

 

原来的做法如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Map.cpp文件
//鼠标按下事件
bool  Map::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint point = pTouch->getLocation();
//获取鼠标点击地图的 地图坐标
float  x = point.x - getPositionX();
float  y = point.y - getPositionY();
//获取主角的精灵控件
Player* pc  = (Player*) this ->getChildByTag(PC.mapUserInfo.ID);
pc->setAutoMovePos( ( int )x, ( int )y ); //引擎会帮助主角自动移动的
//表示 这个事件已经截获,不再往下一层进发了
return  true ;
}
//设置主角自动寻路
void  Map::auto_routing( void )
{
//获取主角的精灵控件
Player* pc  = (Player*) this ->getChildByTag(PC.mapUserInfo.ID);
pc->setAutoMovePos( ( int )x, ( int )y ); //引擎会帮助主角自动移动的
}

网络信令解析玩家的代码片段如下

1
2
3
4
5
6
7
8
9
10
11
//xiyou_unpack.cpp文件
//230   自动寻路
void  xiyou_unpack::unpack_MAP_AUTO_ROUTING( char * data, int32 len)
{
PC.mapUserInfo.map_destination_x= unpack.unpack_GET_H();
PC.mapUserInfo.map_destination_y= unpack.unpack_GET_H();
if ( xiyou_game::getGameState() == XIYOU_STATE_MAP )
{
map.auto_routing();
}
}
  

以上代码就可以说明问题了,在xiyou_unpack.cpp文件中需要引入Map.h,这样2个不同的模块就被耦合在一起了。

 

以下是用主角的数据为中心将xiyou_unpack.cpp与Map.cpp彻底分开,用PC的数据做联系的代码示例。

PC的数据增加布尔变量PC.mapUserInfo.isAutoMove标识是否开始自动移动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Map.cpp文件
//鼠标按下事件
bool  Map::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
CCPoint point = pTouch->getLocation();
float  x = point.x - getPositionX();
float  y = point.y - getPositionY();
//设置自动移动
PC.mapUserInfo.isAutoMove =  true ;
PC.mapUserInfo.map_destination_x = ( int )x;
PC.mapUserInfo.map_destination_y = ( int )y;
return  true ; //表示 这个事件已经截获,不再往下一层进发了
}
//地图刷新函数,每帧都会调用
void  Map::mapUpdate( float  dt)
{
if ( PC.mapUserInfo.isAutoMove )
{
PC.mapUserInfo.isAutoMove =  false ;
Player* PCP  = (Player*) this ->getChildByTag( PC.mapUserInfo.ID );
PCP->setAutoMovePos( PC.mapUserInfo.map_destination_x, PC.mapUserInfo.map_destination_y );
}
}

这样在地图刷新的每帧里都做PC是否要自动移动的判断,如果需要则自动移动。

在看信令解析模块的位置修改

1
2
3
4
5
6
7
8
//xiyou_unpack.cpp文件
//230   自动寻路
void  xiyou_unpack::unpack_MAP_AUTO_ROUTING( char * data, int32 len)
{
PC.mapUserInfo.map_destination_x= unpack.unpack_GET_H();
PC.mapUserInfo.map_destination_y= unpack.unpack_GET_H();
PC.mapUserInfo.isAutoMove =  true ;        //开始自动寻路
}

这样在信令到达客户端的时候,自需要将PC的数据修改即可,地图模块在刷PC的数据,当刷到开始自动寻路的时候也获得到PC的目的地坐标,则可开始自动行走了!

 

如上xiyou_unpack.cpp文件里没有了Map的对象,也就不用引入Map类了,这2个模块就互不关心了,达到解耦合目的!

 



本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/1289167

相关文章
|
1月前
|
设计模式 测试技术 编译器
C++项目中打破循环依赖的锁链:实用方法大全(一)
C++项目中打破循环依赖的锁链:实用方法大全
78 0
|
1月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
145 0
|
1月前
|
C++
C++ 捕获所有异常并拿到错误原因的方法
C++ 捕获所有异常并拿到错误原因的方法
|
1月前
|
C++
在C++语言中比较两个数的大小的方法
在C++语言中比较两个数的大小的方法
135 0
|
1月前
|
存储 缓存 Java
嵌入式系统中C++内存管理基本方法
嵌入式系统中C++内存管理基本方法
81 0
|
1月前
|
编译器 API C语言
C/C++ 获取文件名的方法:分享一些实用的获取文件名的方法和技巧(__FILE__,__builtin_FILE(),__BASE_FILE__等)
C/C++ 获取文件名的方法:分享一些实用的获取文件名的方法和技巧(__FILE__,__builtin_FILE(),__BASE_FILE__等)
44 0
|
1月前
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
82 1
|
27天前
|
存储 算法 数据管理
C++中利用随机策略优化二叉树操作效率的实现方法
C++中利用随机策略优化二叉树操作效率的实现方法
77 1
|
28天前
|
存储 算法 数据库
【C/C++ 数据结构 】树的 四种表示方法
【C/C++ 数据结构 】树的 四种表示方法
30 0
|
1月前
|
算法 Unix Linux
【C/C++ 疑难解决】深入解析C++链接错误:实用的调试技巧和方法
【C/C++ 疑难解决】深入解析C++链接错误:实用的调试技巧和方法
13 1

热门文章

最新文章