2012-07-12 69 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不会提供任何资源密集型的东西,但是将一堆变量与相同表达式进行比较的能力非常有用!