0

変数が最後にチェックされてからの仮想カメラの動きを計算するために、Javaでコーディングを行っています。より具体的には、以下のこのコード:

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

さらにコードが必要な場合は、お知らせください。ectorSize変数は、[0]値に0〜500、[1]値に前者のcamX、[2]値に前者のcamY、最後に[3]値に前者のcamZを格納します。camX、camY、およびcamZは、他のコード(表示されません)によって処理されます。整理整頓のために、問題のコード以外のすべてを削除しました。

このコードはそのまま動作しますが、毎回「if(a_int_value> an_other_value || etc)」と入力するのは少し面倒です。

4

4 に答える 4

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が言ったようにコードを理解しやすいので、シナリオではすべての条件をコーディングする方が良いと思います。

[]の

于 2012-07-12T22:37:30.903 に答える
0

私はMovementクラスを作成し、その中の「合法的な」動きのパラメーターをエンコードします。
次に、movementX.isValid()をテストできます。リストを保持するか、別のクラスを作成して3つの軸をラップし、テストする単一のisValid()メソッドを使用することもできます。

セクターサイズを配列よりもわかりやすいものに格納することを検討する必要があります。

最後に、なぜフロートをintにキャストするのですか?それから何が得られるのでしょうか?小数点以下を削除する場合は、値を切り捨てる、または値を床/天井にするより良い方法があります。

于 2012-07-12T22:53:46.587 に答える
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..
   }
}

ところで、Movementsクラスに、などのより一般的なメソッドを追加できる場合がありますnegate()

ただし、ある時点で、Movementを通常のクラスにする方がよい場合があります。

于 2012-07-12T22:53:47.097 に答える
0

The inner-class looks like the best way to go. Too bad java doesn't provide anything less resource-intensive, but the ability to compare a bunch of variables with the same expression helps a lot!

于 2012-07-13T18:13:50.730 に答える