2012-05-09 6 views
0

私は困惑しており、これを見るためにもう一組の目が必要です。このコードは動作していて、突然動作を停止しました。基本的に私はarraylistにオブジェクトを追加しています。私がリストを作成しているとき、それを見ると、繰り返しごとに一意のオブジェクトを追加するようです。基本的に画面に表示されるスプライトとそのx、y座標、色、および速度。以前はこれが機能し、スプライトが画面に散在して表示されるようになりましたが、リストに最後に追加されたオブジェクトが重複しているように見えます。それは意味をなさない...Javaのリストを参照すると常に最後の要素が返されます

最初のprintlnステートメントは、コンストラクタに渡されるものを出力します。それで、それはそういう形で印刷されます。

ボール:1のx:123 Y:344色:ブルー ボール:2×:3 yの233色:グリーン ボール×3:24 Y:3色:ブルー

すべてがこれまでに素晴らしく見えます。そして、私は実際にコンソールにリストを印刷し、私が手

ボール:1のx:24 Y:3色:ブルー ボール:1のx:24 Y:3色:ブルー ボール:1のx:24 Y:3カラー:ここで私はそれが起こっている理由を把握しようとしている問題をあるブルー

...

//When I create the List Eclipse refused to accept it until I initialized it like so... 

    java.util.List <Sprite> sprite = new java.util.ArrayList<Sprite>();  
    //yes I did import java.util.*; Eclipse still was digging it. This was working correctly despite the way i added it. I also changed this to a Vector which Eclispe was more content with with no effect. 

    private void GenerateSprites(){ 
     //Random to keep it random 
     Random r = new Random(System.currentTimeMillis()); 
     //variables for selecting and setting color 
     Color color = null; 
    int colorValue; 
    //variables for their x,y coordinates 
    float bX = 0; 
    float bY = 0; 
    //Create each ball set the color and generate the x,y coordinates 
    for (int x = 0; x < NUM_BALLS; x++){ 
     colorValue = r.nextInt(4); 
     if (colorValue == 0) color = Color.BLUE; 
     if (colorValue == 1) color = Color.RED; 
     if (colorValue == 2) color = Color.YELLOW; 
     if (colorValue == 3) color = Color.GREEN; 

     bX = r.nextInt((int)(gameField.getWidth() - gameField.getWidth()/4)+SCRN_MARGIN); 
     bY = r.nextInt((int)(gameField.getHeight() - gameField.getHeight()/4)+SCRN_MARGIN); 

     //place the new ball in the gameField 
    //print the values being passed to the sprite constrcutor for debug purposes. The out put of this line indicates that all is well at this point.    
System.out.println("Ball: " + x + " X: " + bX+ " Y: " + (bY+SCRN_MARGIN) + " Color: " + color.toString()); 
     gSprite.add(new Sprite((float)bX, (float)bY+SCRN_MARGIN, BALL_SIZE, color)); 

    } 
    //Now that the sprites are added to this list print out the list. When this line executes it shows a list of NUM_BALLS all of which have the exact sdame vlaues as the last sprite added earlier. 
    for (int x = 0; x < gSprite.size(); x++){ 
     Sprite spr = gSprite.get(x); 

    System.out.println("Ball: " + x + " X: " + spr.getX()+ " Y: " + spr.getY() + " vX: " + spr.getvX() + " vY: " + spr.getvY() + " Color: " + spr.getColor().toString()); 
    } 

} 
+4

"このコードは動作していて、突然停止しました" ...何を変更しましたか?コードは決して*停止する*魔法のように動作します。 – talnicolas

+0

例外がある場合はスタックトレースを追加してください... – Crazenezz

+0

このコードを実行するたびにコンソールには何が出力されますか? –

答えて

0
bX = r.nextInt((int)(gameField.getWidth() - gameField.getWidth()/4)+SCRN_MARGIN); 

あなたが浮くために整数を代入しようとしています。これを確認してください。数値が切り上げられて問題が発生している可能性があります。

+0

私はこのコードをチェックし、鋳造しています。まだdidn ' – ACantrell

0

Spriteクラスのhashcodeおよびの実装をチェックする必要があります。彼らはSpriteの関連フィールドを考慮する必要があるので、2つの異なるものが同じハッシュコードを返さないか、equalsに対してtrueを返します。私はあなたがデフォルトの実装(例えば、それを上書きしない)を使用している場合にはうまくいくと思いますが、確実に実装してください。日食ではSourceGenerate hashCode() and equals()を選択できます。これは実際にArrayListを使用している場合でも問題ありません(コードには表示されません)。

浮動小数点数を整数に変換する際に問題になる可能性があることに私は同意します。たぶんあなたは毎回同じものを手に入れているように見えますか?

また、あなたは(...そして期待通りにも動作可能)第二のループは次のように書き換えることができたJava 5のenhanced for-loopを使用する必要があります。

int x = 0; 
for (Sprite spr : gSprite){ 
    System.out.println("Ball: " + x + " X: " + spr.getX()+ " Y: " + spr.getY() + " vX: " + spr.getvX() + " vY: " + spr.getvY() + " Color: " + spr.getColor().toString()); 
    x++; 
} 

そして、最後ではなく、少なくとも、 4つのifsの代わりに実際にswitch/caseを使用する必要があります。これは実際にあなたの問題を助けることはありませんが、それはちょうど悪いスタイルです。見てみましょう:ところで

switch (colorValue) { 
     case 0: 
      color = Color.BLUE; 
      break; 
     case 1: 
      color = Color.RED; 
      break; 
     case 2: 
      color = Color.YELLOW; 
      break; 
     case 3: 
      color = Color.GREEN; 
      break; 
     default: 
      throw new RuntimeException("Unexpected color!"); 
} 

:パターンのこの種のEnumMapを使用してのような他のアプローチがあります。私はちょうどswitch/caseを使用して1つのロジックビットメリットのために2つ以上のifsを持つと思います。もちろん、デフォルトのケースは不十分に処理され、洗練が必要です。

ああ、もう1つのこと:メソッド名は小文字/ラクテルケースにする必要があります。基本的に、すべてのJavaプログラマは、それをこの方法で除いています。

+0

アドバイスのおかげで私は通常、これはかなり粗いコードであるこれらの基準に従っています、私はもっと最終的なものに変換してきました。問題は、基本的に、このメソッドがリストスプライトに追加している項目です。それは5つのスプライトをこのリストに追加し、それらはすべて一意であるように見えますが、後でリストにアクセスすると、最後にスプライトの値がリストに追加されます...私は途中でそれを動揺させる何かをした知っているが、私は何をしたのか分からない。私はおそらく私はそれを乱さ始める前に、それのコピーを作成しておく必要があります。 – ACantrell

関連する問題