一,定义条件
进入CvGameCoreDLL目录打开“CvDefines.h”,可以找到下边四行。
1 2 3 4 |
#define NUM_CITY_PLOTS (21) #define CITY_HOME_PLOT (0) #define CITY_PLOTS_RADIUS (2) #define CITY_PLOTS_DIAMETER ((CITY_PLOTS_RADIUS*2) + 1) |
NUM_CITY_PLOTS 是城市工作的地块数量
CITY_HOME_PLOT 是城市是位于那一个地块
CITY_PLOTS_RADIUS 是工作范围半径
CITY_PLOTS_DIAMETER 是工作范围这个正方形的长宽
他们的关系会在后面讲。
二,城市范围的结构
打开“CvGlobals.cpp”,找函数“void CvGlobals::init()”,再往下看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
int aiCityPlotX[NUM_CITY_PLOTS] = { 0, 0, 1, 1, 1, 0,-1,-1,-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2,-1, }; int aiCityPlotY[NUM_CITY_PLOTS] = { 0, 1, 1, 0,-1,-1,-1, 0, 1, 2, 2, 1, 0,-1,-2,-2,-2,-1, 0, 1, 2, }; int aiCityPlotPriority[NUM_CITY_PLOTS] = { 0, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4, }; int aaiXYCityPlot[CITY_PLOTS_DIAMETER][CITY_PLOTS_DIAMETER] = { {-1, 17, 18, 19, -1,}, {16, 6, 7, 8, 20,}, {15, 5, 0, 1, 9,}, {14, 4, 3, 2, 10,}, {-1, 13, 12, 11, -1,} }; |
现在先看aaiXYCityPlot这个二维数组
根据之前的定义,aaiXYCityPlot[5][5],就是一个长宽都是5的25格的二维数组。再看四个角的-1,-1就是不工作的格,NUM_CITY_PLOTS的定义为21,现在明了吧。
现在用你的斗鸡眼看一下这个aaiXYCityPlot数组像什么?就是游戏中的城市工作范围。
aaiXYCityPlot、aiCityPlotX、aiCityPlotY三者的关系用一张图来表示
如果理解?从aaiXYCityPlot中间的0开始,右1,下2。。。顺时针至20为止
aiCityPlotX、aiCityPlotY就是坐标,将X和Y分开为两个数组,数组分为三行是让你好理解,就是有三层,看一下aaiXYCityPlot这个正方形。
aaiXYCityPlot的0,就是aiCityPlotX和aiCityPlotY的第一行第一个,0和0,合起来就是0,0
aaiXYCityPlot的1,就是aiCityPlotX和aiCityPlotY的第二行第一个,0和1,合起来就是0,1
aaiXYCityPlot的2,就是aiCityPlotX和aiCityPlotY的第二行第二个,1和1,合起来就是1,1
aaiXYCityPlot的3,就是aiCityPlotX和aiCityPlotY的第二行第三个,1和0,合起来就是1,0
aaiXYCityPlot的9,就是aiCityPlotX和aiCityPlotY的第三行第一个,0和2,合起来就是0,2
aaiXYCityPlot的16,就是aiCityPlotX和aiCityPlotY的第三行第八个,-1和-2,合起来就是-1,-2
aaiXYCityPlot的20,就是aiCityPlotX和aiCityPlotY的第三行第十二个,-1和2,合起来就是-1,2
好了,还不明的话我没办法了。
aiCityPlotPriority看字面是优先级,但因计算不在DLL内,不能解释作用如何。配合aaiXYCityPlot看一下,就明白为斜角的格设高一点。
原理解释到此,应该不会有理解上的困难。
注意,城市工作范围和城市扩展的文化范围是没有任何关系的。
三,修改
现在实现三格城市工作范围吧。
1,打开“CvDefines.h”,修改
1 |
#define CITY_PLOTS_RADIUS (3) |
3格半径的话,CITY_PLOTS_DIAMETER = ((CITY_PLOTS_RADIUS*2) + 1),CITY_PLOTS_DIAMETER相乘就等于49
2,先设计好aaiXYCityPlot这个二维数组
打开“CvGlobals.cpp”,修改
1 2 3 4 5 6 7 8 9 10 |
int aaiXYCityPlot[CITY_PLOTS_DIAMETER][CITY_PLOTS_DIAMETER] = { {-1, -1, 32, 33, 34, -1, -1}, {-1, 31, 17, 18, 19, 35, -1}, {30, 16, 6, 7, 8, 20, 36}, {29, 15, 5, 0, 1, 9, 21}, {28, 14, 4, 3, 2, 10, 22}, {-1, 27, 13, 12, 11, 23, -1}, {-1, -1, 26, 25, 24, -1, -1} }; |
形状是你自己喜欢,没-1也没关系,我当前只是按文化扩展来定工作范围的形状。
3,定义NUM_CITY_PLOTS
打开“CvDefines.h”,修改
1 |
#define NUM_CITY_PLOTS (37) |
49-12,12就是12格-1,实际工作的只有37格
4,定义XY数组
打开“CvGlobals.cpp”,修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int aiCityPlotX[NUM_CITY_PLOTS] = { 0, 0, 1, 1, 1, 0,-1,-1,-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2,-1, 0, 1, 2, 3, 3, 3, 2, 1, 0,-1,-2,-3,-3,-3,-2,-1, }; int aiCityPlotY[NUM_CITY_PLOTS] = { 0, 1, 1, 0,-1,-1,-1, 0, 1, 2, 2, 1, 0,-1,-2,-2,-2,-1, 0, 1, 2, 3, 3, 2, 1, 0,-1,-2,-3,-3,-3,-2,-1, 0, 1, 2, 3, }; |
自己数格吧,或者先画张图来填也行,我也建议你这样做,免得搞错坐标
5,最后再写优先级
1 2 3 4 5 6 7 |
int aiCityPlotPriority[NUM_CITY_PLOTS] = { 0, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4, 5, 6, 7, 6, 5, 6, 7, 6, 5, 6, 7, 6, 5, 6, 7, 6, }; |
斜角最高,平角次之。