C++解耦合的一种方法

  • Post author:
  • Post category:其他


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

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

原来的做法如下代码

//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 );//引擎会帮助主角自动移动的
}

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

//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标识是否开始自动移动。

//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是否要自动移动的判断,如果需要则自动移动。

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

//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个模块就互不关心了,达到解耦合目的!

转载于:https://blog.51cto.com/kome2000/1289167


关闭菜单