我正在寻找一种简单的方法来在我的 Cocos2D 应用程序中组合这 2 个 if 语句。然而到目前为止我的尝试根本没有奏效。
谢谢!
最佳答案
我相信您尝试将 if 语句合并为一个语句是由于您实际理解该语句的问题。作为一名程序员,您的首要职责是编写可读的代码,即使您是唯一阅读该代码的人。我能想到为什么你只想要一个 if 语句的另一个原因是你认为这会更快。
所以首先我将把所有计算移出 if 子句。这不仅重复,而且容易出错并且很难阅读。我还冒昧地将除以 2 替换为乘以 0.5f,因为 ARM 处理器没有除法指令,因此除法由软件执行并重写为乘法。编译器可能已经对此进行了优化,但如果可以的话,避免除法运算仍然是一个好的做法。
这就是我如何编写该声明。额外的局部变量不会导致性能损失。通常编译器无论如何都会做类似的事情。同样,如果 spriteA.tag 不为 1,则该条件不会评估第一个 if 条件的其余部分,而是直接跳转到测试 else if 部分。这称为“提前退出”:在第一个测试中,这将导致整个条件失败,程序将停止评估剩余的测试,因为这样做是没有意义的。因此,最好以最常失败的条件开始 if 语句(或嵌套 if)。
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 子句,可以添加 died == NO
作为两个嵌套 if 语句中的第一个测试。然而,这样做会让你的程序总是测试 died == NO
两次,即使 dead 变量不会改变。另一方面,编译器也可能识别并优化这种情况。
关于ios - 如何组合这两个 Cocos2D if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9043353/