0

我正在使用库 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 个 if 语句滞后。我能做些什么来优化它吗?

一些编辑来回答问题:

  1. 不认为这是相关的,但是 .1 的增量有 40 个不同的 if 语句的原因是因为我正在检查操纵杆的 X 和 Y 轴。可能的组合是 (1, -1) (1, 1) (-1, 1) (-1, -1),以 0.1 的增量为我提供 40 种不同组合的负数和正数。(我不知道这是否有意义。

  2. //do stuff 只是将玩家的 x 和 y 坐标增加一定数量。

4

2 回答 2

2

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

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

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

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

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

于 2017-02-12T07:51:38.437 回答
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 = 400 条 if 语句,而只需在任何给定循环中检查多达 20+20=40 条 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
}
于 2017-02-12T07:51:21.763 回答