【发布时间】:2017-07-17 16:37:30
【问题描述】:
我正在更新游戏。
在游戏中,有不同数量的武器单位。就像:带有(Baneblade Cannoon,Demolisher Cannon and Heavy Bolter)的Baneblade Super Heavy Tank。
有些武器具有特殊的武器特性,而有些则没有。具有零特征的武器显示为“”(不为空,只有空格)。
在我的例子中,毒刃加农炮是"",毁灭者加农炮是"Siege",重型爆矢枪是""。
我想做的是:如果武器有"Siege" trait,敌人的掩护将被忽略,它将是0。
我可以这样做:
for (int w = 0; w < 4; w++)
{
... // some other codes
int nDefCover = g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover; // to reset nCover
const auto& traits = m_arrUnitEx[nAtt].unit.pType->arrWeapons[w]->strTraits;
// I check if a number w weapon has "Siege" string
if (traits.Find("Siege") != std::string::npos)
{
// nCover gives the value of enemy's cover.
g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = 0;
}
... // some other weapon trait codes
if (traits.Find("") != std::string::npos)
{
g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover;
}
}
在此之后,我必须重置nCover 值,否则从现在开始,所有武器都会忽略敌人的掩护加成。我只希望攻城武器无视掩护。
所以,我使用g_arrTerrainTypes[m_arrUnitEx[nDef].nTerrain].nCover = nDefCover; 将nCover 重置为其他武器的实际值。
但是系统是这样工作的:
它看着第一把武器。它是"",因此它将nCover 更改为其原始值。
它看着第二把武器,它是"Siege",所以它把nCover变成了0。
它查看第三把武器,它是"",因此将nCover 更改为其原始值。
最后,nCover 将返回其原始值,而Siege 武器特性则毫无意义。这就像0 OR 0 OR 1 情况。
如果一个单位在其最后一个武器槽中拥有Siege 武器,则此代码可以工作,但每个单位的武器顺序都会发生变化。
我如何将nCover 的Siege 武器更改为0,但对于其他情况,在不更改Siege 武器nCover 的情况下更改为其原始值?我应该使用循环来执行此操作,但找不到放置它的位置以及我应该使用哪个循环。
【问题讨论】:
-
你为什么要改变这个值?我的意思是球员的掩护并不取决于针对他的目标。只是某些武器忽略了该值(无论它是什么,无需修改)
-
换句话说:为什么“......特质,敌人的掩护将被忽略,它将为“0””,而不仅仅是“敌人的掩护将被忽略。” ?为什么在忽略它的情况下将值设置为 0?
-
我在最后阶段进入了这个过程。当他们建立这样的系统时,我不在场......在游戏中,掩护奖金就像10、25、30、50(最多)一样。所以如果他们是0,攻城武器计算它的伤害就好像没有掩护一样。你的说法其实是一样的。如果我不重置“掩体”,所有武器都会忽略掩体。这不是将其值更改为“0”或“忽略它”。这是关于在适当的时候重置值。
-
如果你遍历你的武器,你可以计算掩护,计算伤害(为下一个武器恢复掩护)。
-
@Jarod42 感谢您的想法。我会尽力做到这一点。顺便说一句,也感谢您编辑代码,它给了我另一个想法。
标签: c++ loops variables if-statement constants