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