使用if / if else / else语句进行冲突检测。如何提高?

时间:2013-04-25 18:39:33

标签: android andengine collision

我目前正在AndEngine中开发一款游戏,并且我已经通过检查每辆车与敌人阵列的每个单独索引来设置与敌人的碰撞检测,因为某些原因,for循环不起作用。这是非常不方便的,因为它不仅可以增加和减少敌人的苦差事,而且看起来很糟糕!它看起来像这样:

if (rManager.getInstance().iceArray[0].getIceSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite()))
{
    rManager.getInstance().carArray[r].setCarSpeed(1f);
} else if (rManager.getInstance().iceArray[1].getIceSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite())) {
    rManager.getInstance().carArray[r].setCarSpeed(1f);
} else if (rManager.getInstance().iceBergArray[0].getIceBergSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite())) {
    rManager.getInstance().carArray[r].setCarSpeed(0f);
} else {
    rManager.getInstance().carArray[r].setCarSpeed(0.5f);
}   

我试过的for循环是这样的,[r]是汽车阵列的每一辆车,但它似乎没有做任何事情。

for (int h = 0; h < rManager.getInstance().snowArray.length; h++)
{
    if (rManager.getInstance().snowArray[h].getSnowSprite().collidesWith(rManager.getInstance().carArray[r].getCarSprite())) {
        String temp = rManager.getInstance().carArray[r].toString();
        Log.e("SNOW", "SNOWWWWW!" + rManager.getInstance().snowArray[h].toString());
        rManager.getInstance().carArray[r].setCarSpeed(0.2f);
    }
}

谢谢!

1 个答案:

答案 0 :(得分:4)

您应该使用工厂模式或策略模式删除if else。

请参阅以下链接以参考。

http://www.cumps.be/nl/blog/read/design-patterns-strategy-pattern

Strategy Pattern with no 'switch' statements?

编辑

根据您的代码,startegy模式应该遵循以下pesudo代码。我已根据您上面发布的代码做了一些假设。

您将创建一个包含逻辑和适当操作的字典,如下所示:

 Dictionary<Func<RManager, int, bool>, Action<Car>> 
 ruleUpdates = 
 new Dictionary<Func<RManager, int, bool>, Action<Car>>();

每个Func<Ice, Car, bool>你应该像这样实现

private bool ZeroElementEqualIcePrite(RManager rManager, int r)
    {
        return rManager.getInstance().iceArray[0].collidesWith(rManager.getInstance().carArray[r].getCarSprite());
    }

和Action应按如下方式实施:

public static void DoUpdateOneLevel(Car car)
{
    car.setCarSpeed(1f);
}

从那里我们可以用相同的方式实现与代码之后的所有逻辑类似的操作。 您可以按照以下

初始化字典
ruleUpdates.Add(FirstElementEqualIcePrite, DoUpdateOneLevel);
ruleUpdates.Add(SecondElementEqualIcePrite, DoUpdateOneLevel);
ruleUpdates.Add(FirstElementEqualIceBergPrite, DoUpdateZeroSpeed);
ruleUpdates.Add(SecondElementEqualIceBergPrite, DoUpdateZeroSpeed);

之后你只需循环遍历executionList的每个键,如下所示。

foreach (KeyValuePair<Func<RManager, int, bool>, Action<Car>> 
 ruleUpdate in ruleUpdates)
    {
       if (ruleUpdate.Key.Invoke(rManager, r))
       {
          ruleUpdate.Value.Invoke(rManager.getInstance().carArray[r]);
          break;
       }
    }

希望这有帮助。遵循该策略,您的代码将清理并且易于更改,并不关心if / then / else逻辑。您将来可以轻松扩展它。