我正在寻找一种在我的Cocos2D应用程序中组合这两个if语句的简单方法。然而,到目前为止我的尝试根本没有用。
谢谢!
答案 0 :(得分:2)
您不需要嵌套的IF条件,因为它们可以移动到外部条件检查,如下所示:
if ((!died)
&& (spriteA.tag == 1)
&& (spriteB.tag == 4)
&& (spriteA.position.x - spriteA.boundingBox.size.height / 2 <= spriteB.position.x + spriteB.boundingBox.size.height / 2)) {
sprite.position = ccp(pos.x, spriteB.position.y + spriteB.boundingBox.size.height / 2 + sprite.boundingBox.size.height / 2);
} else if ((!died)
&& (spriteA.tag == 4)
&& (spriteB.tag == 1)
&& (spriteB.position.x - spriteB.boundingBox.size.height / 2 <= spriteA.position.x + spriteA.boundingBox.size.height / 2)) {
sprite.position = ccp(pos.x, spriteA.position.y + spriteA.boundingBox.size.height / 2 + sprite.boundingBox.size.height / 2);
}
答案 1 :(得分:2)
我相信你将if语句合并为一个的尝试源于你实际理解语句的问题。作为程序员,即使您是唯一一个阅读它的人,您的首要任务是编写可读代码。我能想到为什么你只想要一个if语句的另一个原因就是你认为这会更快。
首先,我首先将所有计算移出if子句。这不仅是重复的,而且也容易出错并且很难阅读。由于ARM处理器没有除法指令,我也冒昧地用2乘以2来除以除法,因此除法由软件执行并且无论如何都要重写为乘法。编译器可能已经对此进行了优化,但是如果可以的话,可以避免除法运算。
所以这就是我写这个陈述的方式。额外的局部变量不会导致性能损失。通常编译器会做类似的事情。类似地,如果spriteA.tag不是1,则条件不会计算第一个if条件的其余部分,而是直接跳转到测试else if部分。这被称为“早出”:在第一次测试将导致整个条件失败,程序将停止评估剩余的测试,因为这样做没有意义。因此,最好使用最常失败的条件开始if语句(或嵌套ifs)。
float spriteAHalfWidth = spriteA.boundingBox.size.height * 0.5f;
float spriteBHalfWidth = spriteB.boundingBox.size.height * 0.5f;
float spriteALeftSide = spriteA.position.x - spriteAHalfWidth;
float spriteARightSide = spriteA.position.x + spriteAHalfWidth;
float spriteBLeftSide = spriteB.position.x - spriteBHalfWidth;
float spriteBRightSide = spriteB.position.x + spriteBHalfWidth;
if (died == NO)
{
if (spriteA.tag == 1 && spriteB.tag == 4 &&
spriteALeftSide <= spriteBRightSide)
{
float y = spriteB.position.y + spriteBHalfWidth +
sprite.boundingBox.size.height * 0.5f;
sprite.position = ccp(pos.x, y);
}
else if (spriteA.tag == 4 && spriteB.tag == 1 &&
spriteBLeftSide <= spriteARightSide)
{
float y = spriteA.position.y + spriteAHalfWidth +
sprite.boundingBox.size.height * 0.5f;
sprite.position = ccp(pos.x, y);
}
}
毋庸置疑,您无法将其合并为单个if语句。最后,您执行两个不同的功能(根据spriteA或spriteB的y位置更新位置)。因此,您需要有两个分支。
如果您愿意,如果您真的想要避开最外层的if子句,可以在两个嵌套if语句中添加died == NO
作为第一个测试。但是,这样做会使您的程序始终测试died == NO
两次,即使死亡变量不会改变。另一方面,编译器也可能识别并优化这种情况。
答案 2 :(得分:1)
你可以这样做:
if ((spriteA.tag == 1 && spriteB.tag == 4) || (spriteA.tag == 4 && spriteB.tag == 1)) {
if ((spriteA.position.x - spriteA.boundingBox.size.height / 2 <= spriteB.position.x + spriteB.boundingBox.size.height / 2) && !died) {
sprite.position = ccp(pos.x, spriteB.position.y + spriteB.boundingBox.size.height / 2 + sprite.boundingBox.size.height / 2);
}
}
或者如果它真的只需要一个if
声明,那么你可以这样做:
if (((spriteA.tag == 1 && spriteB.tag == 4) || (spriteA.tag == 4 && spriteB.tag == 1))
&& ((spriteA.position.x - spriteA.boundingBox.size.height / 2 <= spriteB.position.x + spriteB.boundingBox.size.height / 2) && !died)) {
sprite.position = ccp(pos.x, spriteB.position.y + spriteB.boundingBox.size.height / 2 + sprite.boundingBox.size.height / 2);
}
无论哪种方式,它都非常难看。