|
发表于 2011-4-13 11:59:08
|
显示全部楼层
下载了LZ的演示仔细看了看,但是机器太卡测试不能哇,所以有几个问题希望LZ能解答一下。
我看的是演示 狗冲坦克复杂样例
首先是函数libNtve_gf_ClosestUnitToPoint(单位组中距离点最近的单位)的调用。
[codes=galaxy]
const int c_unitCountAll = 0;
const int c_unitCountAlive = 1;
const int c_unitCountDead = 2;
unit libNtve_gf_ClosestUnitToPoint (point lp_point, unitgroup lp_group) {
unitgroup auto9FF4A9A2_g;
int auto9FF4A9A2_u;
// Variable Declarations
unit lv_pickedUnit;
unit lv_closestUnit;
fixed lv_distance;
fixed lv_distanceShortest;
point lv_unitLocation;
fixed lv_xDiff;
fixed lv_yDiff;
// Variable Initialization
lv_pickedUnit = null;
lv_closestUnit = null;
lv_distance = 0.0;
lv_distanceShortest = 0.0;
lv_unitLocation = null;
lv_xDiff = 0.0;
lv_yDiff = 0.0;
// Implementation
lv_distanceShortest = -1.0;
lv_closestUnit = null;
auto9FF4A9A2_g = lp_group;
auto9FF4A9A2_u = 1;
while (auto9FF4A9A2_u <= UnitGroupCount(auto9FF4A9A2_g, c_unitCountAll)) {
lv_pickedUnit = UnitGroupUnit(auto9FF4A9A2_g, auto9FF4A9A2_u);
lv_unitLocation = UnitGetPosition(lv_pickedUnit);
lv_xDiff = (PointGetX(lv_unitLocation) - PointGetX(lp_point));
lv_yDiff = (PointGetY(lv_unitLocation) - PointGetY(lp_point));
lv_distance = ((lv_xDiff * lv_xDiff) + (lv_yDiff * lv_yDiff));
if (((lv_distanceShortest < 0) || (lv_distance < lv_distanceShortest))) {
lv_distanceShortest = lv_distance;
lv_closestUnit = lv_pickedUnit;
}
else {
}
if (lv_pickedUnit == UnitGroupUnit(auto9FF4A9A2_g, auto9FF4A9A2_u)) {
auto9FF4A9A2_u = auto9FF4A9A2_u + 1;
}
}
return lv_closestUnit;
}
[/codes]
从这个函数来看,它是会返回已死亡单位的。
在演示中使用了它来返回距离小狗最近的坦克,可是因为在坦克死亡的时候并没有将其剔除出单位组,那么对gv_ZerglingTarget赋值后可能会出现bug吧。
1,是会对已死亡单位发送“攻击”命令,如果攻击地点在坦克阵之外的话,有可能造成坦克的剩余呢。
2,lv_ZergTargetCount会无法正确叠加,出现无法完成预期效果的问题。
另外一个就是躲避问题了,因为编号靠后的坦克的攻击产生的躲避命令会覆盖靠前的,那么小狗有可能无法有效躲避炮火吧。
理想的效果是活下来的小狗都是满血,不知道能不能达成呢。 |
|