2012-07-12 67 views
0

我在Java中有一些編碼來計算自上次檢查變量以來虛擬相機中的移動。更具體地說,這個代碼如下:如何比較1個if語句中的多個整數而不重複它?

float movementX, movementY, movementZ;     
movementX = (int) (camX - sectorSize[1]); 
movementY = (int) (camY - sectorSize[2]); 
movementZ = (int) (camZ - sectorSize[3]); 

/* 
* If the variable is below 0 
* then get the absolute value 
* of the movement since the 
* last camera position. 
*/ 
if (movementX < 0) movementX *= -1; 
if (movementY < 0) movementY *= -1; 
if (movementZ < 0) movementZ *= -1; 

if (movementX > 60 || movementY > 60 || movementZ > 60) 
{ 
    //Reset the sector size to allow for new points, 
    //don't store to save memory (may be changed later). 
sectorSize[0] = 0; 
} 

如果你需要更多的代碼,讓我知道。 sectorSize變量在其[0]值中存儲0-500,前者中的camX爲[1]值,前者中的camY爲[2]值,最後爲前者中的camZ,其值爲[3]。 camX,camY和camZ由其他代碼處理(不顯示)。刪除了所有內容,但代碼爲問題以保持整潔。

此代碼按原樣運行,但每次輸入「if(a_int_value> an_other_value || etc)」有點單調乏味。

+1

如果該代碼被認爲是可信的,那麼movementX將永遠不會成爲60。如果它大於0,它會變成負數,因此永遠不會達到正數。至少可以說這是相當混亂的。你確定你沒有混淆,應該使用<?編碼精確度和SO問題。 – 2012-07-12 22:39:03

+0

這是最明確的做法,是的,它很繁瑣,但很容易理解 – Ghost 2012-07-12 22:39:08

+0

對於我的錢,我只需要'movementX =(int)Math.abs(camX - sectorSize [1]) ;''另外,什麼發生在''//做些什麼..「' – 2012-07-12 22:41:21

回答

0

我會創造一個運動類和編碼參數中它是‘合法’的運動。
然後你可以測試:movementX.isValid()。您也可以保留一個List或創建另一個類來包裝三個座標軸,並使用一個isValid()方法進行測試。

您應該考慮將扇區大小存儲在比數組更多的描述中。

最後,你爲什麼要將你的浮點數轉換爲int?這有什麼好處呢?如果你的意思是去除小數點,那麼有更好的方法來截斷,或者使值/底限值上限。

+0

扇區大小[0]值必須是int,因爲它描述了屏幕上有多少白點(「星號」)。小數在這個計算中並不重要,但它是用於移動的,所以我將camX,camY和camZ的值作爲浮點數。 – 2012-07-12 23:09:52

+0

這主要是爲了防止白點過度擁擠(之前我曾經發生過,它使一切都變得緩慢,而且是白色的。) – 2012-07-12 23:10:25

0

把時刻放入一個int數組中。

迭代搜索所有真實條件的數組。如果遇到真實情況,請將該標記標記爲真並中斷循環。最後,如果沒有條件成立,你的旗幟是假的。

就是這樣。

boolean ok = false; 

for (int v : momentArray) { 
    if (v > 60) { 
     ok = true; 
     break; 
    } 
} 

if (ok) { 
    // ok, do something... 
} 

或者

public static boolean checkForValues(int[] array, int min) { 

    for (int v : array) { 
     if (v > min) { 
      return true; 
     } 
    } 

    return false; 

} 


// in another class... 

if (checkForValues(momentArray, 60)) { 
    // ok, do something... 
} 

我假定所有的條件都是一樣的。如果它們不同,你也可以概括代碼,但是你會創建一個類來存儲條件......它不值得工作,所以它更可取代條件。

另一件事。你只有樹的價值。如果你有很多值(具有相同的條件),我認爲迭代會很好,但在你的情況下,我認爲更好地編碼每個條件,因爲更容易理解Ghost所說的代碼。

的[]

+0

謝謝,我想我會堅持現在的long if語句(它只有3個變量,創建一個整個班級有點矯枉過正)。但是這對於我的未來想法很有用,現在我知道爲什麼dot沒有繪製(與<混合>)。 – 2012-07-12 23:18:49

0

在方法內部創建一個局部類:

void myMethod () 
{ 
    class Movements 
    { 

    float movementX = (int) (camX - sectorSize[1]); 
    float movementY = (int) (camY - sectorSize[2]); 
    float movementZ = (int) (camZ - sectorSize[3]); 

    boolean check3Axes (int commonValue) 
    { 
     return 
     movementX > commonValue 
      || 
     movementY > commonValue 
      || 
     movementZ > commonValue ; 
    } 

    void negate () 
    { 
     if (movementX > 0) movementX *= -1; 
     if (movementY > 0) movementY *= -1; 
     if (movementZ > 0) movementZ *= -1; 
    } 
    }; 

    Movements m = new Movements(); 

    // This can be replaced with m.negate() 
    if (m.movementX > 0) m.movementX *= -1; 
    if (m.movementY > 0) m.movementY *= -1; 
    if (m.movementZ > 0) m.movementZ *= -1; 

    if (m.check3Axes(60)) 
    { 
     //do something.. 
    } 

    if (m.check3Axes(120)) 
    { 
     //do something else.. 
    } 
} 

順便說一句,你可能會發現,你可以添加更多的常用方法運動類,如negate()

但是,在某些時候,讓Movement成爲一個普通的班級可能會更好。

0

內部類看起來是最好的方式。太糟糕的java不會提供任何資源密集型的東西,但是將一堆變量與相同表達式進行比較的能力非常有用!