以数据为中心,多模块之间使用全局变量来做消息通知,或者状态改变,这样模块之间没有直接的联系。各个模块都是直接使用全局变量而已。全局变量的问题这里不探讨。
以我的实例讲解,游戏中的英雄(主角)在地图上自动奔跑到 鼠标点击的地方,或者网络信令传过来的坐标位置上。主角的自动移动方法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