40循环中的If-Statements,如何避免?

时间:2017-02-12 07:39:18

标签: java jinput

我正在使用库JInput来检测java游戏中的控制器输入。但是,为了获得轴移动的方向,我使用它:

gamePadContr.getComponent(Identifier.Axis.X).getPollData();

这给出了一个介于-1和1之间的小数,它表示方向。我希望玩家能够向上,向下,向左和向右移动,所以我的游戏循环中有40个if语句检查数字是否是某个数字集,并增加x和y坐标因此。这是一个例子:

if(x > .1 && x < .2 && y == 1){
   // do stuff
} else
if(x > .2 && x < .3 && y == 1{
  // do stuff
}

我必须检查每一个,以确保考虑到大多数方向。

我的观点是,40如果陈述滞后。 我可以做些什么来优化它?

一些回答问题的修改:

  1. 不认为它是相关的,但.1的增量的原因有40个不同的if语句是因为我正在检查操纵杆的X和Y轴。可能的组合是(1,-1)(1,1)(-1,1)( - 1,-1),给出了40个不同组合中的负数和正数,增量为.1。 (我不知道这是否合理。

  2. //做东西只是增加玩家的x和y坐标一定数量。

2 个答案:

答案 0 :(得分:2)

最好的方法可能是发现一条规则,您可以直接从操纵杆坐标直接计算玩家的坐标变化。为此,我们需要每个分支// do stuff的详细信息。

另一种可能性,如果你没有简单的关系就很好,就是通过将xy值转换为数组索引来将测试转换为查找

int xIndex = (int) (10 * x + 10); // an int between 0 and 20
int yIndex = (int) (10 * y + 10); // ditto

然后,您可以提前一次计算二维数组中的玩家坐标变化。更一般地说,您可以拥有一组Runnable个对象,根据索引查找相应的Runnable,然后run()

P.S。如果每个操纵杆坐标可以分为20个不同范围中的任何一个,那么你有400个案例,而不是40个。也就是说,除非你总是忽略一个或另一个轴。

答案 1 :(得分:1)

你可以做的一件事是筑巢你的条件。而不是

if (x > .1 && x < .2 && y == 1){doStuff();}
else if (x > .2 && x < .3 && y == 1){doStuff();}
else if (x > .1 && x < .2 && y == 2){doStuff();}
else if (x > .2 && x < .3 && y == 2){doStuff();}

您可能需要考虑:

if (y == 1){
    if (x > .1 && x < .2){doStuff();}
    else if (x > .2 && x < .3){doStuff();}
}
else if (y == 2)
{
    if (x > .1 && x < .2){doStuff();}
    else if (x > .2 && x < .3){doStuff();}
}

现在你的代码可以跳过它知道不是真的所有if检查。程序只需检查任何给定循环中的20 + 20 = 40 if语句,而不必检查最多20 * 20 = 400 if语句。你仍然会有很多if语句 - 实际上,你会比以前稍微多一点 - 但是其中90%会被跳过,而且它们每个都会更短,所以程序会运行更快。

您还可以通过巧妙的排序减少每个if语句中的检查次数。如果您已经检查过x < .5并且它是错误的,那么您已经知道x < .4是错误的。例如:

if (y == 1){
    if (x > .9 ){doStuff();}
    else if (x > .8){doStuff();} // no need to check if it's less than .9 since the previous line covered that case
}