战争迷雾的实现——占用影响图
像魔兽争霸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判断似乎没有任何作用。呵呵。