0

私は困惑しており、これを見るために別の目が必要です。このコードは機能していましたが、突然機能しなくなりました。基本的に、arraylist にオブジェクトを追加しています。リストを作成しているときは、それを見て、反復ごとに一意のオブジェクトを追加しているようです。基本的には、画面に表示されるスプライトと、その x、y 座標、色、および速度です。以前はこれが機能し、スプライトが画面上に散らばって表示されていましたが、リストに最後に追加されたオブジェクトを複製しているように見えます。ループを X 回実行すると、同じオブジェクトになります。意味がありません...

最初の println ステートメントは、コンストラクターに渡される内容を出力します。したがって、そのように出力されます。

ボール: 1 x: 123 y:344 色: 青 ボール: 2 x: 3 y 233 色: 緑 ボール 3 x: 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

2 に答える 2

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

float に整数を代入しようとしています。これを確認してください。数値の切り上げが原因で問題が発生している可能性があります

于 2012-05-09T03:15:33.863 に答える
0

hashcodeクラスのequals実装を確認する必要があり ますSpriteSprite2 つの異なるフィールドが同じハッシュコードを返したり、等しい場合に true を返したりしないように、関連するフィールドを考慮する必要があります。デフォルトの実装を使用している場合(たとえば、オーバーライドしていない場合)は機能すると思いますが、確実に実装してください。SourceEclipse では、 →を選択できますGenerate hashCode() and equals()。ただし、実際に使用している場合は問題ArrayListになりません (コードには表示されません)。

浮動小数点数を整数に変換する際の問題である可能性があるという@Sanketに同意します。たぶん、毎回同じものを取得しているように見えますか?

また、enhanced for-loopJava 5 の を使用する必要があります。2 番目のループは次のように書き直すことができます (その場合、期待どおりに動作する可能性もあります...)。

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

switch/case最後になりましたが、4 つの if の代わりに実際に使用する必要があります。これは実際には問題の解決にはなりませんが、スタイルが悪いだけです。見てみましょう:

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!");
}

ところで:この種のパターンには、Enumまたはを使用するなどの他のアプローチがあります。Map1 つの論理ビットに対して 2 つ以上の if を使用するメリットがあると思いますswitch/case。もちろん、デフォルトのケースはうまく処理されず、改良が必要です。

ああ、もう1つ: メソッド名は小文字/キャメルケースで書くべきです。基本的に、すべての Java プログラマーはこの方法を除きます。

于 2012-05-09T07:11:54.503 に答える