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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值