如何结合这两个Cocos2D if语句?

时间:2012-01-28 06:05:27

标签: ios performance if-statement cocos2d-iphone

我正在寻找一种在我的Cocos2D应用程序中组合这两个if语句的简单方法。然而,到目前为止我的尝试根本没有用。

谢谢!

3 个答案:

答案 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);
}

无论哪种方式,它都非常难看。