2017-02-12 49 views
0

我正在使用庫JInput來檢測java遊戲中的控制器輸入。然而,爲了獲得軸移動的方向,我用這個:40循環中的If語句,如何避免?

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

這給了我-1和1,該告訴的方向之間的小數。我希望玩家能夠移動的不僅僅是向上,向下,向左和向右,因此在我的gameloop中有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),以0.4的增量給出40種不同組合中的負值和正值。 (我不知道這是否是有意義的。

  2. //做的東西只是通過一定量的增加玩家的X和Y座標。

    你可以做
+1

向量,sin,cos,trigonometry – Justin

+0

當您將範圍以0.1爲增量進行分區時,-1和1之間的小數如何給出40個情況?另外,你發佈的代碼只對'x <.2'和'x> .2'作出反應;準確地說x == .2等等發生了什麼? –

+0

你能舉一個你在'//做什麼'中做什麼的例子嗎?你如何移動播放器?你有沒有看到任何圖案?你如何使用這些模式來消除if語句? –

回答

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個。也就是說,除非你總是忽略一個或另一個軸。

+0

數組查找的好方案。 +1 –

+0

Wuoldn't是21個不同的範圍和441例? – Turo

+0

@Turo - 可能。這取決於你如何處理端點。 –

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();} 
} 

現在你的代碼可以SK ip所有如果檢查它知道是不正確的。不必檢查最多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 
} 
+0

如果x和y彼此獨立,那麼也可能會有一些簡化 - 您甚至不必嵌套條件;他們可以分開。儘管在其他答案中的數組查找可能更好。 –