您的位置:首页 > 其它

战争迷雾的实现——占用影响图

2008-12-25 07:37 253 查看
战争迷雾的实现——占用影响图

像魔兽争霸3这种游戏,一开始的时候呢,满地图都是黑的,只有你的基地和兵所在的地方可以看到东西。然后你控制你的兵进行探索,你的兵所到的位置烟雾就消失啦,可以看到很清晰的地图上的细节。但是当你的兵离开以后,地图就灰了,你看不到实时的细节,比如那个位置有没有敌兵或者怪物,但是还是可以看到灰色的地形细节。我把这种东西叫做战争迷雾。嗯,最近学了占用影响图,想到了一个战争迷雾的实现方法。

这个方法就是用占用影响图。

首先定义一个gameObj(游戏物件——暂且这么叫),这个可以代表你的兵和你的建筑。

struct
注册物件

{

gameObj
游戏物件;

int
注册物件宽;

int
注册物件高;

int
注册物件类型;

Vector3 注册物件上一次位置;(我们用一个三维向量表示物件位置,但是实际上我们的影响图的逻辑是2d的,所以只会用到注册物件位子的x,y两个坐标值)

bool
是否对占用影响图产生作用;

}

class 占用影响图

{

初始化(每一格宽度,每一格高度,总的宽度,总的高度);

获取某一格信息(x,y){return 地图信息[x][y];}

注册游戏物件(注册物件X){将注册物件X添加到物件列表;}

删除游戏物件(注册物件X){将注册物件X从物件列表删除;}

设置地图信息与运算(int x,int y,int sizeX, int sizeY, 信息的值)

{

根据位置坐标(x,y)和物件大小(sizex,sizey)推算出注册物件占用的地图的格子数:从X1到X2,从Y1到Y2;

for(int i = X1;i <= X2; i++)

{

for (int j = Y1; j <=
Y2; j++)

{

地图信息[i][j] &= 信息的值;

}

}

}

设置地图信息或运算(int x,int y,int sizeX, int sizeY, 信息的值)

{

根据位置坐标(x,y)和物件大小(sizex,sizey)推算出注册物件占用的地图的格子数:从X1到X2,从Y1到Y2;

for(int i = X1;i <= X2; i++)

{

for (int j = Y1; j <=
Y2; j++)

{

地图信息[i][j] |= 信息的值;

}

}

}

每帧逻辑更新()

{

遍历注册物件列表

{

如果注册物件-》游戏物件-》当前位置 == 注册物件-》上一次位置

{

continue;

}

如果注册物件-》对占用图产生作用

{

设置地图信息与运算(注册物件-)上一次位置的X,注册物件-》上次位置的Y,注册物件的宽,注册物件的高,~(1<<1));//清空注册物件上一次影响图位置的第二位

设置地图信息或运算(注册物件-)当前位置X,注册物件-》当前位置Y,注册物件的宽,注册物件的高,6);//将注册物件当前影响图位置的第二位和第三位置为1,只要游戏物件曾经到过某处,那么第三位永远为1

}

}

}

}

如何使用这个影响图呢?呵呵,想要知道地图的(x,y)处是完全可见,或者灰色,或者是完全不可见的黑色,只要调用:占用影响图-》获取某一格信息(x,y);获得的值如果第二位是1,那么完全可见,否则如果第三位是1,那么灰色,否则,是完全不可见的黑色。

现在因为我在设计坦克大战,所以又考虑了一下占用影响图对坦克大战的作用。

只要对占用影响图做一些更改,如果某处有一辆敌军坦克,那么他的控制范围的占用影响图的值全部+1;这样可以根据占用影响图判断地图某处的拥挤程度,可以让坦克选择冲向敌人最多的地方…………………………但是,这个ai判断似乎没有任何作用。呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: